diff options
author | Thorsten Kukuk <kukuk@suse.com> | 2023-03-07 10:30:50 +0100 |
---|---|---|
committer | Craig Small <csmall@dropbear.xyz> | 2023-03-21 22:26:03 +1100 |
commit | 6d5d4d28040ca12d7ba673b7de0b62b0d7b9e9d0 (patch) | |
tree | 35813edfb7423e6ced0237cd4c5fec55a5774316 | |
parent | 1f910eeb0ed608c2c91ed615352c5a9d25f01866 (diff) | |
download | procps-ng-6d5d4d28040ca12d7ba673b7de0b62b0d7b9e9d0.tar.gz |
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 <kukuk@suse.com>
-rw-r--r-- | library/uptime.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/library/uptime.c b/library/uptime.c index 16f1b05..bb9344a 100644 --- a/library/uptime.c +++ b/library/uptime.c @@ -31,6 +31,12 @@ #include <time.h> #include <unistd.h> #include <utmp.h> +#ifdef WITH_SYSTEMD +#include <systemd/sd-login.h> +#endif +#ifdef WITH_ELOGIND +#include <elogind/sd-login.h> +#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; } - |