From 6d5d4d28040ca12d7ba673b7de0b62b0d7b9e9d0 Mon Sep 17 00:00:00 2001 From: Thorsten Kukuk Date: Tue, 7 Mar 2023 10:30:50 +0100 Subject: [PATCH] library: use sd_get_sessions() instead of utmp The utmp format of glibc is not Y2038 safe, not even on 64bit systems. Query logind/elogind for the number of users if we use libsystemd. Signed-off-by: Thorsten Kukuk --- library/uptime.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/library/uptime.c b/library/uptime.c index 16f1b05d..bb9344a2 100644 --- a/library/uptime.c +++ b/library/uptime.c @@ -31,6 +31,12 @@ #include #include #include +#ifdef WITH_SYSTEMD +#include +#endif +#ifdef WITH_ELOGIND +#include +#endif #include "misc.h" #include "procps-private.h" @@ -45,6 +51,13 @@ static int count_users(void) int numuser = 0; struct utmp *ut; +#if defined(WITH_SYSTEMD) || defined(WITH_ELOGIND) + numuser = sd_get_sessions(NULL); + + if (numuser >= 0 || numuser != ENOENT) + return numuser; +#endif + setutent(); while ((ut = getutent())) { if ((ut->ut_type == USER_PROCESS) && (ut->ut_name[0] != '\0')) @@ -136,8 +149,13 @@ PROCPS_EXPORT char *procps_uptime_sprint(void) users = count_users(); procps_loadavg(&av1, &av5, &av15); - pos += sprintf(upbuf + pos, "%2d %s, load average: %.2f, %.2f, %.2f", - users, users > 1 ? "users" : "user", + if (users < 0) + pos += sprintf(upbuf + pos, " ? "); + else + pos += sprintf(upbuf + pos, "%2d ", users); + + pos += sprintf(upbuf + pos, "%s, load average: %.2f, %.2f, %.2f", + users > 1 ? "users" : "user", av1, av5, av15); return upbuf; @@ -248,4 +266,3 @@ PROCPS_EXPORT char *procps_uptime_sprint_short(void) } return shortbuf; } -