X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Floginctl.c;h=5f3221eee884fb39db0bdf59f2902a765a3f5718;hb=d9e34bfda3d34dcde00a876cb052e7de0655e1cb;hp=2aedbcf9225c6cc14458ac7319592b3500f0109a;hpb=5b30bef856e89a571df57b7b953e9a1409d9aced;p=elogind.git diff --git a/src/login/loginctl.c b/src/login/loginctl.c index 2aedbcf92..5f3221eee 100644 --- a/src/login/loginctl.c +++ b/src/login/loginctl.c @@ -251,7 +251,7 @@ typedef struct SessionStatusInfo { uid_t uid; const char *name; usec_t timestamp; - int vtnr; + unsigned int vtnr; const char *seat; const char *tty; const char *display; @@ -346,7 +346,7 @@ static int prop_map_sessions_strv(sd_bus *bus, const char *member, sd_bus_messag return sd_bus_message_exit_container(m); } -static int print_session_status_info(sd_bus *bus, const char *path) { +static int print_session_status_info(sd_bus *bus, const char *path, bool *new_line) { static const struct bus_properties_map map[] = { { "Id", "s", NULL, offsetof(SessionStatusInfo, id) }, @@ -375,8 +375,15 @@ static int print_session_status_info(sd_bus *bus, const char *path) { int r; r = bus_map_all_properties(bus, "org.freedesktop.login1", path, map, &i); - if (r < 0) + if (r < 0) { + log_error("Could not get properties: %s", strerror(-r)); return r; + } + + if (*new_line) + printf("\n"); + + *new_line = true; printf("%s - ", strna(i.id)); @@ -457,7 +464,7 @@ static int print_session_status_info(sd_bus *bus, const char *path) { return 0; } -static int print_user_status_info(sd_bus *bus, const char *path) { +static int print_user_status_info(sd_bus *bus, const char *path, bool *new_line) { static const struct bus_properties_map map[] = { { "Name", "s", NULL, offsetof(UserStatusInfo, name) }, @@ -476,8 +483,15 @@ static int print_user_status_info(sd_bus *bus, const char *path) { int r; r = bus_map_all_properties(bus, "org.freedesktop.login1", path, map, &i); - if (r < 0) + if (r < 0) { + log_error("Could not get properties: %s", strerror(-r)); goto finish; + } + + if (*new_line) + printf("\n"); + + *new_line = true; if (i.name) printf("%s (%u)\n", i.name, (unsigned) i.uid); @@ -517,10 +531,10 @@ static int print_user_status_info(sd_bus *bus, const char *path) { finish: strv_free(i.sessions); - return 0; + return r; } -static int print_seat_status_info(sd_bus *bus, const char *path) { +static int print_seat_status_info(sd_bus *bus, const char *path, bool *new_line) { static const struct bus_properties_map map[] = { { "Id", "s", NULL, offsetof(SeatStatusInfo, id) }, @@ -533,8 +547,15 @@ static int print_seat_status_info(sd_bus *bus, const char *path) { int r; r = bus_map_all_properties(bus, "org.freedesktop.login1", path, map, &i); - if (r < 0) + if (r < 0) { + log_error("Could not get properties: %s", strerror(-r)); goto finish; + } + + if (*new_line) + printf("\n"); + + *new_line = true; printf("%s\n", strna(i.id)); @@ -569,29 +590,40 @@ static int print_seat_status_info(sd_bus *bus, const char *path) { finish: strv_free(i.sessions); - return 0; + return r; +} + +static int show_properties(sd_bus *bus, const char *path, bool *new_line) { + int r; + + if (*new_line) + printf("\n"); + + *new_line = true; + + r = bus_print_all_properties(bus, "org.freedesktop.login1", path, arg_property, arg_all); + if (r < 0) + log_error("Could not get properties: %s", strerror(-r)); + + return r; } static int show_session(sd_bus *bus, char **args, unsigned n) { - bool show_properties; + bool properties, new_line = false; unsigned i; int r; assert(bus); assert(args); - show_properties = !strstr(args[0], "status"); + properties = !strstr(args[0], "status"); pager_open_if_enabled(); - if (show_properties && n <= 1) { + if (properties && n <= 1) { /* If not argument is specified inspect the manager * itself */ - r = bus_print_all_properties(bus, "org.freedesktop.login1", "/org/freedesktop/login1", NULL, arg_all); - if (r < 0) - log_error("Failed to query login manager."); - - return r; + return show_properties(bus, "/org/freedesktop/login1", &new_line); } for (i = 1; i < n; i++) { @@ -599,9 +631,6 @@ static int show_session(sd_bus *bus, char **args, unsigned n) { _cleanup_bus_message_unref_ sd_bus_message * reply = NULL; const char *path = NULL; - if (i != 1) - printf("\n"); - r = sd_bus_call_method( bus, "org.freedesktop.login1", @@ -619,39 +648,34 @@ static int show_session(sd_bus *bus, char **args, unsigned n) { if (r < 0) return bus_log_parse_error(r); - if (show_properties) - r = bus_print_all_properties(bus, "org.freedesktop.login1", path, NULL, arg_all); + if (properties) + r = show_properties(bus, path, &new_line); else - r = print_session_status_info(bus, path); - if (r < 0) { - log_error("Failed to query session: %s", strerror(-r)); + r = print_session_status_info(bus, path, &new_line); + + if (r < 0) return r; - } } return 0; } static int show_user(sd_bus *bus, char **args, unsigned n) { - bool show_properties; + bool properties, new_line = false; unsigned i; int r; assert(bus); assert(args); - show_properties = !strstr(args[0], "status"); + properties = !strstr(args[0], "status"); pager_open_if_enabled(); - if (show_properties && n <= 1) { + if (properties && n <= 1) { /* If not argument is specified inspect the manager * itself */ - r = bus_print_all_properties(bus, "org.freedesktop.login1", "/org/freedesktop/login1", NULL, arg_all); - if (r < 0) - log_error("Failed to query login manager."); - - return r; + return show_properties(bus, "/org/freedesktop/login1", &new_line); } for (i = 1; i < n; i++) { @@ -660,9 +684,6 @@ static int show_user(sd_bus *bus, char **args, unsigned n) { const char *path = NULL; uid_t uid; - if (i != 1) - printf("\n"); - r = get_user_creds((const char**) (args+i), &uid, NULL, NULL, NULL); if (r < 0) { log_error("Failed to look up user %s: %s", args[i], strerror(-r)); @@ -686,39 +707,34 @@ static int show_user(sd_bus *bus, char **args, unsigned n) { if (r < 0) return bus_log_parse_error(r); - if (show_properties) - r = bus_print_all_properties(bus, "org.freedesktop.login1", path, NULL, arg_all); + if (properties) + r = show_properties(bus, path, &new_line); else - r = print_user_status_info(bus, path); - if (r < 0) { - log_error("Failed to query user: %s", strerror(-r)); + r = print_user_status_info(bus, path, &new_line); + + if (r < 0) return r; - } } return 0; } static int show_seat(sd_bus *bus, char **args, unsigned n) { - bool show_properties; + bool properties, new_line = false; unsigned i; int r; assert(bus); assert(args); - show_properties = !strstr(args[0], "status"); + properties = !strstr(args[0], "status"); pager_open_if_enabled(); - if (show_properties && n <= 1) { + if (properties && n <= 1) { /* If not argument is specified inspect the manager * itself */ - r = bus_print_all_properties(bus, "org.freedesktop.login1", "/org/freedesktop/login1", NULL, arg_all); - if (r < 0) - log_error("Failed to query login manager."); - - return r; + return show_properties(bus, "/org/freedesktop/login1", &new_line); } for (i = 1; i < n; i++) { @@ -726,9 +742,6 @@ static int show_seat(sd_bus *bus, char **args, unsigned n) { _cleanup_bus_message_unref_ sd_bus_message * reply = NULL; const char *path = NULL; - if (i != 1) - printf("\n"); - r = sd_bus_call_method( bus, "org.freedesktop.login1", @@ -746,14 +759,13 @@ static int show_seat(sd_bus *bus, char **args, unsigned n) { if (r < 0) return bus_log_parse_error(r); - if (show_properties) - r = bus_print_all_properties(bus, "org.freedesktop.login1", path, NULL, arg_all); + if (properties) + r = show_properties(bus, path, &new_line); else - r = print_seat_status_info(bus, path); - if (r < 0) { - log_error("Failed to query seat: %s", strerror(-r)); + r = print_seat_status_info(bus, path, &new_line); + + if (r < 0) return r; - } } return 0; @@ -1037,29 +1049,29 @@ static int help(void) { " --kill-who=WHO Who to send signal to\n" " -s --signal=SIGNAL Which signal to send\n\n" "Commands:\n" - " list-sessions List sessions\n" - " session-status [ID...] Show session status\n" - " show-session [ID...] Show properties of one or more sessions\n" - " activate [ID] Activate a session\n" - " lock-session [ID...] Screen lock one or more sessions\n" - " unlock-session [ID...] Screen unlock one or more sessions\n" - " lock-sessions Screen lock all current sessions\n" - " unlock-sessions Screen unlock all current sessions\n" - " terminate-session [ID...] Terminate one or more sessions\n" - " kill-session [ID...] Send signal to processes of a session\n" - " list-users List users\n" - " user-status [USER...] Show user status\n" - " show-user [USER...] Show properties of one or more users\n" - " enable-linger [USER...] Enable linger state of one or more users\n" - " disable-linger [USER...] Disable linger state of one or more users\n" - " terminate-user [USER...] Terminate all sessions of one or more users\n" - " kill-user [USER...] Send signal to processes of a user\n" - " list-seats List seats\n" - " seat-status [NAME...] Show seat status\n" - " show-seat [NAME...] Show properties of one or more seats\n" - " attach [NAME] [DEVICE...] Attach one or more devices to a seat\n" - " flush-devices Flush all device associations\n" - " terminate-seat [NAME...] Terminate all sessions on one or more seats\n", + " list-sessions List sessions\n" + " session-status ID... Show session status\n" + " show-session [ID...] Show properties of sessions or the manager\n" + " activate ID Activate a session\n" + " lock-session ID... Screen lock one or more sessions\n" + " unlock-session ID... Screen unlock one or more sessions\n" + " lock-sessions Screen lock all current sessions\n" + " unlock-sessions Screen unlock all current sessions\n" + " terminate-session ID... Terminate one or more sessions\n" + " kill-session ID... Send signal to processes of a session\n" + " list-users List users\n" + " user-status USER... Show user status\n" + " show-user [USER...] Show properties of users or the manager\n" + " enable-linger USER... Enable linger state of one or more users\n" + " disable-linger USER... Disable linger state of one or more users\n" + " terminate-user USER... Terminate all sessions of one or more users\n" + " kill-user USER... Send signal to processes of a user\n" + " list-seats List seats\n" + " seat-status NAME... Show seat status\n" + " show-seat NAME... Show properties of one or more seats\n" + " attach NAME DEVICE... Attach one or more devices to a seat\n" + " flush-devices Flush all device associations\n" + " terminate-seat NAME... Terminate all sessions on one or more seats\n", program_invocation_short_name); return 0; @@ -1089,7 +1101,7 @@ static int parse_argv(int argc, char *argv[]) { {} }; - int c; + int c, r; assert(argc >= 0); assert(argv); @@ -1107,14 +1119,9 @@ static int parse_argv(int argc, char *argv[]) { return 0; case 'p': { - char **l; - - l = strv_append(arg_property, optarg); - if (!l) - return -ENOMEM; - - strv_free(arg_property); - arg_property = l; + r = strv_extend(&arg_property, optarg); + if (r < 0) + return log_oom(); /* If the user asked for a particular * property, show it to him, even if it is