summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThorsten Kukuk <kukuk@suse.com>2023-03-07 10:30:50 +0100
committerCraig Small <csmall@dropbear.xyz>2023-03-21 22:26:03 +1100
commit6d5d4d28040ca12d7ba673b7de0b62b0d7b9e9d0 (patch)
tree35813edfb7423e6ced0237cd4c5fec55a5774316
parent1f910eeb0ed608c2c91ed615352c5a9d25f01866 (diff)
downloadprocps-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.c23
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;
}
-