X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flogin%2Floginctl.c;h=97c6617d7d4ef3f131d3e36584acdd6afba7b52b;hp=3ec8057d3bdf3d5cbdc5f7d7ca873babfd5b492a;hb=c846716a5a0c12eb9c7aa566da4666c50cdf2eba;hpb=b69d29ce049f12d463a589e18561dd10ee8c09f1;ds=sidebyside diff --git a/src/login/loginctl.c b/src/login/loginctl.c index 3ec8057d3..97c6617d7 100644 --- a/src/login/loginctl.c +++ b/src/login/loginctl.c @@ -87,34 +87,24 @@ static void polkit_agent_open_if_enabled(void) { } static int list_sessions(DBusConnection *bus, char **args, unsigned n) { - DBusMessage *m = NULL, *reply = NULL; - DBusError error; + DBusMessage *reply = NULL; int r; DBusMessageIter iter, sub, sub2; unsigned k = 0; - dbus_error_init(&error); - - assert(bus); - pager_open_if_enabled(); - m = dbus_message_new_method_call( + r = bus_method_call_with_reply ( + bus, "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", - "ListSessions"); - if (!m) { - log_error("Could not allocate message."); - return -ENOMEM; - } - - reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); - if (!reply) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - r = -EIO; + "ListSessions", + &reply, + NULL, + DBUS_TYPE_INVALID); + if (r) goto finish; - } if (!dbus_message_iter_init(reply, &iter) || dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY || @@ -164,46 +154,31 @@ static int list_sessions(DBusConnection *bus, char **args, unsigned n) { r = 0; finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); - dbus_error_free(&error); - return r; } static int list_users(DBusConnection *bus, char **args, unsigned n) { - DBusMessage *m = NULL, *reply = NULL; - DBusError error; + DBusMessage *reply = NULL; int r; DBusMessageIter iter, sub, sub2; unsigned k = 0; - dbus_error_init(&error); - - assert(bus); - pager_open_if_enabled(); - m = dbus_message_new_method_call( + r = bus_method_call_with_reply ( + bus, "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", - "ListUsers"); - if (!m) { - log_error("Could not allocate message."); - return -ENOMEM; - } - - reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); - if (!reply) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - r = -EIO; - goto finish; - } + "ListUsers", + &reply, + NULL, + DBUS_TYPE_INVALID); + if (r) + goto finish; if (!dbus_message_iter_init(reply, &iter) || dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY || @@ -251,46 +226,31 @@ static int list_users(DBusConnection *bus, char **args, unsigned n) { r = 0; finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); - dbus_error_free(&error); - return r; } static int list_seats(DBusConnection *bus, char **args, unsigned n) { - DBusMessage *m = NULL, *reply = NULL; - DBusError error; + DBusMessage *reply = NULL; int r; DBusMessageIter iter, sub, sub2; unsigned k = 0; - dbus_error_init(&error); - - assert(bus); - pager_open_if_enabled(); - m = dbus_message_new_method_call( + r = bus_method_call_with_reply ( + bus, "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", - "ListSeats"); - if (!m) { - log_error("Could not allocate message."); - return -ENOMEM; - } - - reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); - if (!reply) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - r = -EIO; + "ListSeats", + &reply, + NULL, + DBUS_TYPE_INVALID); + if (r) goto finish; - } if (!dbus_message_iter_init(reply, &iter) || dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY || @@ -336,14 +296,9 @@ static int list_seats(DBusConnection *bus, char **args, unsigned n) { r = 0; finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); - dbus_error_free(&error); - return r; } @@ -364,7 +319,7 @@ typedef struct SessionStatusInfo { pid_t leader; const char *type; const char *class; - bool active; + const char *state; } SessionStatusInfo; typedef struct UserStatusInfo { @@ -458,8 +413,8 @@ static void print_session_status_info(SessionStatusInfo *i) { } else if (i->class) printf("\t Class: %s\n", i->class); - - printf("\t Active: %s\n", yes_no(i->active)); + if (i->state) + printf("\t State: %s\n", i->state); if (i->default_control_group) { unsigned c; @@ -597,6 +552,8 @@ static int status_property_session(const char *name, DBusMessageIter *iter, Sess i->type = s; else if (streq(name, "Class")) i->class = s; + else if (streq(name, "State")) + i->state = s; } break; } @@ -621,8 +578,6 @@ static int status_property_session(const char *name, DBusMessageIter *iter, Sess if (streq(name, "Remote")) i->remote = b; - else if (streq(name, "Active")) - i->active = b; break; } @@ -907,16 +862,14 @@ static int print_property(const char *name, DBusMessageIter *iter) { } static int show_one(const char *verb, DBusConnection *bus, const char *path, bool show_properties, bool *new_line) { - DBusMessage *m = NULL, *reply = NULL; + _cleanup_dbus_message_unref_ DBusMessage *reply = NULL; const char *interface = ""; int r; - DBusError error; DBusMessageIter iter, sub, sub2, sub3; SessionStatusInfo session_info; UserStatusInfo user_info; SeatStatusInfo seat_info; - assert(bus); assert(path); assert(new_line); @@ -924,33 +877,18 @@ static int show_one(const char *verb, DBusConnection *bus, const char *path, boo zero(user_info); zero(seat_info); - dbus_error_init(&error); - - m = dbus_message_new_method_call( + r = bus_method_call_with_reply( + bus, "org.freedesktop.login1", path, "org.freedesktop.DBus.Properties", - "GetAll"); - if (!m) { - log_error("Could not allocate message."); - r = -ENOMEM; - goto finish; - } - - if (!dbus_message_append_args(m, - DBUS_TYPE_STRING, &interface, - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - r = -ENOMEM; - goto finish; - } - - reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); - if (!reply) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - r = -EIO; + "GetAll", + &reply, + NULL, + DBUS_TYPE_STRING, &interface, + DBUS_TYPE_INVALID); + if (r < 0) goto finish; - } if (!dbus_message_iter_init(reply, &iter) || dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY || @@ -1003,7 +941,6 @@ static int show_one(const char *verb, DBusConnection *bus, const char *path, boo if (r < 0) { log_error("Failed to parse reply."); - r = -EIO; goto finish; } @@ -1019,25 +956,17 @@ static int show_one(const char *verb, DBusConnection *bus, const char *path, boo print_seat_status_info(&seat_info); } - strv_free(seat_info.sessions); - strv_free(user_info.sessions); - r = 0; finish: - if (m) - dbus_message_unref(m); - - if (reply) - dbus_message_unref(reply); - - dbus_error_free(&error); + strv_free(seat_info.sessions); + strv_free(user_info.sessions); return r; } static int show(DBusConnection *bus, char **args, unsigned n) { - DBusMessage *m = NULL, *reply = NULL; + DBusMessage *reply = NULL; int r, ret = 0; DBusError error; unsigned i; @@ -1050,8 +979,7 @@ static int show(DBusConnection *bus, char **args, unsigned n) { show_properties = !strstr(args[0], "status"); - if (show_properties) - pager_open_if_enabled(); + pager_open_if_enabled(); if (show_properties && n <= 1) { /* If not argument is specified inspect the manager @@ -1066,82 +994,53 @@ static int show(DBusConnection *bus, char **args, unsigned n) { if (strstr(args[0], "session")) { - m = dbus_message_new_method_call( + ret = bus_method_call_with_reply ( + bus, "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", - "GetSession"); - if (!m) { - log_error("Could not allocate message."); - ret = -ENOMEM; - goto finish; - } - - if (!dbus_message_append_args(m, - DBUS_TYPE_STRING, &args[i], - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - ret = -ENOMEM; - goto finish; - } + "GetSession", + &reply, + NULL, + DBUS_TYPE_STRING, &args[i], + DBUS_TYPE_INVALID); } else if (strstr(args[0], "user")) { uid_t uid; uint32_t u; - ret = get_user_creds((const char**) (args+i), &uid, NULL, NULL); + ret = get_user_creds((const char**) (args+i), &uid, NULL, NULL, NULL); if (ret < 0) { log_error("User %s unknown.", args[i]); goto finish; } - m = dbus_message_new_method_call( + u = (uint32_t) uid; + ret = bus_method_call_with_reply ( + bus, "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", - "GetUser"); - if (!m) { - log_error("Could not allocate message."); - ret = -ENOMEM; - goto finish; - } - - u = (uint32_t) uid; - if (!dbus_message_append_args(m, - DBUS_TYPE_UINT32, &u, - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - ret = -ENOMEM; - goto finish; - } + "GetUser", + &reply, + NULL, + DBUS_TYPE_UINT32, &u, + DBUS_TYPE_INVALID); } else { - m = dbus_message_new_method_call( + ret = bus_method_call_with_reply ( + bus, "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", - "GetSeat"); - if (!m) { - log_error("Could not allocate message."); - ret = -ENOMEM; - goto finish; - } - - if (!dbus_message_append_args(m, - DBUS_TYPE_STRING, &args[i], - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - ret = -ENOMEM; - goto finish; - } + "GetSeat", + &reply, + NULL, + DBUS_TYPE_STRING, &args[i], + DBUS_TYPE_INVALID); } - - reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); - if (!reply) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - ret = -EIO; + if (ret) goto finish; - } if (!dbus_message_get_args(reply, &error, DBUS_TYPE_OBJECT_PATH, &path, @@ -1155,15 +1054,11 @@ static int show(DBusConnection *bus, char **args, unsigned n) { if (r != 0) ret = r; - dbus_message_unref(m); dbus_message_unref(reply); - m = reply = NULL; + reply = NULL; } finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); @@ -1173,488 +1068,265 @@ finish: } static int activate(DBusConnection *bus, char **args, unsigned n) { - DBusMessage *m = NULL; int ret = 0; - DBusError error; unsigned i; - assert(bus); assert(args); - dbus_error_init(&error); - for (i = 1; i < n; i++) { - DBusMessage *reply; - m = dbus_message_new_method_call( + ret = bus_method_call_with_reply ( + bus, "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", streq(args[0], "lock-session") ? "LockSession" : streq(args[0], "unlock-session") ? "UnlockSession" : streq(args[0], "terminate-session") ? "TerminateSession" : - "ActivateSession"); - if (!m) { - log_error("Could not allocate message."); - ret = -ENOMEM; - goto finish; - } - - if (!dbus_message_append_args(m, - DBUS_TYPE_STRING, &args[i], - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - ret = -ENOMEM; - goto finish; - } - - reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); - if (!reply) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - ret = -EIO; + "ActivateSession", + NULL, + NULL, + DBUS_TYPE_STRING, &args[i], + DBUS_TYPE_INVALID); + if (ret) goto finish; - } - - dbus_message_unref(m); - dbus_message_unref(reply); - m = reply = NULL; } finish: - if (m) - dbus_message_unref(m); - - dbus_error_free(&error); - return ret; } static int kill_session(DBusConnection *bus, char **args, unsigned n) { - DBusMessage *m = NULL; int ret = 0; - DBusError error; unsigned i; - assert(bus); assert(args); - dbus_error_init(&error); - if (!arg_kill_who) arg_kill_who = "all"; for (i = 1; i < n; i++) { - DBusMessage *reply; - - m = dbus_message_new_method_call( + ret = bus_method_call_with_reply ( + bus, "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", - "KillSession"); - if (!m) { - log_error("Could not allocate message."); - ret = -ENOMEM; - goto finish; - } - - if (!dbus_message_append_args(m, - DBUS_TYPE_STRING, &args[i], - DBUS_TYPE_STRING, &arg_kill_who, - DBUS_TYPE_INT32, arg_signal, - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - ret = -ENOMEM; + "KillSession", + NULL, + NULL, + DBUS_TYPE_STRING, &args[i], + DBUS_TYPE_STRING, &arg_kill_who, + DBUS_TYPE_INT32, &arg_signal, + DBUS_TYPE_INVALID); + if (ret) goto finish; - } - - reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); - if (!reply) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - ret = -EIO; - goto finish; - } - - dbus_message_unref(m); - dbus_message_unref(reply); - m = reply = NULL; } finish: - if (m) - dbus_message_unref(m); - - dbus_error_free(&error); - return ret; } static int enable_linger(DBusConnection *bus, char **args, unsigned n) { - DBusMessage *m = NULL; int ret = 0; - DBusError error; unsigned i; dbus_bool_t b, interactive = true; - assert(bus); assert(args); - dbus_error_init(&error); - polkit_agent_open_if_enabled(); b = streq(args[0], "enable-linger"); for (i = 1; i < n; i++) { - DBusMessage *reply; uint32_t u; uid_t uid; - m = dbus_message_new_method_call( - "org.freedesktop.login1", - "/org/freedesktop/login1", - "org.freedesktop.login1.Manager", - "SetUserLinger"); - if (!m) { - log_error("Could not allocate message."); - ret = -ENOMEM; - goto finish; - } - - ret = get_user_creds((const char**) (args+i), &uid, NULL, NULL); + ret = get_user_creds((const char**) (args+i), &uid, NULL, NULL, NULL); if (ret < 0) { log_error("Failed to resolve user %s: %s", args[i], strerror(-ret)); goto finish; } u = (uint32_t) uid; - if (!dbus_message_append_args(m, - DBUS_TYPE_UINT32, &u, - DBUS_TYPE_BOOLEAN, &b, - DBUS_TYPE_BOOLEAN, &interactive, - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - ret = -ENOMEM; - goto finish; - } - - reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); - if (!reply) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - ret = -EIO; + ret = bus_method_call_with_reply ( + bus, + "org.freedesktop.login1", + "/org/freedesktop/login1", + "org.freedesktop.login1.Manager", + "SetUserLinger", + NULL, + NULL, + DBUS_TYPE_UINT32, &u, + DBUS_TYPE_BOOLEAN, &b, + DBUS_TYPE_BOOLEAN, &interactive, + DBUS_TYPE_INVALID); + if (ret) goto finish; - } - - dbus_message_unref(m); - dbus_message_unref(reply); - m = reply = NULL; } - ret = 0; - finish: - if (m) - dbus_message_unref(m); - - dbus_error_free(&error); - return ret; } static int terminate_user(DBusConnection *bus, char **args, unsigned n) { - DBusMessage *m = NULL; int ret = 0; - DBusError error; unsigned i; - assert(bus); assert(args); - dbus_error_init(&error); - for (i = 1; i < n; i++) { uint32_t u; uid_t uid; - DBusMessage *reply; - - m = dbus_message_new_method_call( - "org.freedesktop.login1", - "/org/freedesktop/login1", - "org.freedesktop.login1.Manager", - "TerminateUser"); - if (!m) { - log_error("Could not allocate message."); - ret = -ENOMEM; - goto finish; - } - ret = get_user_creds((const char**) (args+i), &uid, NULL, NULL); + ret = get_user_creds((const char**) (args+i), &uid, NULL, NULL, NULL); if (ret < 0) { log_error("Failed to look up user %s: %s", args[i], strerror(-ret)); goto finish; } u = (uint32_t) uid; - if (!dbus_message_append_args(m, - DBUS_TYPE_UINT32, &u, - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - ret = -ENOMEM; - goto finish; - } - - reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); - if (!reply) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - ret = -EIO; + ret = bus_method_call_with_reply ( + bus, + "org.freedesktop.login1", + "/org/freedesktop/login1", + "org.freedesktop.login1.Manager", + "TerminateUser", + NULL, + NULL, + DBUS_TYPE_UINT32, &u, + DBUS_TYPE_INVALID); + if (ret) goto finish; - } - - dbus_message_unref(m); - dbus_message_unref(reply); - m = reply = NULL; } - ret = 0; - finish: - if (m) - dbus_message_unref(m); - - dbus_error_free(&error); - return ret; } static int kill_user(DBusConnection *bus, char **args, unsigned n) { - DBusMessage *m = NULL; int ret = 0; - DBusError error; unsigned i; - assert(bus); assert(args); - dbus_error_init(&error); - if (!arg_kill_who) arg_kill_who = "all"; for (i = 1; i < n; i++) { - DBusMessage *reply; uid_t uid; uint32_t u; - m = dbus_message_new_method_call( - "org.freedesktop.login1", - "/org/freedesktop/login1", - "org.freedesktop.login1.Manager", - "KillUser"); - if (!m) { - log_error("Could not allocate message."); - ret = -ENOMEM; - goto finish; - } - - ret = get_user_creds((const char**) (args+i), &uid, NULL, NULL); + ret = get_user_creds((const char**) (args+i), &uid, NULL, NULL, NULL); if (ret < 0) { log_error("Failed to look up user %s: %s", args[i], strerror(-ret)); goto finish; } u = (uint32_t) uid; - if (!dbus_message_append_args(m, - DBUS_TYPE_UINT32, &u, - DBUS_TYPE_INT32, arg_signal, - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - ret = -ENOMEM; - goto finish; - } - - reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); - if (!reply) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - ret = -EIO; + ret = bus_method_call_with_reply ( + bus, + "org.freedesktop.login1", + "/org/freedesktop/login1", + "org.freedesktop.login1.Manager", + "KillUser", + NULL, + NULL, + DBUS_TYPE_UINT32, &u, + DBUS_TYPE_INT32, &arg_signal, + DBUS_TYPE_INVALID); + if (ret) goto finish; - } - - dbus_message_unref(m); - dbus_message_unref(reply); - m = reply = NULL; } - ret = 0; - finish: - if (m) - dbus_message_unref(m); - - dbus_error_free(&error); - return ret; } static int attach(DBusConnection *bus, char **args, unsigned n) { - DBusMessage *m = NULL; int ret = 0; - DBusError error; unsigned i; dbus_bool_t interactive = true; - assert(bus); assert(args); - dbus_error_init(&error); - polkit_agent_open_if_enabled(); for (i = 2; i < n; i++) { - DBusMessage *reply; - - m = dbus_message_new_method_call( + ret = bus_method_call_with_reply ( + bus, "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", - "AttachDevice"); - if (!m) { - log_error("Could not allocate message."); - ret = -ENOMEM; - goto finish; - } - - if (!dbus_message_append_args(m, - DBUS_TYPE_STRING, &args[1], - DBUS_TYPE_STRING, &args[i], - DBUS_TYPE_BOOLEAN, &interactive, - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - ret = -ENOMEM; - goto finish; - } - - reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); - if (!reply) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - ret = -EIO; + "AttachDevice", + NULL, + NULL, + DBUS_TYPE_STRING, &args[1], + DBUS_TYPE_STRING, &args[i], + DBUS_TYPE_BOOLEAN, &interactive, + DBUS_TYPE_INVALID); + if (ret) goto finish; - } - - dbus_message_unref(m); - dbus_message_unref(reply); - m = reply = NULL; } finish: - if (m) - dbus_message_unref(m); - - dbus_error_free(&error); - return ret; } static int flush_devices(DBusConnection *bus, char **args, unsigned n) { - DBusMessage *m = NULL, *reply = NULL; - int ret = 0; - DBusError error; dbus_bool_t interactive = true; - assert(bus); assert(args); - dbus_error_init(&error); - polkit_agent_open_if_enabled(); - m = dbus_message_new_method_call( + return bus_method_call_with_reply ( + bus, "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", - "FlushDevices"); - if (!m) { - log_error("Could not allocate message."); - ret = -ENOMEM; - goto finish; - } - - if (!dbus_message_append_args(m, - DBUS_TYPE_BOOLEAN, &interactive, - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - ret = -ENOMEM; - goto finish; - } - - reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); - if (!reply) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - ret = -EIO; - goto finish; - } - -finish: - if (m) - dbus_message_unref(m); - - if (reply) - dbus_message_unref(reply); + "FlushDevices", + NULL, + NULL, + DBUS_TYPE_BOOLEAN, &interactive, + DBUS_TYPE_INVALID); +} - dbus_error_free(&error); +static int lock_sessions(DBusConnection *bus, char **args, unsigned n) { + polkit_agent_open_if_enabled(); - return ret; + return bus_method_call_with_reply ( + bus, + "org.freedesktop.login1", + "/org/freedesktop/login1", + "org.freedesktop.login1.Manager", + "LockSessions", + NULL, + NULL, + DBUS_TYPE_INVALID); } static int terminate_seat(DBusConnection *bus, char **args, unsigned n) { - DBusMessage *m = NULL; int ret = 0; - DBusError error; unsigned i; - assert(bus); assert(args); - dbus_error_init(&error); - for (i = 1; i < n; i++) { - DBusMessage *reply; - - m = dbus_message_new_method_call( + ret = bus_method_call_with_reply ( + bus, "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", - "TerminateSeat"); - if (!m) { - log_error("Could not allocate message."); - ret = -ENOMEM; - goto finish; - } - - if (!dbus_message_append_args(m, - DBUS_TYPE_STRING, &args[i], - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - ret = -ENOMEM; - goto finish; - } - - reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); - if (!reply) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - ret = -EIO; + "TerminateSeat", + NULL, + NULL, + DBUS_TYPE_STRING, &args[i], + DBUS_TYPE_INVALID); + if (ret) goto finish; - } - - dbus_message_unref(m); - dbus_message_unref(reply); - m = reply = NULL; } finish: - if (m) - dbus_message_unref(m); - - dbus_error_free(&error); - return ret; } @@ -1662,16 +1334,16 @@ static int 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" - " -p --property=NAME Show only properties by this name\n" - " -a --all Show all properties, including empty ones\n" - " --kill-who=WHO Who to send signal to\n" - " -s --signal=SIGNAL Which signal to send\n" - " -H --host=[USER@]HOST\n" - " Show information for remote host\n" - " -P --privileged Acquire privileges before execution\n" - " --no-pager Do not pipe output into a pager\n\n" + " -h --help Show this help\n" + " --version Show package version\n" + " -p --property=NAME Show only properties by this name\n" + " -a --all Show all properties, including empty ones\n" + " --kill-who=WHO Who to send signal to\n" + " -s --signal=SIGNAL Which signal to send\n" + " --no-ask-password Don't prompt for password\n" + " -H --host=[USER@]HOST Show information for remote host\n" + " -P --privileged Acquire privileges before execution\n" + " --no-pager Do not pipe output into a pager\n\n" "Commands:\n" " list-sessions List sessions\n" " session-status [ID...] Show session status\n" @@ -1679,6 +1351,7 @@ static int help(void) { " 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" " 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" @@ -1709,17 +1382,17 @@ static int parse_argv(int argc, char *argv[]) { }; static const struct option options[] = { - { "help", no_argument, NULL, 'h' }, - { "version", no_argument, NULL, ARG_VERSION }, - { "property", required_argument, NULL, 'p' }, - { "all", no_argument, NULL, 'a' }, - { "no-pager", no_argument, NULL, ARG_NO_PAGER }, - { "kill-who", required_argument, NULL, ARG_KILL_WHO }, - { "signal", required_argument, NULL, 's' }, - { "host", required_argument, NULL, 'H' }, - { "privileged",no_argument, NULL, 'P' }, - { "no-ask-password", no_argument, NULL, ARG_NO_ASK_PASSWORD }, - { NULL, 0, NULL, 0 } + { "help", no_argument, NULL, 'h' }, + { "version", no_argument, NULL, ARG_VERSION }, + { "property", required_argument, NULL, 'p' }, + { "all", no_argument, NULL, 'a' }, + { "no-pager", no_argument, NULL, ARG_NO_PAGER }, + { "kill-who", required_argument, NULL, ARG_KILL_WHO }, + { "signal", required_argument, NULL, 's' }, + { "host", required_argument, NULL, 'H' }, + { "privileged", no_argument, NULL, 'P' }, + { "no-ask-password", no_argument, NULL, ARG_NO_ASK_PASSWORD }, + { NULL, 0, NULL, 0 } }; int c; @@ -1768,6 +1441,7 @@ static int parse_argv(int argc, char *argv[]) { case ARG_NO_ASK_PASSWORD: arg_ask_password = false; + break; case ARG_KILL_WHO: arg_kill_who = optarg; @@ -1820,6 +1494,7 @@ static int loginctl_main(DBusConnection *bus, int argc, char *argv[], DBusError { "activate", EQUAL, 2, activate }, { "lock-session", MORE, 2, activate }, { "unlock-session", MORE, 2, activate }, + { "lock-sessions", EQUAL, 1, lock_sessions }, { "terminate-session", MORE, 2, activate }, { "kill-session", MORE, 2, kill_session }, { "list-users", EQUAL, 1, list_users },