chiark / gitweb /
use correct format types
[elogind.git] / src / login / loginctl.c
index 5f3221eee884fb39db0bdf59f2902a765a3f5718..6881edb7e4447d810c17f54dff2de16c65b849e5 100644 (file)
@@ -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 {
@@ -356,6 +364,7 @@ static int print_session_status_info(sd_bus *bus, const char *path, bool *new_li
                 { "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, bool *new_li
                 { "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) },
                 {}
         };
 
@@ -375,10 +384,8 @@ static int print_session_status_info(sd_bus *bus, const char *path, bool *new_li
         int r;
 
         r = bus_map_all_properties(bus, "org.freedesktop.login1", path, map, &i);
-        if (r < 0) {
-                log_error("Could not get properties: %s", strerror(-r));
-                return r;
-        }
+        if (r < 0)
+                return log_error_errno(r, "Could not get properties: %m");
 
         if (*new_line)
                 printf("\n");
@@ -412,11 +419,11 @@ static int print_session_status_info(sd_bus *bus, const char *path, bool *new_li
                 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");
         }
@@ -446,13 +453,18 @@ static int print_session_status_info(sd_bus *bus, const char *path, bool *new_li
 
                 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);
 
@@ -484,7 +496,7 @@ static int print_user_status_info(sd_bus *bus, const char *path, bool *new_line)
 
         r = bus_map_all_properties(bus, "org.freedesktop.login1", path, map, &i);
         if (r < 0) {
-                log_error("Could not get properties: %s", strerror(-r));
+                log_error_errno(r, "Could not get properties: %m");
                 goto finish;
         }
 
@@ -548,7 +560,7 @@ static int print_seat_status_info(sd_bus *bus, const char *path, bool *new_line)
 
         r = bus_map_all_properties(bus, "org.freedesktop.login1", path, map, &i);
         if (r < 0) {
-                log_error("Could not get properties: %s", strerror(-r));
+                log_error_errno(r, "Could not get properties: %m");
                 goto finish;
         }
 
@@ -603,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;
 }
@@ -685,10 +697,8 @@ static int show_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,
@@ -845,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,
@@ -878,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,
@@ -914,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,
@@ -1033,13 +1037,13 @@ 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-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"
@@ -1071,10 +1075,8 @@ static int help(void) {
                "  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[]) {
@@ -1082,6 +1084,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,
         };
@@ -1093,6 +1096,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'                 },
@@ -1106,12 +1110,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);
@@ -1142,6 +1147,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;
@@ -1174,7 +1183,6 @@ static int parse_argv(int argc, char *argv[]) {
                 default:
                         assert_not_reached("Unhandled option");
                 }
-        }
 
         return 1;
 }
@@ -1277,7 +1285,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, "");
@@ -1290,7 +1298,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;
         }