64 lines
1.7 KiB
Diff
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"));
|
|
|