| utmp() may not be configured in and use posix compliant utmpx always |
| UTMP is SVID legacy, UTMPX is mandated by POSIX |
| |
| Upstream-Status: Pending |
| Signed-off-by: Khem Raj <raj.khem@gmail.com> |
| Index: Linux-PAM-1.2.1/libpam/pam_modutil_getlogin.c |
| =================================================================== |
| --- Linux-PAM-1.2.1.orig/libpam/pam_modutil_getlogin.c |
| +++ Linux-PAM-1.2.1/libpam/pam_modutil_getlogin.c |
| @@ -10,8 +10,7 @@ |
| |
| #include <stdlib.h> |
| #include <unistd.h> |
| -#include <utmp.h> |
| - |
| +#include <utmpx.h> |
| #define _PAMMODUTIL_GETLOGIN "_pammodutil_getlogin" |
| |
| const char * |
| @@ -22,7 +21,7 @@ pam_modutil_getlogin(pam_handle_t *pamh) |
| 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 +47,10 @@ pam_modutil_getlogin(pam_handle_t *pamh) |
| } |
| 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 +73,7 @@ pam_modutil_getlogin(pam_handle_t *pamh) |
| |
| clean_up_and_go_home: |
| |
| - endutent(); |
| + endutxent(); |
| |
| return logname; |
| } |
| Index: Linux-PAM-1.2.1/modules/pam_issue/pam_issue.c |
| =================================================================== |
| --- Linux-PAM-1.2.1.orig/modules/pam_issue/pam_issue.c |
| +++ Linux-PAM-1.2.1/modules/pam_issue/pam_issue.c |
| @@ -25,7 +25,7 @@ |
| #include <string.h> |
| #include <unistd.h> |
| #include <sys/utsname.h> |
| -#include <utmp.h> |
| +#include <utmpx.h> |
| #include <time.h> |
| #include <syslog.h> |
| |
| @@ -246,13 +246,13 @@ read_issue_quoted(pam_handle_t *pamh, FI |
| case 'U': |
| { |
| unsigned int users = 0; |
| - struct utmp *ut; |
| - setutent(); |
| - while ((ut = getutent())) { |
| + struct utmpx *ut; |
| + setutxent(); |
| + while ((ut = getutxent())) { |
| if (ut->ut_type == USER_PROCESS) |
| ++users; |
| } |
| - endutent(); |
| + endutxent(); |
| if (c == 'U') |
| snprintf (buf, sizeof buf, "%u %s", users, |
| (users == 1) ? "user" : "users"); |
| Index: Linux-PAM-1.2.1/modules/pam_lastlog/pam_lastlog.c |
| =================================================================== |
| --- Linux-PAM-1.2.1.orig/modules/pam_lastlog/pam_lastlog.c |
| +++ Linux-PAM-1.2.1/modules/pam_lastlog/pam_lastlog.c |
| @@ -15,8 +15,9 @@ |
| #include <errno.h> |
| #ifdef HAVE_UTMP_H |
| # include <utmp.h> |
| -#else |
| -# include <lastlog.h> |
| +#endif |
| +#ifdef HAVE_UTMPX_H |
| +# include <utmpx.h> |
| #endif |
| #include <pwd.h> |
| #include <stdlib.h> |
| @@ -27,6 +28,12 @@ |
| #include <syslog.h> |
| #include <unistd.h> |
| |
| +#ifndef HAVE_UTMP_H |
| +#define UT_LINESIZE 32 |
| +#define UT_HOSTSIZE 32 |
| +#define UT_NAMESIZE 256 |
| +#endif |
| + |
| #if defined(hpux) || defined(sunos) || defined(solaris) |
| # ifndef _PATH_LASTLOG |
| # define _PATH_LASTLOG "/usr/adm/lastlog" |
| @@ -38,7 +45,7 @@ |
| # define UT_LINESIZE 12 |
| # endif /* UT_LINESIZE */ |
| #endif |
| -#if defined(hpux) |
| +#if defined(hpux) || !defined HAVE_UTMP_H |
| struct lastlog { |
| time_t ll_time; |
| char ll_line[UT_LINESIZE]; |
| @@ -447,8 +454,8 @@ last_login_failed(pam_handle_t *pamh, in |
| { |
| int retval; |
| int fd; |
| - struct utmp ut; |
| - struct utmp utuser; |
| + struct utmpx ut; |
| + struct utmpx utuser; |
| int failed = 0; |
| char the_time[256]; |
| char *date = NULL; |
| Index: Linux-PAM-1.2.1/modules/pam_limits/pam_limits.c |
| =================================================================== |
| --- Linux-PAM-1.2.1.orig/modules/pam_limits/pam_limits.c |
| +++ Linux-PAM-1.2.1/modules/pam_limits/pam_limits.c |
| @@ -33,7 +33,7 @@ |
| #include <sys/resource.h> |
| #include <limits.h> |
| #include <glob.h> |
| -#include <utmp.h> |
| +#include <utmpx.h> |
| #ifndef UT_USER /* some systems have ut_name instead of ut_user */ |
| #define UT_USER ut_user |
| #endif |
| @@ -227,7 +227,7 @@ static int |
| check_logins (pam_handle_t *pamh, const char *name, int limit, int ctrl, |
| struct pam_limit_s *pl) |
| { |
| - struct utmp *ut; |
| + struct utmpx *ut; |
| int count; |
| |
| if (ctrl & PAM_DEBUG_ARG) { |
| @@ -242,7 +242,7 @@ check_logins (pam_handle_t *pamh, const |
| return LOGIN_ERR; |
| } |
| |
| - setutent(); |
| + setutxent(); |
| |
| /* Because there is no definition about when an application |
| actually adds a utmp entry, some applications bizarrely do the |
| @@ -260,7 +260,7 @@ check_logins (pam_handle_t *pamh, const |
| count = 1; |
| } |
| |
| - while((ut = getutent())) { |
| + while((ut = getutxent())) { |
| #ifdef USER_PROCESS |
| if (ut->ut_type != USER_PROCESS) { |
| continue; |
| @@ -296,7 +296,7 @@ check_logins (pam_handle_t *pamh, const |
| break; |
| } |
| } |
| - endutent(); |
| + endutxent(); |
| if (count > limit) { |
| if (name) { |
| pam_syslog(pamh, LOG_WARNING, |
| Index: Linux-PAM-1.2.1/modules/pam_timestamp/pam_timestamp.c |
| =================================================================== |
| --- Linux-PAM-1.2.1.orig/modules/pam_timestamp/pam_timestamp.c |
| +++ Linux-PAM-1.2.1/modules/pam_timestamp/pam_timestamp.c |
| @@ -56,7 +56,7 @@ |
| #include <time.h> |
| #include <sys/time.h> |
| #include <unistd.h> |
| -#include <utmp.h> |
| +#include <utmpx.h> |
| #include <syslog.h> |
| #include <paths.h> |
| #include "hmacsha1.h" |
| @@ -197,15 +197,15 @@ timestamp_good(time_t then, time_t now, |
| static int |
| check_login_time(const char *ruser, time_t timestamp) |
| { |
| - struct utmp utbuf, *ut; |
| + struct utmpx utbuf, *ut; |
| time_t oldest_login = 0; |
| |
| - setutent(); |
| + setutxent(); |
| while( |
| #ifdef HAVE_GETUTENT_R |
| - !getutent_r(&utbuf, &ut) |
| + !getutxent_r(&utbuf, &ut) |
| #else |
| - (ut = getutent()) != NULL |
| + (ut = getutxent()) != NULL |
| #endif |
| ) { |
| if (ut->ut_type != USER_PROCESS) { |
| @@ -218,7 +218,7 @@ check_login_time(const char *ruser, time |
| oldest_login = ut->ut_tv.tv_sec; |
| } |
| } |
| - endutent(); |
| + endutxent(); |
| if(oldest_login == 0 || timestamp < oldest_login) { |
| return PAM_AUTH_ERR; |
| } |
| Index: Linux-PAM-1.2.1/modules/pam_unix/support.c |
| =================================================================== |
| --- Linux-PAM-1.2.1.orig/modules/pam_unix/support.c |
| +++ Linux-PAM-1.2.1/modules/pam_unix/support.c |
| @@ -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> |