From 3c1fed7d650c35b11a452e5005abcfb90f126667 Mon Sep 17 00:00:00 2001 From: "A. Wilcox" Date: Sat, 16 Jun 2018 02:26:53 -0500 Subject: [PATCH] w: Use POSIX functions where available has been deprecated since 2001 in favour of . On glibc systems, utmp is just an alias to utmpx, so there is no functional change using one over the other. However, on the musl libc, a library (utmps) can be used to provide utmpx functionality - but not utmp. This means that procps either doesn't work properly (`w` shows nothing under musl with default no-op implementation), or fails to build (utmps provides utmpx.h but no utmp.h). This commit will use utmpx.h where available, which allows `w` to work correctly with utmps and has no change on glibc systems. --- configure.ac | 2 +- w.c | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index f29fc064..ebd94c27 100644 --- a/configure.ac +++ b/configure.ac @@ -51,7 +51,7 @@ else fi # Checks for header files. AC_HEADER_MAJOR -AC_CHECK_HEADERS([arpa/inet.h fcntl.h float.h langinfo.h libintl.h limits.h locale.h netinet/in.h stdint.h stdio_ext.h stdlib.h string.h sys/file.h sys/ioctl.h sys/param.h sys/time.h termios.h unistd.h utmp.h values.h wchar.h wctype.h]) +AC_CHECK_HEADERS([arpa/inet.h fcntl.h float.h langinfo.h libintl.h limits.h locale.h netinet/in.h stdint.h stdio_ext.h stdlib.h string.h sys/file.h sys/ioctl.h sys/param.h sys/time.h termios.h unistd.h utmp.h utmpx.h values.h wchar.h wctype.h]) # Checks for typedefs, structures, and compiler characteristics. AC_CHECK_HEADER_STDBOOL diff --git a/w.c b/w.c index 35710a3a..9d07ac9e 100644 --- a/w.c +++ b/w.c @@ -23,6 +23,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "config.h" #include "c.h" #include "fileutils.h" #include "nls.h" @@ -54,14 +55,28 @@ #include #include #include -#include +#ifdef HAVE_UTMPX_H +# include +#else +# include +#endif #include static int ignoreuser = 0; /* for '-u' */ static int oldstyle = 0; /* for '-o' */ static proc_t **procs; /* our snapshot of the process table */ +#ifdef HAVE_UTMPX_H +typedef struct utmpx utmp_t; +#else typedef struct utmp utmp_t; +#endif + +#if !defined(UT_HOSTSIZE) || defined(__UT_HOSTSIZE) +# define UT_HOSTSIZE __UT_HOSTSIZE +# define UT_LINESIZE __UT_LINESIZE +# define UT_NAMESIZE __UT_NAMESIZE +#endif #ifdef W_SHOWFROM # define FROM_STRING "on" @@ -412,7 +427,11 @@ static void showinfo(utmp_t * u, int formtype, int maxcmd, int from, printf("%-*.*s%-9.8s", userlen + 1, userlen, uname, u->ut_line); if (from) print_from(u, ip_addresses, fromlen); +#ifdef HAVE_UTMPX_H + print_logintime(u->ut_tv.tv_sec, stdout); +#else print_logintime(u->ut_time, stdout); +#endif if (*u->ut_line == ':') /* idle unknown for xdm logins */ printf(" ?xdm? "); @@ -604,11 +623,19 @@ int main(int argc, char **argv) printf(_(" IDLE WHAT\n")); } +#ifdef HAVE_UTMPX_H + setutxent(); +#else utmpname(UTMP_FILE); setutent(); +#endif if (user) { for (;;) { +#ifdef HAVE_UTMPX_H + u = getutxent(); +#else u = getutent(); +#endif if (unlikely(!u)) break; if (u->ut_type != USER_PROCESS) @@ -619,7 +646,11 @@ int main(int argc, char **argv) } } else { for (;;) { +#ifdef HAVE_UTMPX_H + u = getutxent(); +#else u = getutent(); +#endif if (unlikely(!u)) break; if (u->ut_type != USER_PROCESS) @@ -629,7 +660,11 @@ int main(int argc, char **argv) fromlen, ip_addresses); } } +#ifdef HAVE_UTMPX_H + endutxent(); +#else endutent(); +#endif return EXIT_SUCCESS; }