--- Linux-PAM-1.3.1/libpam/pam_modutil_getlogin.c.old 2017-02-10 04:10:15.000000000 -0600 +++ Linux-PAM-1.3.1/libpam/pam_modutil_getlogin.c 2018-06-15 19:45:00.100036938 -0500 @@ -10,7 +10,7 @@ #include <stdlib.h> #include <unistd.h> -#include <utmp.h> +#include <utmpx.h> #define _PAMMODUTIL_GETLOGIN "_pammodutil_getlogin" @@ -22,7 +22,7 @@ const void *void_curr_tty; const char *curr_tty; char *curr_user; - struct utmp *ut, line; + struct utmpx *ut, line; status = pam_get_data(pamh, _PAMMODUTIL_GETLOGIN, &logname); if (status == PAM_SUCCESS) { @@ -48,10 +48,10 @@ } logname = NULL; - setutent(); + setutxent(); strncpy(line.ut_line, curr_tty, sizeof(line.ut_line)); - if ((ut = getutline(&line)) == NULL) { + if ((ut = getutxline(&line)) == NULL) { goto clean_up_and_go_home; } @@ -74,7 +74,7 @@ clean_up_and_go_home: - endutent(); + endutxent(); return logname; } --- Linux-PAM-1.3.1/modules/pam_issue/pam_issue.c.old 2017-02-10 04:10:15.000000000 -0600 +++ Linux-PAM-1.3.1/modules/pam_issue/pam_issue.c 2018-06-15 19:53:16.459545509 -0500 @@ -25,7 +25,13 @@ #include <string.h> #include <unistd.h> #include <sys/utsname.h> -#include <utmp.h> +#if defined(HAVE_UTMPX_H) +# include <utmpx.h> +#elif defined(HAVE_UTMP_H) +# include <utmp.h> +#else +# error You must have either utmpx.h or utmp.h. +#endif #include <time.h> #include <syslog.h> @@ -246,6 +252,15 @@ case 'U': { unsigned int users = 0; +#if defined(HAVE_UTMPX_H) + struct utmpx *utx; + setutxent(); + while ((utx = getutxent())) { + if (utx->ut_type == USER_PROCESS) + ++users; + } + endutxent(); +#elif defined(HAVE_UTMP_H) struct utmp *ut; setutent(); while ((ut = getutent())) { @@ -253,6 +268,7 @@ ++users; } endutent(); +#endif if (c == 'U') snprintf (buf, sizeof buf, "%u %s", users, (users == 1) ? "user" : "users"); --- Linux-PAM-1.3.1/modules/pam_lastlog/pam_lastlog.c.old 2018-06-15 19:48:06.379852509 -0500 +++ Linux-PAM-1.3.1/modules/pam_lastlog/pam_lastlog.c 2018-06-15 19:57:18.849305527 -0500 @@ -14,7 +14,10 @@ #include <fcntl.h> #include <time.h> #include <errno.h> +#ifdef HAVE_UTMPX_H +# include <utmpx.h> +#endif #ifdef HAVE_UTMP_H # include <utmp.h> #else # include <lastlog.h> @@ -448,8 +451,13 @@ { int retval; int fd; +#ifdef HAVE_UTMPX_H + struct utmpx ut; + struct utmpx utuser; +#else struct utmp ut; struct utmp utuser; +#endif int failed = 0; char the_time[256]; char *date = NULL; --- Linux-PAM-1.3.1/modules/pam_limits/pam_limits.c.old 2017-02-10 04:10:15.000000000 -0600 +++ Linux-PAM-1.3.1/modules/pam_limits/pam_limits.c 2018-06-15 20:25:21.737639355 -0500 @@ -33,7 +33,11 @@ #include <sys/resource.h> #include <limits.h> #include <glob.h> -#include <utmp.h> +#ifdef HAVE_UTMPX_H +# include <utmpx.h> +#else +# include <utmp.h> +#endif #ifndef UT_USER /* some systems have ut_name instead of ut_user */ #define UT_USER ut_user #endif @@ -227,7 +231,11 @@ check_logins (pam_handle_t *pamh, const char *name, int limit, int ctrl, struct pam_limit_s *pl) { +#ifdef HAVE_UTMPX_H + struct utmpx *ut; +#else struct utmp *ut; +#endif int count; if (ctrl & PAM_DEBUG_ARG) { @@ -242,12 +250,16 @@ return LOGIN_ERR; } +#ifdef HAVE_UTMPX_H + setutxent(); +#else setutent(); +#endif /* Because there is no definition about when an application actually adds a utmp entry, some applications bizarrely do the - utmp call before the have PAM authenticate them to the system: - you're logged it, sort of...? Anyway, you can use the + utmp call before they have PAM authenticate them to the system: + you're logged in, sort of...? Anyway, you can use the "utmp_early" module argument in your PAM config file to make allowances for this sort of problem. (There should be a PAM standard for this, since if a module wants to actually map a @@ -260,7 +272,11 @@ count = 1; } +#ifdef HAVE_UTMPX_H + while((ut = getutxent())) { +#else while((ut = getutent())) { +#endif #ifdef USER_PROCESS if (ut->ut_type != USER_PROCESS) { continue; @@ -296,7 +312,11 @@ break; } } +#ifdef HAVE_UTMPX_H + endutxent(); +#else endutent(); +#endif if (count > limit) { if (name) { pam_syslog(pamh, LOG_NOTICE, --- Linux-PAM-1.3.1/modules/pam_timestamp/pam_timestamp.c.old 2017-02-10 04:10:15.000000000 -0600 +++ Linux-PAM-1.3.1/modules/pam_timestamp/pam_timestamp.c 2018-06-15 20:34:52.997073770 -0500 @@ -56,7 +56,11 @@ #include <time.h> #include <sys/time.h> #include <unistd.h> -#include <utmp.h> +#ifdef HAVE_UTMPX_H +# include <utmpx.h> +#else +# include <utmp.h> +#endif #include <syslog.h> #include <paths.h> #include "hmacsha1.h" @@ -197,12 +201,22 @@ static int check_login_time(const char *ruser, time_t timestamp) { +#ifdef HAVE_UTMPX_H + struct utmpx utbuf, *ut; +#else struct utmp utbuf, *ut; +#endif time_t oldest_login = 0; +#ifdef HAVE_UTMPX_H + setutxent(); +#else setutent(); +#endif while( -#ifdef HAVE_GETUTENT_R +#ifdef HAVE_UTMPX_H + (ut = getutxent()) != NULL +#elif defined(HAVE_GETUTENT_R) !getutent_r(&utbuf, &ut) #else (ut = getutent()) != NULL @@ -218,7 +232,11 @@ oldest_login = ut->ut_tv.tv_sec; } } +#ifdef HAVE_UTMPX_H + endutxent(); +#else endutent(); +#endif if(oldest_login == 0 || timestamp < oldest_login) { return PAM_AUTH_ERR; } --- Linux-PAM-1.3.1/modules/pam_unix/support.c.old 2017-02-10 04:10:15.000000000 -0600 +++ Linux-PAM-1.3.1/modules/pam_unix/support.c 2018-06-15 20:38:23.306865549 -0500 @@ -13,7 +13,6 @@ #include <pwd.h> #include <shadow.h> #include <limits.h> -#include <utmp.h> #include <errno.h> #include <signal.h> #include <ctype.h>