procps-ng/uptime-w-user-sessions-only.patch
2026-05-19 19:41:01 -04:00

64 lines
1.7 KiB
Diff

diff --git a/library/uptime.c b/library/uptime.c
index 1826343..d63bde7 100644
--- a/library/uptime.c
+++ b/library/uptime.c
@@ -54,8 +54,31 @@ static int count_users(void)
struct utmp *ut;
#if defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)
- if (sd_booted() > 0)
- return sd_get_sessions(NULL);
+ char **sessions_list;
+ int sessions;
+
+ numuser = 0;
+
+ sessions = sd_get_sessions(&sessions_list);
+
+ if (sessions > 0) {
+ int i;
+
+ for (i = 0; i < sessions; i++) {
+ char *class;
+
+ if (sd_session_get_class(sessions_list[i], &class) < 0)
+ continue;
+
+ if (strncmp(class, "user", 4) == 0) // user, user-early, user-incomplete
+ numuser++;
+ free(class);
+ }
+ for (i = 0; i < sessions; i++)
+ free(sessions_list[i]);
+ free(sessions_list);
+ return numuser;
+ }
#endif
setutent();
diff --git a/src/w.c b/src/w.c
index fd6e75f..c7bd214 100644
--- a/src/w.c
+++ b/src/w.c
@@ -814,11 +814,18 @@ int main(int argc, char **argv)
if (sessions < 0 && sessions != -ENOENT)
error(EXIT_FAILURE, -sessions, _("error getting sessions"));
- if (sessions >= 0) {
+ if (sessions > 0) {
for (int i = 0; i < sessions; i++) {
- char *name;
+ char *class, *name;
int r;
+ if ((r = sd_session_get_class(sessions_list[i], &class)) < 0)
+ error(EXIT_FAILURE, -r, _("session get class failed"));
+ if (strncmp(class, "user", 4) != 0) { // user, user-early, user-incomplete
+ free(class);
+ continue;
+ }
+ free(class);
if ((r = sd_session_get_username(sessions_list[i], &name)) < 0)
error(EXIT_FAILURE, -r, _("get user name failed"));