w: Use POSIX <utmpx.h> functions where available

<utmp.h> has been deprecated since 2001 in favour of <utmpx.h>.

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.
This commit is contained in:
A. Wilcox 2018-06-16 02:26:53 -05:00 committed by Craig Small
parent bf92199ccb
commit 3c1fed7d65
2 changed files with 37 additions and 2 deletions

View File

@ -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

37
w.c
View File

@ -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 <termios.h>
#include <time.h>
#include <unistd.h>
#include <utmp.h>
#ifdef HAVE_UTMPX_H
# include <utmpx.h>
#else
# include <utmp.h>
#endif
#include <arpa/inet.h>
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;
}