diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2023-05-17 01:41:13 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-17 01:41:13 +0900 |
commit | 871a41f0ef60cc33528dc249cb1358d0f3c1a3bc (patch) | |
tree | 2d41bfd1a065c9f63b26da74bd879e17ea6deccc /src | |
parent | 8c7dd49ad1c936bfff8f976f61cfcb7037c48103 (diff) | |
parent | 306ff2e29798f571fba573577abaeb812f7e3166 (diff) | |
download | systemd-871a41f0ef60cc33528dc249cb1358d0f3c1a3bc.tar.gz |
Merge pull request #27606 from YHNdnzj/loginctl-list-show-state
loginctl: list-{users,sessions}: add a column for showing state
Diffstat (limited to 'src')
-rw-r--r-- | src/login/loginctl.c | 93 |
1 files changed, 68 insertions, 25 deletions
diff --git a/src/login/loginctl.c b/src/login/loginctl.c index a2d03a9e64..dfc738c6d0 100644 --- a/src/login/loginctl.c +++ b/src/login/loginctl.c @@ -133,7 +133,7 @@ static int list_sessions(int argc, char *argv[], void *userdata) { if (r < 0) return bus_log_parse_error(r); - table = table_new("session", "uid", "user", "seat", "tty"); + table = table_new("session", "uid", "user", "seat", "tty", "state"); if (!table) return log_oom(); @@ -142,9 +142,9 @@ static int list_sessions(int argc, char *argv[], void *userdata) { (void) table_set_align_percent(table, TABLE_HEADER_CELL(1), 100); for (;;) { - _cleanup_(sd_bus_error_free) sd_bus_error error_tty = SD_BUS_ERROR_NULL; - _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply_tty = NULL; - const char *id, *user, *seat, *object, *tty = NULL; + _cleanup_(sd_bus_error_free) sd_bus_error error_property = SD_BUS_ERROR_NULL; + _cleanup_free_ char *tty = NULL, *state = NULL; + const char *id, *user, *seat, *object; uint32_t uid; r = sd_bus_message_read(reply, "(susso)", &id, &uid, &user, &seat, &object); @@ -153,21 +153,38 @@ static int list_sessions(int argc, char *argv[], void *userdata) { if (r == 0) break; - r = sd_bus_get_property( - bus, - "org.freedesktop.login1", - object, - "org.freedesktop.login1.Session", - "TTY", - &error_tty, - &reply_tty, - "s"); - if (r < 0) - log_warning_errno(r, "Failed to get TTY for session %s: %s", id, bus_error_message(&error_tty, r)); - else { - r = sd_bus_message_read(reply_tty, "s", &tty); - if (r < 0) - return bus_log_parse_error(r); + r = sd_bus_get_property_string(bus, + "org.freedesktop.login1", + object, + "org.freedesktop.login1.Session", + "TTY", + &error_property, + &tty); + if (r < 0) { + if (sd_bus_error_has_name(&error_property, SD_BUS_ERROR_UNKNOWN_OBJECT)) + /* The session is already closed when we're querying the property */ + continue; + + log_warning_errno(r, "Failed to get TTY for session %s, ignoring: %s", + id, bus_error_message(&error_property, r)); + + sd_bus_error_free(&error_property); + } + + r = sd_bus_get_property_string(bus, + "org.freedesktop.login1", + object, + "org.freedesktop.login1.Session", + "State", + &error_property, + &state); + if (r < 0) { + if (sd_bus_error_has_name(&error_property, SD_BUS_ERROR_UNKNOWN_OBJECT)) + /* The session is already closed when we're querying the property */ + continue; + + return log_error_errno(r, "Failed to get state for session %s: %s", + id, bus_error_message(&error_property, r)); } r = table_add_many(table, @@ -175,7 +192,8 @@ static int list_sessions(int argc, char *argv[], void *userdata) { TABLE_UID, (uid_t) uid, TABLE_STRING, user, TABLE_STRING, seat, - TABLE_STRING, strna(tty)); + TABLE_STRING, strna(tty), + TABLE_STRING, state); if (r < 0) return table_log_add_error(r); } @@ -206,13 +224,15 @@ static int list_users(int argc, char *argv[], void *userdata) { if (r < 0) return bus_log_parse_error(r); - table = table_new("uid", "user", "linger"); + table = table_new("uid", "user", "linger", "state"); if (!table) return log_oom(); (void) table_set_align_percent(table, TABLE_HEADER_CELL(0), 100); for (;;) { + _cleanup_(sd_bus_error_free) sd_bus_error error_property = SD_BUS_ERROR_NULL; + _cleanup_free_ char *state = NULL; const char *user, *object; uint32_t uid; int linger; @@ -228,16 +248,39 @@ static int list_users(int argc, char *argv[], void *userdata) { object, "org.freedesktop.login1.User", "Linger", - &error, + &error_property, 'b', &linger); - if (r < 0) - return log_error_errno(r, "Failed to get linger status: %s", bus_error_message(&error, r)); + if (r < 0) { + if (sd_bus_error_has_name(&error_property, SD_BUS_ERROR_UNKNOWN_OBJECT)) + /* The user logged out when we're querying the property */ + continue; + + return log_error_errno(r, "Failed to get linger status for user %s: %s", + user, bus_error_message(&error_property, r)); + } + + r = sd_bus_get_property_string(bus, + "org.freedesktop.login1", + object, + "org.freedesktop.login1.User", + "State", + &error_property, + &state); + if (r < 0) { + if (sd_bus_error_has_name(&error_property, SD_BUS_ERROR_UNKNOWN_OBJECT)) + /* The user logged out when we're querying the property */ + continue; + + return log_error_errno(r, "Failed to get state for user %s: %s", + user, bus_error_message(&error_property, r)); + } r = table_add_many(table, TABLE_UID, (uid_t) uid, TABLE_STRING, user, - TABLE_BOOLEAN, linger); + TABLE_BOOLEAN, linger, + TABLE_STRING, state); if (r < 0) return table_log_add_error(r); } |