X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Floginctl.c;h=cc275445174d46010e1324ed78f89b890e90c7db;hb=1a4873c499aa01478ee2e3b9c0bc967a961d7645;hp=01df99920e96d92fa6af62e15b72db0ea748693d;hpb=97aa7b478177f200d250dc0186f49e52b5f6e3c8;p=elogind.git diff --git a/src/login/loginctl.c b/src/login/loginctl.c index 01df99920..cc2754451 100644 --- a/src/login/loginctl.c +++ b/src/login/loginctl.c @@ -45,6 +45,7 @@ static char **arg_property = NULL; static bool arg_all = false; static bool arg_full = false; static bool arg_no_pager = false; +static bool arg_legend = true; static const char *arg_kill_who = NULL; static int arg_signal = SIGTERM; static BusTransport arg_transport = BUS_TRANSPORT_LOCAL; @@ -99,7 +100,8 @@ static int list_sessions(sd_bus *bus, char **args, unsigned n) { if (r < 0) return bus_log_parse_error(r); - printf("%10s %10s %-16s %-16s\n", "SESSION", "UID", "USER", "SEAT"); + if (arg_legend) + printf("%10s %10s %-16s %-16s\n", "SESSION", "UID", "USER", "SEAT"); while ((r = sd_bus_message_read(reply, "(susso)", &id, &uid, &user, &seat, &object)) > 0) { printf("%10s %10u %-16s %-16s\n", id, (unsigned) uid, user, seat); @@ -108,7 +110,8 @@ static int list_sessions(sd_bus *bus, char **args, unsigned n) { if (r < 0) return bus_log_parse_error(r); - printf("\n%u sessions listed.\n", k); + if (arg_legend) + printf("\n%u sessions listed.\n", k); return 0; } @@ -140,7 +143,8 @@ static int list_users(sd_bus *bus, char **args, unsigned n) { if (r < 0) return bus_log_parse_error(r); - printf("%10s %-16s\n", "UID", "USER"); + if (arg_legend) + printf("%10s %-16s\n", "UID", "USER"); while ((r = sd_bus_message_read(reply, "(uso)", &uid, &user, &object)) > 0) { printf("%10u %-16s\n", (unsigned) uid, user); @@ -149,7 +153,8 @@ static int list_users(sd_bus *bus, char **args, unsigned n) { if (r < 0) return bus_log_parse_error(r); - printf("\n%u users listed.\n", k); + if (arg_legend) + printf("\n%u users listed.\n", k); return 0; } @@ -180,7 +185,8 @@ static int list_seats(sd_bus *bus, char **args, unsigned n) { if (r < 0) return bus_log_parse_error(r); - printf("%-16s\n", "SEAT"); + if (arg_legend) + printf("%-16s\n", "SEAT"); while ((r = sd_bus_message_read(reply, "(so)", &seat, &object)) > 0) { printf("%-16s\n", seat); @@ -189,7 +195,8 @@ static int list_seats(sd_bus *bus, char **args, unsigned n) { if (r < 0) return bus_log_parse_error(r); - printf("\n%u seats listed.\n", k); + if (arg_legend) + printf("\n%u seats listed.\n", k); return 0; } @@ -264,6 +271,7 @@ typedef struct SessionStatusInfo { const char *class; const char *state; const char *scope; + const char *desktop; } SessionStatusInfo; typedef struct UserStatusInfo { @@ -346,7 +354,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) }, @@ -356,6 +364,7 @@ static int print_session_status_info(sd_bus *bus, const char *path) { { "RemoteHost", "s", NULL, offsetof(SessionStatusInfo, remote_host) }, { "RemoteUser", "s", NULL, offsetof(SessionStatusInfo, remote_user) }, { "Service", "s", NULL, offsetof(SessionStatusInfo, service) }, + { "Desktop", "s", NULL, offsetof(SessionStatusInfo, desktop) }, { "Type", "s", NULL, offsetof(SessionStatusInfo, type) }, { "Class", "s", NULL, offsetof(SessionStatusInfo, class) }, { "Scope", "s", NULL, offsetof(SessionStatusInfo, scope) }, @@ -365,7 +374,7 @@ static int print_session_status_info(sd_bus *bus, const char *path) { { "Remote", "b", NULL, offsetof(SessionStatusInfo, remote) }, { "Timestamp", "t", NULL, offsetof(SessionStatusInfo, timestamp) }, { "User", "(uo)", prop_map_first_of_struct, offsetof(SessionStatusInfo, uid) }, - { "Seat", "(so)", prop_map_first_of_struct, offsetof(SessionStatusInfo, id) }, + { "Seat", "(so)", prop_map_first_of_struct, offsetof(SessionStatusInfo, seat) }, {} }; @@ -376,7 +385,12 @@ static int print_session_status_info(sd_bus *bus, const char *path) { r = bus_map_all_properties(bus, "org.freedesktop.login1", path, map, &i); if (r < 0) - return r; + return log_error_errno(r, "Could not get properties: %m"); + + if (*new_line) + printf("\n"); + + *new_line = true; printf("%s - ", strna(i.id)); @@ -405,11 +419,11 @@ static int print_session_status_info(sd_bus *bus, const char *path) { printf("\n"); } - if (i.seat) { + if (!isempty(i.seat)) { printf("\t Seat: %s", i.seat); if (i.vtnr > 0) - printf("; vc%i", i.vtnr); + printf("; vc%u", i.vtnr); printf("\n"); } @@ -439,13 +453,18 @@ static int print_session_status_info(sd_bus *bus, const char *path) { printf("\n"); } else if (i.type) { - printf("\t Type: %s\n", i.type); + printf("\t Type: %s", i.type); if (i.class) printf("; class %s", i.class); + + printf("\n"); } else if (i.class) printf("\t Class: %s\n", i.class); + if (!isempty(i.desktop)) + printf("\t Desktop: %s\n", i.desktop); + if (i.state) printf("\t State: %s\n", i.state); @@ -457,7 +476,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 +495,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_errno(r, "Could not get properties: %m"); goto finish; + } + + if (*new_line) + printf("\n"); + + *new_line = true; if (i.name) printf("%s (%u)\n", i.name, (unsigned) i.uid); @@ -517,10 +543,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 +559,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_errno(r, "Could not get properties: %m"); goto finish; + } + + if (*new_line) + printf("\n"); + + *new_line = true; printf("%s\n", strna(i.id)); @@ -569,7 +602,7 @@ 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) { @@ -582,7 +615,7 @@ static int show_properties(sd_bus *bus, const char *path, bool *new_line) { 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)); + log_error_errno(r, "Could not get properties: %m"); return r; } @@ -610,9 +643,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", @@ -633,11 +663,10 @@ static int show_session(sd_bus *bus, char **args, unsigned n) { 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; @@ -667,14 +696,9 @@ 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)); - return r; - } + if (r < 0) + return log_error_errno(r, "Failed to look up user %s: %m", args[i]); r = sd_bus_call_method( bus, @@ -696,11 +720,10 @@ static int show_user(sd_bus *bus, char **args, unsigned n) { 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; @@ -729,9 +752,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", @@ -752,11 +772,10 @@ static int show_seat(sd_bus *bus, char **args, unsigned n) { 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; @@ -836,10 +855,8 @@ static int enable_linger(sd_bus *bus, char **args, unsigned n) { uid_t uid; 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)); - return r; - } + if (r < 0) + return log_error_errno(r, "Failed to look up user %s: %m", args[i]); r = sd_bus_call_method ( bus, @@ -869,10 +886,8 @@ static int terminate_user(sd_bus *bus, char **args, unsigned n) { uid_t uid; 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)); - return r; - } + if (r < 0) + return log_error_errno(r, "Failed to look up user %s: %m", args[i]); r = sd_bus_call_method ( bus, @@ -905,10 +920,8 @@ static int kill_user(sd_bus *bus, char **args, unsigned n) { uid_t uid; 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)); - return r; - } + if (r < 0) + return log_error_errno(r, "Failed to look up user %s: %m", args[i]); r = sd_bus_call_method ( bus, @@ -1024,22 +1037,22 @@ static int terminate_seat(sd_bus *bus, char **args, unsigned n) { return 0; } -static int help(void) { - +static void help(void) { printf("%s [OPTIONS...] {COMMAND} ...\n\n" "Send control commands to or query the login manager.\n\n" - " -h --help Show this help\n" - " --version Show package version\n" - " --no-pager Do not pipe output into a pager\n" - " --no-ask-password Don't prompt for password\n" - " -H --host=[USER@]HOST Operate on remote host\n" - " -M --machine=CONTAINER Operate on local container\n" - " -p --property=NAME Show only properties by this name\n" - " -a --all Show all properties, including empty ones\n" - " -l --full Do not ellipsize output\n" - " --kill-who=WHO Who to send signal to\n" - " -s --signal=SIGNAL Which signal to send\n\n" - "Commands:\n" + " -h --help Show this help\n" + " --version Show package version\n" + " --no-pager Do not pipe output into a pager\n" + " --no-legend Do not show the headers and footers\n" + " --no-ask-password Don't prompt for password\n" + " -H --host=[USER@]HOST Operate on remote host\n" + " -M --machine=CONTAINER Operate on local container\n" + " -p --property=NAME Show only properties by this name\n" + " -a --all Show all properties, including empty ones\n" + " -l --full Do not ellipsize output\n" + " --kill-who=WHO Who to send signal to\n" + " -s --signal=SIGNAL Which signal to send\n\n" + "Session Commands:\n" " list-sessions List sessions\n" " session-status ID... Show session status\n" " show-session [ID...] Show properties of sessions or the manager\n" @@ -1049,23 +1062,23 @@ static int help(void) { " 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" + " kill-session ID... Send signal to processes of a session\n\n" + "User Commands:\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" + " kill-user USER... Send signal to processes of a user\n\n" + "Seat Commands:\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; + " terminate-seat NAME... Terminate all sessions on one or more seats\n" + , program_invocation_short_name); } static int parse_argv(int argc, char *argv[]) { @@ -1073,6 +1086,7 @@ static int parse_argv(int argc, char *argv[]) { enum { ARG_VERSION = 0x100, ARG_NO_PAGER, + ARG_NO_LEGEND, ARG_KILL_WHO, ARG_NO_ASK_PASSWORD, }; @@ -1084,6 +1098,7 @@ static int parse_argv(int argc, char *argv[]) { { "all", no_argument, NULL, 'a' }, { "full", no_argument, NULL, 'l' }, { "no-pager", no_argument, NULL, ARG_NO_PAGER }, + { "no-legend", no_argument, NULL, ARG_NO_LEGEND }, { "kill-who", required_argument, NULL, ARG_KILL_WHO }, { "signal", required_argument, NULL, 's' }, { "host", required_argument, NULL, 'H' }, @@ -1097,12 +1112,13 @@ static int parse_argv(int argc, char *argv[]) { assert(argc >= 0); assert(argv); - while ((c = getopt_long(argc, argv, "hp:als:H:M:", options, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "hp:als:H:M:", options, NULL)) >= 0) switch (c) { case 'h': - return help(); + help(); + return 0; case ARG_VERSION: puts(PACKAGE_STRING); @@ -1133,6 +1149,10 @@ static int parse_argv(int argc, char *argv[]) { arg_no_pager = true; break; + case ARG_NO_LEGEND: + arg_legend = false; + break; + case ARG_NO_ASK_PASSWORD: arg_ask_password = false; break; @@ -1155,7 +1175,7 @@ static int parse_argv(int argc, char *argv[]) { break; case 'M': - arg_transport = BUS_TRANSPORT_CONTAINER; + arg_transport = BUS_TRANSPORT_MACHINE; arg_host = optarg; break; @@ -1165,7 +1185,6 @@ static int parse_argv(int argc, char *argv[]) { default: assert_not_reached("Unhandled option"); } - } return 1; } @@ -1268,7 +1287,7 @@ static int loginctl_main(sd_bus *bus, int argc, char *argv[]) { } int main(int argc, char *argv[]) { - _cleanup_bus_unref_ sd_bus *bus = NULL; + _cleanup_bus_close_unref_ sd_bus *bus = NULL; int r; setlocale(LC_ALL, ""); @@ -1281,7 +1300,7 @@ int main(int argc, char *argv[]) { r = bus_open_transport(arg_transport, arg_host, false, &bus); if (r < 0) { - log_error("Failed to create bus connection: %s", strerror(-r)); + log_error_errno(r, "Failed to create bus connection: %m"); goto finish; }