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;
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);
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;
}
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);
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;
}
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);
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;
}
const char *class;
const char *state;
const char *scope;
+ const char *desktop;
} SessionStatusInfo;
typedef struct UserStatusInfo {
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) },
{ "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) },
{ "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) },
{}
};
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));
printf("\n");
}
- if (i.seat) {
+ if (!isempty(i.seat)) {
printf("\t Seat: %s", i.seat);
if (i.vtnr > 0)
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);
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) },
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);
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) },
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));
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++) {
_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",
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++) {
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));
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++) {
_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",
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;
" -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"
enum {
ARG_VERSION = 0x100,
ARG_NO_PAGER,
+ ARG_NO_LEGEND,
ARG_KILL_WHO,
ARG_NO_ASK_PASSWORD,
};
{ "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' },
arg_no_pager = true;
break;
+ case ARG_NO_LEGEND:
+ arg_legend = false;
+ break;
+
case ARG_NO_ASK_PASSWORD:
arg_ask_password = false;
break;