diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/login/inhibit.c | 69 | ||||
-rw-r--r-- | src/login/loginctl.c | 653 | ||||
-rw-r--r-- | src/login/logind-dbus.c | 31 | ||||
-rw-r--r-- | src/login/logind.c | 47 | ||||
-rw-r--r-- | src/shared/dbus-common.c | 73 | ||||
-rw-r--r-- | src/shared/dbus-common.h | 10 | ||||
-rw-r--r-- | src/systemctl/systemctl.c | 1249 | ||||
-rw-r--r-- | src/update-utmp/update-utmp.c | 118 |
8 files changed, 650 insertions, 1600 deletions
diff --git a/src/login/inhibit.c b/src/login/inhibit.c index 6f24a1b671..029c9549d2 100644 --- a/src/login/inhibit.c +++ b/src/login/inhibit.c @@ -42,73 +42,53 @@ static enum { } arg_action = ACTION_INHIBIT; static int inhibit(DBusConnection *bus, DBusError *error) { - DBusMessage *m = NULL, *reply = NULL; + DBusMessage *reply = NULL; int fd; - assert(bus); - - m = dbus_message_new_method_call( + fd = bus_method_call_with_reply ( + bus, "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", - "Inhibit"); - if (!m) - return -ENOMEM; - - if (!dbus_message_append_args(m, - DBUS_TYPE_STRING, &arg_what, - DBUS_TYPE_STRING, &arg_who, - DBUS_TYPE_STRING, &arg_why, - DBUS_TYPE_STRING, &arg_mode, - DBUS_TYPE_INVALID)) { - fd = -ENOMEM; - goto finish; - } - - reply = dbus_connection_send_with_reply_and_block(bus, m, -1, error); - if (!reply) { - fd = -EIO; - goto finish; - } + "Inhibit", + &reply, + NULL, + DBUS_TYPE_STRING, &arg_what, + DBUS_TYPE_STRING, &arg_who, + DBUS_TYPE_STRING, &arg_why, + DBUS_TYPE_STRING, &arg_mode, + DBUS_TYPE_INVALID); + if (fd) + return fd; if (!dbus_message_get_args(reply, error, DBUS_TYPE_UNIX_FD, &fd, - DBUS_TYPE_INVALID)){ + DBUS_TYPE_INVALID)) fd = -EIO; - goto finish; - } - -finish: - if (m) - dbus_message_unref(m); - if (reply) - dbus_message_unref(reply); + dbus_message_unref(reply); return fd; } static int print_inhibitors(DBusConnection *bus, DBusError *error) { - DBusMessage *m, *reply; + DBusMessage *reply; unsigned n = 0; DBusMessageIter iter, sub, sub2; int r; - assert(bus); - - m = dbus_message_new_method_call( + r = bus_method_call_with_reply ( + bus, "org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", - "ListInhibitors"); - if (!m) + "ListInhibitors", + &reply, + NULL, + DBUS_TYPE_INVALID); + if (r) return -ENOMEM; - - reply = dbus_connection_send_with_reply_and_block(bus, m, -1, error); - if (!reply) { - r = -EIO; goto finish; - } if (!dbus_message_iter_init(reply, &iter)) { r = -ENOMEM; @@ -170,9 +150,6 @@ static int print_inhibitors(DBusConnection *bus, DBusError *error) { r = 0; finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); diff --git a/src/login/loginctl.c b/src/login/loginctl.c index b80b2e6a9f..5ff8ea6810 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; } @@ -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; + 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; + "GetAll", + &reply, + NULL, + DBUS_TYPE_STRING, &interface, + DBUS_TYPE_INVALID); + if (r) 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; - goto finish; - } if (!dbus_message_iter_init(reply, &iter) || dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY || @@ -1025,19 +963,14 @@ static int show_one(const char *verb, DBusConnection *bus, const char *path, boo r = 0; finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); - dbus_error_free(&error); - 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; @@ -1066,24 +999,16 @@ 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; @@ -1095,53 +1020,32 @@ static int show(DBusConnection *bus, char **args, unsigned n) { 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 +1059,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,153 +1073,79 @@ 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; + "ActivateSession", + NULL, + NULL, + DBUS_TYPE_STRING, &args[i], + 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 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, NULL); if (ret < 0) { log_error("Failed to resolve user %s: %s", args[i], strerror(-ret)); @@ -1327,65 +1153,35 @@ static int enable_linger(DBusConnection *bus, char **args, unsigned n) { } 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, NULL); if (ret < 0) { @@ -1394,67 +1190,37 @@ static int terminate_user(DBusConnection *bus, char **args, unsigned n) { } 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, NULL); if (ret < 0) { log_error("Failed to look up user %s: %s", args[i], strerror(-ret)); @@ -1462,241 +1228,110 @@ static int kill_user(DBusConnection *bus, char **args, unsigned n) { } 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); - - dbus_error_free(&error); - - return ret; + "FlushDevices", + NULL, + NULL, + DBUS_TYPE_BOOLEAN, &interactive, + DBUS_TYPE_INVALID); } static int lock_sessions(DBusConnection *bus, char **args, unsigned n) { - DBusMessage *m = NULL, *reply = NULL; - int ret = 0; - DBusError error; - - 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", - "LockSessions"); - if (!m) { - log_error("Could not allocate 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); - - dbus_error_free(&error); - - return ret; + "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; } diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c index 86ca654518..ae9671bb1e 100644 --- a/src/login/logind-dbus.c +++ b/src/login/logind-dbus.c @@ -968,36 +968,21 @@ static int have_multiple_sessions( } static int send_start_unit(DBusConnection *connection, const char *unit_name, DBusError *error) { - DBusMessage *message, *reply; const char *mode = "replace"; - assert(connection); assert(unit_name); - message = dbus_message_new_method_call( + return bus_method_call_with_reply ( + connection, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", - "StartUnit"); - if (!message) - return -ENOMEM; - - if (!dbus_message_append_args(message, - DBUS_TYPE_STRING, &unit_name, - DBUS_TYPE_STRING, &mode, - DBUS_TYPE_INVALID)) { - dbus_message_unref(message); - return -ENOMEM; - } - - reply = dbus_connection_send_with_reply_and_block(connection, message, -1, error); - dbus_message_unref(message); - - if (!reply) - return -EIO; - - dbus_message_unref(reply); - return 0; + "StartUnit", + NULL, + NULL, + DBUS_TYPE_STRING, &unit_name, + DBUS_TYPE_STRING, &mode, + DBUS_TYPE_INVALID); } static int send_prepare_for(Manager *m, InhibitWhat w, bool _active) { diff --git a/src/login/logind.c b/src/login/logind.c index bae9a95f38..229af714f8 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -942,16 +942,12 @@ static int vt_is_busy(int vtnr) { int manager_spawn_autovt(Manager *m, int vtnr) { int r; - DBusMessage *message = NULL, *reply = NULL; char *name = NULL; const char *mode = "fail"; - DBusError error; assert(m); assert(vtnr >= 1); - dbus_error_init(&error); - if ((unsigned) vtnr > m->n_autovts) return 0; @@ -961,47 +957,26 @@ int manager_spawn_autovt(Manager *m, int vtnr) { else if (r > 0) return -EBUSY; - message = dbus_message_new_method_call("org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "StartUnit"); - if (!message) { - log_error("Could not allocate message."); - r = -ENOMEM; - goto finish; - } - if (asprintf(&name, "autovt@tty%i.service", vtnr) < 0) { log_error("Could not allocate service name."); r = -ENOMEM; goto finish; } - - if (!dbus_message_append_args(message, - DBUS_TYPE_STRING, &name, - DBUS_TYPE_STRING, &mode, - DBUS_TYPE_INVALID)) { - log_error("Could not attach target and flag information to message."); - r = -ENOMEM; - goto finish; - } - - reply = dbus_connection_send_with_reply_and_block(m->bus, message, -1, &error); - if (!reply) { - log_error("Failed to start unit: %s", bus_error_message(&error)); - goto finish; - } - - r = 0; + r = bus_method_call_with_reply ( + m->bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "StartUnit", + NULL, + NULL, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_STRING, &mode, + DBUS_TYPE_INVALID); finish: free(name); - if (message) - dbus_message_unref(message); - - if (reply) - dbus_message_unref(reply); - - dbus_error_free(&error); - return r; } diff --git a/src/shared/dbus-common.c b/src/shared/dbus-common.c index 5d64568c34..7f0dce5ad3 100644 --- a/src/shared/dbus-common.c +++ b/src/shared/dbus-common.c @@ -1237,3 +1237,76 @@ finish: return (pid_t) pid; } + +bool bus_error_is_no_service(const DBusError *error) { + assert(error); + + if (!dbus_error_is_set(error)) + return false; + + if (dbus_error_has_name(error, DBUS_ERROR_NAME_HAS_NO_OWNER)) + return true; + + if (dbus_error_has_name(error, DBUS_ERROR_SERVICE_UNKNOWN)) + return true; + + return startswith(error->name, "org.freedesktop.DBus.Error.Spawn."); +} + +int bus_method_call_with_reply(DBusConnection *bus, + const char *destination, + const char *path, + const char *interface, + const char *method, + DBusMessage **return_reply, + DBusError *return_error, + int first_arg_type, ...) { + DBusError error; + DBusMessage *m, *reply; + va_list ap; + int r = 0; + + dbus_error_init(&error); + assert(bus); + + m = dbus_message_new_method_call(destination, path, interface, method); + if (!m) { + r = log_oom(); + goto finish; + } + + va_start(ap, first_arg_type); + if (!dbus_message_append_args_valist(m, first_arg_type, ap)) { + va_end(ap); + dbus_message_unref(m); + r = log_oom(); + goto finish; + } + va_end(ap); + + reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); + dbus_message_unref(m); + if (!reply) { + log_error("Failed to issue method call: %s", bus_error_message(&error)); + if (bus_error_is_no_service(&error)) + r = -ENOENT; + else if (dbus_error_has_name(&error, DBUS_ERROR_ACCESS_DENIED)) + r = -EACCES; + else if (dbus_error_has_name(&error, DBUS_ERROR_NO_REPLY)) + r = -ETIMEDOUT; + else + r = -EIO; + goto finish; + } + if (return_reply) + *return_reply = reply; + else + dbus_message_unref(reply); +finish: + if(return_error) + *return_error=error; + else + dbus_error_free(&error); + + return r; +} diff --git a/src/shared/dbus-common.h b/src/shared/dbus-common.h index a6703a78d0..e49c3b5258 100644 --- a/src/shared/dbus-common.h +++ b/src/shared/dbus-common.h @@ -203,3 +203,13 @@ void bus_async_unregister_and_exit(DBusConnection *bus, const char *name); DBusHandlerResult bus_exit_idle_filter(DBusConnection *bus, DBusMessage *m, void *userdata); pid_t bus_get_unix_process_id(DBusConnection *connection, const char *name, DBusError *error); + +bool bus_error_is_no_service(const DBusError *error); +int bus_method_call_with_reply(DBusConnection *bus, + const char *destination, + const char *path, + const char *interface, + const char *method, + DBusMessage **return_reply, + DBusError *return_error, + int first_arg_type, ...); diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 00cd252351..2e0aaaa9fa 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -202,21 +202,6 @@ static const char *ansi_highlight_green(bool b) { return b ? ANSI_HIGHLIGHT_GREEN_ON : ANSI_HIGHLIGHT_OFF; } -static bool error_is_no_service(const DBusError *error) { - assert(error); - - if (!dbus_error_is_set(error)) - return false; - - if (dbus_error_has_name(error, DBUS_ERROR_NAME_HAS_NO_OWNER)) - return true; - - if (dbus_error_has_name(error, DBUS_ERROR_SERVICE_UNKNOWN)) - return true; - - return startswith(error->name, "org.freedesktop.DBus.Error.Spawn."); -} - static int translate_bus_error_to_exit_status(int r, const DBusError *error) { assert(error); @@ -448,33 +433,25 @@ static void output_units_list(const struct unit_info *unit_infos, unsigned c) { } static int list_units(DBusConnection *bus, char **args) { - DBusMessage *m = NULL, *reply = NULL; - DBusError error; + DBusMessage *reply = NULL; int r; DBusMessageIter iter, sub, sub2; unsigned c = 0, n_units = 0; struct unit_info *unit_infos = NULL; - dbus_error_init(&error); - - assert(bus); - pager_open_if_enabled(); - if (!(m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - "ListUnits"))) { - log_error("Could not allocate message."); - return -ENOMEM; - } - - if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - r = -EIO; + r = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "ListUnits", + &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 || @@ -538,19 +515,12 @@ static int list_units(DBusConnection *bus, char **args) { output_units_list(unit_infos, c); } - r = 0; - finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); free(unit_infos); - dbus_error_free(&error); - return r; } @@ -641,15 +611,12 @@ static void output_unit_file_list(const UnitFileList *units, unsigned c) { } static int list_unit_files(DBusConnection *bus, char **args) { - DBusMessage *m = NULL, *reply = NULL; - DBusError error; + DBusMessage *reply = NULL; int r; DBusMessageIter iter, sub, sub2; unsigned c = 0, n_units = 0; UnitFileList *units = NULL; - dbus_error_init(&error); - pager_open_if_enabled(); if (avoid_bus()) { @@ -682,24 +649,17 @@ static int list_unit_files(DBusConnection *bus, char **args) { hashmap_free(h); } else { - assert(bus); - - m = dbus_message_new_method_call( + r = bus_method_call_with_reply ( + bus, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", - "ListUnitFiles"); - 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; + "ListUnitFiles", + &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 || @@ -762,16 +722,11 @@ static int list_unit_files(DBusConnection *bus, char **args) { r = 0; finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); free(units); - dbus_error_free(&error); - return r; } @@ -834,40 +789,25 @@ static int dot_one_property(const char *name, const char *prop, DBusMessageIter } static int dot_one(DBusConnection *bus, const char *name, const char *path) { - DBusMessage *m = NULL, *reply = NULL; + DBusMessage *reply = NULL; const char *interface = "org.freedesktop.systemd1.Unit"; int r; - DBusError error; DBusMessageIter iter, sub, sub2, sub3; - assert(bus); assert(path); - dbus_error_init(&error); - - if (!(m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - path, - "org.freedesktop.DBus.Properties", - "GetAll"))) { - 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; - } - - if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - r = -EIO; + r = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + path, + "org.freedesktop.DBus.Properties", + "GetAll", + &reply, + NULL, + DBUS_TYPE_STRING, &interface, + DBUS_TYPE_INVALID); + if (r) goto finish; - } if (!dbus_message_iter_init(reply, &iter) || dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY || @@ -913,44 +853,29 @@ static int dot_one(DBusConnection *bus, const char *name, const char *path) { dbus_message_iter_next(&sub); } - r = 0; - finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); - dbus_error_free(&error); - return r; } static int dot(DBusConnection *bus, char **args) { - DBusMessage *m = NULL, *reply = NULL; - DBusError error; + DBusMessage *reply = NULL; int r; DBusMessageIter iter, sub, sub2; - dbus_error_init(&error); - - assert(bus); - - if (!(m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - "ListUnits"))) { - log_error("Could not allocate message."); - return -ENOMEM; - } - - if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - r = -EIO; + r = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "ListUnits", + &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 || @@ -1008,44 +933,31 @@ static int dot(DBusConnection *bus, char **args) { r = 0; finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); - dbus_error_free(&error); - return r; } static int list_jobs(DBusConnection *bus, char **args) { - 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(); - if (!(m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - "ListJobs"))) { - log_error("Could not allocate message."); - return -ENOMEM; - } - - if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - r = -EIO; + r = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "ListJobs", + &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 || @@ -1099,87 +1011,44 @@ static int list_jobs(DBusConnection *bus, char **args) { r = 0; finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); - dbus_error_free(&error); - return r; } static int load_unit(DBusConnection *bus, char **args) { - DBusMessage *m = NULL; - DBusError error; - int r; - char **name; - - dbus_error_init(&error); + int r = 0; + char **name, *n; - assert(bus); assert(args); STRV_FOREACH(name, args+1) { - DBusMessage *reply; - bool b; - char *n; - - if (!(m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - "LoadUnit"))) { - log_error("Could not allocate message."); - r = -ENOMEM; - goto finish; - } - n = unit_name_mangle(*name); - b = dbus_message_append_args(m, - DBUS_TYPE_STRING, n ? &n : name, - DBUS_TYPE_INVALID); + r = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "LoadUnit", + NULL, + NULL, + DBUS_TYPE_STRING, n ? &n : name, + DBUS_TYPE_INVALID); free(n); - if (!b) { - 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; + if (r) goto finish; - } - - dbus_message_unref(m); - dbus_message_unref(reply); - - m = reply = NULL; } - r = 0; - finish: - if (m) - dbus_message_unref(m); - - dbus_error_free(&error); - return r; } static int cancel_job(DBusConnection *bus, char **args) { - DBusMessage *m = NULL, *reply = NULL; - DBusError error; - int r; + DBusMessage *reply = NULL; + int r = 0; char **name; - dbus_error_init(&error); - - assert(bus); assert(args); if (strv_length(args) <= 1) @@ -1189,83 +1058,55 @@ static int cancel_job(DBusConnection *bus, char **args) { unsigned id; const char *path; - if (!(m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - "GetJob"))) { - log_error("Could not allocate message."); - r = -ENOMEM; - goto finish; - } - - if ((r = safe_atou(*name, &id)) < 0) { + r = safe_atou(*name, &id); + if (r < 0) { log_error("Failed to parse job id: %s", strerror(-r)); goto finish; } - assert_cc(sizeof(uint32_t) == sizeof(id)); - if (!dbus_message_append_args(m, - DBUS_TYPE_UINT32, &id, - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - r = -ENOMEM; - goto finish; - } - if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - r = -EIO; + r = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "GetJob", + &reply, + NULL, + DBUS_TYPE_UINT32, &id, + DBUS_TYPE_INVALID); + if (r) goto finish; - } - if (!dbus_message_get_args(reply, &error, + if (!dbus_message_get_args(reply, NULL, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID)) { - log_error("Failed to parse reply: %s", bus_error_message(&error)); + log_error("Failed to parse reply"); + dbus_message_unref(reply); r = -EIO; goto finish; } - - dbus_message_unref(m); - if (!(m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - path, - "org.freedesktop.systemd1.Job", - "Cancel"))) { - log_error("Could not allocate message."); - r = -ENOMEM; - goto finish; - } - dbus_message_unref(reply); - if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - r = -EIO; - goto finish; - } - dbus_message_unref(m); - dbus_message_unref(reply); - m = reply = NULL; + r = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + path, + "org.freedesktop.systemd1.Job", + "Cancel", + NULL, + NULL, + DBUS_TYPE_INVALID); + if (r) + goto finish; } - r = 0; - finish: - if (m) - dbus_message_unref(m); - - if (reply) - dbus_message_unref(reply); - - dbus_error_free(&error); - return r; } static bool need_daemon_reload(DBusConnection *bus, const char *unit) { - DBusMessage *m = NULL, *reply = NULL; + DBusMessage *reply = NULL; dbus_bool_t b = FALSE; DBusMessageIter iter, sub; const char @@ -1273,28 +1114,23 @@ static bool need_daemon_reload(DBusConnection *bus, const char *unit) { *property = "NeedDaemonReload", *path; char *n; - bool k; + int r; /* We ignore all errors here, since this is used to show a warning only */ - m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - "GetUnit"); - if (!m) - goto finish; - n = unit_name_mangle(unit); - k = dbus_message_append_args(m, - DBUS_TYPE_STRING, n ? (const char**) &n : &unit, - DBUS_TYPE_INVALID); + r = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "GetUnit", + &reply, + NULL, + DBUS_TYPE_STRING, n ? (const char**) &n : &unit, + DBUS_TYPE_INVALID); free(n); - if (!k) - goto finish; - - reply = dbus_connection_send_with_reply_and_block(bus, m, -1, NULL); - if (!reply) + if (r) goto finish; if (!dbus_message_get_args(reply, NULL, @@ -1302,25 +1138,19 @@ static bool need_daemon_reload(DBusConnection *bus, const char *unit) { DBUS_TYPE_INVALID)) goto finish; - dbus_message_unref(m); - m = dbus_message_new_method_call( + dbus_message_unref(reply); + r = bus_method_call_with_reply ( + bus, "org.freedesktop.systemd1", path, "org.freedesktop.DBus.Properties", - "Get"); - if (!m) - goto finish; - - if (!dbus_message_append_args(m, - DBUS_TYPE_STRING, &interface, - DBUS_TYPE_STRING, &property, - DBUS_TYPE_INVALID)) { - goto finish; - } - - dbus_message_unref(reply); - reply = dbus_connection_send_with_reply_and_block(bus, m, -1, NULL); - if (!reply) + "Get", + &reply, + NULL, + DBUS_TYPE_STRING, &interface, + DBUS_TYPE_STRING, &property, + DBUS_TYPE_INVALID); + if (r) goto finish; if (!dbus_message_iter_init(reply, &iter) || @@ -1335,9 +1165,6 @@ static bool need_daemon_reload(DBusConnection *bus, const char *unit) { dbus_message_iter_get_basic(&sub, &b); finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); @@ -1516,90 +1343,58 @@ finish: } static int check_one_unit(DBusConnection *bus, char *name, bool quiet) { - DBusMessage *m = NULL, *reply = NULL; - DBusError error; + DBusMessage *reply = NULL; DBusMessageIter iter, sub; const char *interface = "org.freedesktop.systemd1.Unit", *property = "ActiveState"; const char *path = NULL; const char *state; - int r = 3; /* According to LSB: "program is not running" */ + int r; char *n; - bool b; - assert(bus); assert(name); - dbus_error_init(&error); - - m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - "GetUnit"); - if (!m) { - log_error("Could not allocate message."); - r = -ENOMEM; - goto finish; - } - n = unit_name_mangle(name); - b = dbus_message_append_args(m, - DBUS_TYPE_STRING, n ? &n : &name, - DBUS_TYPE_INVALID); + r = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "GetUnit", + &reply, + NULL, + DBUS_TYPE_STRING, n ? &n : &name, + DBUS_TYPE_INVALID); free(n); - if (!b) { - 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) { - /* Hmm, cannot figure out anything about this unit... */ - if (!quiet) + if (r) { + if ((r != -ENOMEM) && (!quiet)) puts("unknown"); - goto finish; } - if (!dbus_message_get_args(reply, &error, + if (!dbus_message_get_args(reply, NULL, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID)) { - log_error("Failed to parse reply: %s", bus_error_message(&error)); + log_error("Failed to parse reply."); r = -EIO; goto finish; } - dbus_message_unref(m); - m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - path, - "org.freedesktop.DBus.Properties", - "Get"); - if (!m) { - log_error("Could not allocate message."); - r = -ENOMEM; - goto finish; - } - - if (!dbus_message_append_args(m, - DBUS_TYPE_STRING, &interface, - DBUS_TYPE_STRING, &property, - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - r = -ENOMEM; - goto finish; - } - dbus_message_unref(reply); - 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; + r = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + path, + "org.freedesktop.DBus.Properties", + "Get", + &reply, + NULL, + DBUS_TYPE_STRING, &interface, + DBUS_TYPE_STRING, &property, + DBUS_TYPE_INVALID); + if (r) goto finish; - } if (!dbus_message_iter_init(reply, &iter) || dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) { @@ -1623,16 +1418,13 @@ static int check_one_unit(DBusConnection *bus, char *name, bool quiet) { if (streq(state, "active") || streq(state, "reloading")) r = 0; + else + r = 3; /* According to LSB: "program is not running" */ finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); - dbus_error_free(&error); - return r; } @@ -1640,8 +1432,7 @@ static void check_triggering_units( DBusConnection *bus, const char *unit_name) { - DBusError error; - DBusMessage *m = NULL, *reply = NULL; + DBusMessage *reply = NULL; DBusMessageIter iter, sub; char *service_trigger = NULL; const char *interface = "org.freedesktop.systemd1.Unit", @@ -1649,8 +1440,7 @@ static void check_triggering_units( char *unit_path = NULL, *n = NULL; bool print_warning_label = true; - - dbus_error_init(&error); + int r; n = unit_name_mangle(unit_name); unit_path = unit_dbus_path_from_name(n ? n : unit_name); @@ -1660,32 +1450,23 @@ static void check_triggering_units( goto finish; } - m = dbus_message_new_method_call("org.freedesktop.systemd1", - unit_path, - "org.freedesktop.DBus.Properties", - "Get"); - if (!m) { - log_error("Could not allocate message."); - goto finish; - } - - if (!dbus_message_append_args(m, - DBUS_TYPE_STRING, &interface, - DBUS_TYPE_STRING, &triggered_by_property, - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - 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 = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + unit_path, + "org.freedesktop.DBus.Properties", + "Get", + &reply, + NULL, + DBUS_TYPE_STRING, &interface, + DBUS_TYPE_STRING, &triggered_by_property, + DBUS_TYPE_INVALID); + if (r) goto finish; - } if (!dbus_message_iter_init(reply, &iter) || dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) { - log_error("Failed to parse reply: %s", bus_error_message(&error)); + log_error("Failed to parse reply."); goto finish; } @@ -1695,10 +1476,9 @@ static void check_triggering_units( sub = iter; while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID) { - int r; if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING) { - log_error("Failed to parse reply: %s", bus_error_message(&error)); + log_error("Failed to parse reply."); goto finish; } @@ -1718,14 +1498,9 @@ static void check_triggering_units( dbus_message_iter_next(&sub); } finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); - dbus_error_free(&error); - free(unit_path); } @@ -1737,54 +1512,36 @@ static int start_unit_one( DBusError *error, Set *s) { - DBusMessage *m = NULL, *reply = NULL; + DBusMessage *reply = NULL; const char *path; int r; char *n; - bool b; - assert(bus); assert(method); assert(name); assert(mode); assert(error); assert(arg_no_block || s); - m = dbus_message_new_method_call( + n = unit_name_mangle(name); + r = bus_method_call_with_reply ( + bus, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", - method); - if (!m) { - log_error("Could not allocate message."); - r = -ENOMEM; - goto finish; - } - - n = unit_name_mangle(name); - b = dbus_message_append_args(m, - DBUS_TYPE_STRING, n ? (const char **) &n : &name, - DBUS_TYPE_STRING, &mode, - DBUS_TYPE_INVALID); + method, + &reply, + error, + DBUS_TYPE_STRING, n ? (const char **) &n : &name, + DBUS_TYPE_STRING, &mode, + DBUS_TYPE_INVALID); free(n); - if (!b) { - 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) { - - if (arg_action != ACTION_SYSTEMCTL && error_is_no_service(error)) { + if (r) { + if (r == -ENOENT && arg_action != ACTION_SYSTEMCTL ) { /* There's always a fallback possible for * legacy actions. */ r = -EADDRNOTAVAIL; - goto finish; } - - log_error("Failed to issue method call: %s", bus_error_message(error)); - r = -EIO; goto finish; } @@ -1824,9 +1581,6 @@ static int start_unit_one( r = 0; finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); @@ -1974,12 +1728,7 @@ finish: static int reboot_with_logind(DBusConnection *bus, enum action a) { #ifdef HAVE_LOGIND const char *method; - DBusMessage *m = NULL, *reply = NULL; - DBusError error; dbus_bool_t interactive = true; - int r; - - dbus_error_init(&error); polkit_agent_open_if_enabled(); @@ -2005,56 +1754,16 @@ static int reboot_with_logind(DBusConnection *bus, enum action a) { return -EINVAL; } - m = dbus_message_new_method_call( - "org.freedesktop.login1", - "/org/freedesktop/login1", - "org.freedesktop.login1.Manager", - method); - if (!m) { - log_error("Could not allocate message."); - r = -ENOMEM; - goto finish; - } - - if (!dbus_message_append_args(m, - DBUS_TYPE_BOOLEAN, &interactive, - 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) { - if (error_is_no_service(&error)) { - log_debug("Failed to issue method call: %s", bus_error_message(&error)); - r = -ENOENT; - goto finish; - } - - if (dbus_error_has_name(&error, DBUS_ERROR_ACCESS_DENIED)) { - log_debug("Failed to issue method call: %s", bus_error_message(&error)); - r = -EACCES; - goto finish; - } - - log_info("Failed to issue method call: %s", bus_error_message(&error)); - r = -EIO; - goto finish; - } - - r = 0; - -finish: - if (m) - dbus_message_unref(m); - - if (reply) - dbus_message_unref(reply); - - dbus_error_free(&error); - - return r; + return bus_method_call_with_reply ( + bus, + "org.freedesktop.login1", + "/org/freedesktop/login1", + "org.freedesktop.login1.Manager", + method, + NULL, + NULL, + DBUS_TYPE_BOOLEAN, &interactive, + DBUS_TYPE_INVALID); #else return -ENOSYS; #endif @@ -2124,69 +1833,33 @@ static int check_unit(DBusConnection *bus, char **args) { } static int kill_unit(DBusConnection *bus, char **args) { - DBusMessage *m = NULL; int r = 0; - DBusError error; - char **name; + char **name, *n; - assert(bus); assert(args); - dbus_error_init(&error); - if (!arg_kill_who) arg_kill_who = "all"; STRV_FOREACH(name, args+1) { - DBusMessage *reply; - char *n; - bool b; - - m = dbus_message_new_method_call( + n = unit_name_mangle(*name); + r = bus_method_call_with_reply ( + bus, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", - "KillUnit"); - if (!m) { - log_error("Could not allocate message."); - r = -ENOMEM; - goto finish; - } - - n = unit_name_mangle(*name); - b = dbus_message_append_args(m, - DBUS_TYPE_STRING, n ? &n : name, - DBUS_TYPE_STRING, &arg_kill_who, - DBUS_TYPE_INT32, &arg_signal, - DBUS_TYPE_INVALID); + "KillUnit", + NULL, + NULL, + DBUS_TYPE_STRING, n ? &n : name, + DBUS_TYPE_STRING, &arg_kill_who, + DBUS_TYPE_INT32, &arg_signal, + DBUS_TYPE_INVALID); free(n); - if (!b) { - 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)); - dbus_error_free(&error); - r = -EIO; - } - - dbus_message_unref(m); - - if (reply) - dbus_message_unref(reply); - m = reply = NULL; + if (r) + return r; } - -finish: - if (m) - dbus_message_unref(m); - - dbus_error_free(&error); - - return r; + return 0; } typedef struct ExecStatusInfo { @@ -3070,44 +2743,30 @@ 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; + DBusMessage *reply = NULL; const char *interface = ""; int r; - DBusError error; DBusMessageIter iter, sub, sub2, sub3; UnitStatusInfo info; ExecStatusInfo *p; - assert(bus); assert(path); assert(new_line); zero(info); - dbus_error_init(&error); - - if (!(m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - path, - "org.freedesktop.DBus.Properties", - "GetAll"))) { - 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; - } - if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - r = -EIO; + r = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + path, + "org.freedesktop.DBus.Properties", + "GetAll", + &reply, + NULL, + DBUS_TYPE_STRING, &interface, + DBUS_TYPE_INVALID); + if (r) goto finish; - } if (!dbus_message_iter_init(reply, &iter) || dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY || @@ -3186,50 +2845,32 @@ static int show_one(const char *verb, DBusConnection *bus, const char *path, boo } finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); - dbus_error_free(&error); - return r; } static int show_one_by_pid(const char *verb, DBusConnection *bus, uint32_t pid, bool *new_line) { - DBusMessage *m = NULL, *reply = NULL; + DBusMessage *reply = NULL; const char *path = NULL; DBusError error; int r; dbus_error_init(&error); - m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - "GetUnitByPID"); - if (!m) { - log_error("Could not allocate message."); - r = -ENOMEM; - goto finish; - } - - if (!dbus_message_append_args(m, - DBUS_TYPE_UINT32, &pid, - 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; + r = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "GetUnitByPID", + &reply, + NULL, + DBUS_TYPE_UINT32, &pid, + DBUS_TYPE_INVALID); + if (r) goto finish; - } if (!dbus_message_get_args(reply, &error, DBUS_TYPE_OBJECT_PATH, &path, @@ -3242,9 +2883,6 @@ static int show_one_by_pid(const char *verb, DBusConnection *bus, uint32_t pid, r = show_one(verb, bus, path, false, new_line); finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); @@ -3320,7 +2958,7 @@ static int show(DBusConnection *bus, char **args) { } static int dump(DBusConnection *bus, char **args) { - DBusMessage *m = NULL, *reply = NULL; + DBusMessage *reply = NULL; DBusError error; int r; const char *text; @@ -3329,20 +2967,17 @@ static int dump(DBusConnection *bus, char **args) { pager_open_if_enabled(); - if (!(m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - "Dump"))) { - log_error("Could not allocate message."); - return -ENOMEM; - } - - if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - r = -EIO; + r = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "Dump", + &reply, + NULL, + DBUS_TYPE_INVALID); + if (r) goto finish; - } if (!dbus_message_get_args(reply, &error, DBUS_TYPE_STRING, &text, @@ -3354,12 +2989,7 @@ static int dump(DBusConnection *bus, char **args) { fputs(text, stdout); - r = 0; - finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); @@ -3369,51 +2999,37 @@ finish: } static int snapshot(DBusConnection *bus, char **args) { - DBusMessage *m = NULL, *reply = NULL; + DBusMessage *reply = NULL; DBusError error; int r; - const char *name = "", *path, *id; dbus_bool_t cleanup = FALSE; DBusMessageIter iter, sub; const char + *name = "", *path, *id, *interface = "org.freedesktop.systemd1.Unit", *property = "Id"; char *n; - bool b; dbus_error_init(&error); - m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - "CreateSnapshot"); - if (!m) { - log_error("Could not allocate message."); - return -ENOMEM; - } - if (strv_length(args) > 1) name = args[1]; n = unit_name_mangle(name); - b = dbus_message_append_args(m, - DBUS_TYPE_STRING, n ? (const char**) &n : &name, - DBUS_TYPE_BOOLEAN, &cleanup, - DBUS_TYPE_INVALID); + r = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "CreateSnapshot", + &reply, + NULL, + DBUS_TYPE_STRING, n ? (const char**) &n : &name, + DBUS_TYPE_BOOLEAN, &cleanup, + DBUS_TYPE_INVALID); free(n); - if (!b) { - log_error("Could not append arguments to message."); - r = -ENOMEM; + if (r) 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; - goto finish; - } if (!dbus_message_get_args(reply, &error, DBUS_TYPE_OBJECT_PATH, &path, @@ -3423,33 +3039,20 @@ static int snapshot(DBusConnection *bus, char **args) { goto finish; } - dbus_message_unref(m); - m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - path, - "org.freedesktop.DBus.Properties", - "Get"); - if (!m) { - log_error("Could not allocate message."); - return -ENOMEM; - } - - if (!dbus_message_append_args(m, - DBUS_TYPE_STRING, &interface, - DBUS_TYPE_STRING, &property, - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - r = -ENOMEM; - goto finish; - } - dbus_message_unref(reply); - 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; + r = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + path, + "org.freedesktop.DBus.Properties", + "Get", + &reply, + NULL, + DBUS_TYPE_STRING, &interface, + DBUS_TYPE_STRING, &property, + DBUS_TYPE_INVALID); + if (r) goto finish; - } if (!dbus_message_iter_init(reply, &iter) || dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) { @@ -3470,12 +3073,8 @@ static int snapshot(DBusConnection *bus, char **args) { if (!arg_quiet) puts(id); - r = 0; finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); @@ -3485,12 +3084,11 @@ finish: } static int delete_snapshot(DBusConnection *bus, char **args) { - DBusMessage *m = NULL, *reply = NULL; - int r; + DBusMessage *reply = NULL; + int r = 0; DBusError error; char **name; - assert(bus); assert(args); dbus_error_init(&error); @@ -3498,92 +3096,54 @@ static int delete_snapshot(DBusConnection *bus, char **args) { STRV_FOREACH(name, args+1) { const char *path = NULL; char *n; - bool b; - m = dbus_message_new_method_call( + n = unit_name_mangle(*name); + r = bus_method_call_with_reply ( + bus, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", - "GetUnit"); - if (!m) { - log_error("Could not allocate message."); - r = -ENOMEM; - goto finish; - } - - n = unit_name_mangle(*name); - b = dbus_message_append_args(m, - DBUS_TYPE_STRING, n ? &n : name, - DBUS_TYPE_INVALID); + "GetUnit", + &reply, + NULL, + DBUS_TYPE_STRING, n ? &n : name, + DBUS_TYPE_INVALID); free(n); - if (!b) { - 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; + if (r) goto finish; - } if (!dbus_message_get_args(reply, &error, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID)) { log_error("Failed to parse reply: %s", bus_error_message(&error)); r = -EIO; + dbus_message_unref(reply); + dbus_error_free(&error); goto finish; } + dbus_message_unref(reply); - dbus_message_unref(m); - m = dbus_message_new_method_call( + r = bus_method_call_with_reply ( + bus, "org.freedesktop.systemd1", path, "org.freedesktop.systemd1.Snapshot", - "Remove"); - if (!m) { - log_error("Could not allocate message."); - r = -ENOMEM; - goto finish; - } - - dbus_message_unref(reply); - 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; + "Remove", + NULL, + NULL, + DBUS_TYPE_INVALID); + if (r) goto finish; - } - - dbus_message_unref(m); - dbus_message_unref(reply); - m = reply = NULL; } - r = 0; - finish: - if (m) - dbus_message_unref(m); - - if (reply) - dbus_message_unref(reply); - - dbus_error_free(&error); - return r; } static int daemon_reload(DBusConnection *bus, char **args) { - DBusMessage *m = NULL, *reply = NULL; - DBusError error; int r; const char *method; - dbus_error_init(&error); - if (arg_action == ACTION_RELOAD) method = "Reload"; else if (arg_action == ACTION_REEXEC) @@ -3604,148 +3164,79 @@ static int daemon_reload(DBusConnection *bus, char **args) { /* "daemon-reload" */ "Reload"; } - if (!(m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - method))) { - log_error("Could not allocate message."); - return -ENOMEM; - } - - if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) { - - if (arg_action != ACTION_SYSTEMCTL && error_is_no_service(&error)) { - /* There's always a fallback possible for - * legacy actions. */ - r = -EADDRNOTAVAIL; - goto finish; - } - - if (streq(method, "Reexecute") && dbus_error_has_name(&error, DBUS_ERROR_NO_REPLY)) { - /* On reexecution, we expect a disconnect, not - * a reply */ - r = 0; - goto finish; - } - - log_error("Failed to issue method call: %s", bus_error_message(&error)); - r = -EIO; - goto finish; - } - - r = 0; - -finish: - if (m) - dbus_message_unref(m); - - if (reply) - dbus_message_unref(reply); - - dbus_error_free(&error); + r = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + method, + NULL, + NULL, + DBUS_TYPE_INVALID); + + if (r == -ENOENT && arg_action != ACTION_SYSTEMCTL) + /* There's always a fallback possible for + * legacy actions. */ + r = -EADDRNOTAVAIL; + else if (r == -ETIMEDOUT && streq(method, "Reexecute")) + /* On reexecution, we expect a disconnect, not + * a reply */ + r = 0; return r; } static int reset_failed(DBusConnection *bus, char **args) { - DBusMessage *m = NULL; - int r; - DBusError error; - char **name; - - assert(bus); - dbus_error_init(&error); + int r = 0; + char **name, *n; if (strv_length(args) <= 1) return daemon_reload(bus, args); STRV_FOREACH(name, args+1) { - DBusMessage *reply; - char *n; - bool b; - - m = dbus_message_new_method_call( + n = unit_name_mangle(*name); + r = bus_method_call_with_reply ( + bus, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", - "ResetFailedUnit"); - if (!m) { - log_error("Could not allocate message."); - r = -ENOMEM; - goto finish; - } - - n = unit_name_mangle(*name); - b = dbus_message_append_args(m, - DBUS_TYPE_STRING, n ? &n : name, - DBUS_TYPE_INVALID); + "ResetFailedUnit", + NULL, + NULL, + DBUS_TYPE_STRING, n ? &n : name, + DBUS_TYPE_INVALID); free(n); - if (!b) { - 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; + if (r) goto finish; - } - - dbus_message_unref(m); - dbus_message_unref(reply); - m = reply = NULL; } - r = 0; - finish: - if (m) - dbus_message_unref(m); - - dbus_error_free(&error); - return r; } static int show_enviroment(DBusConnection *bus, char **args) { - DBusMessage *m = NULL, *reply = NULL; - DBusError error; + DBusMessage *reply = NULL; DBusMessageIter iter, sub, sub2; int r; const char *interface = "org.freedesktop.systemd1.Manager", *property = "Environment"; - dbus_error_init(&error); - pager_open_if_enabled(); - if (!(m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.DBus.Properties", - "Get"))) { - log_error("Could not allocate message."); - return -ENOMEM; - } - - if (!dbus_message_append_args(m, - DBUS_TYPE_STRING, &interface, - DBUS_TYPE_STRING, &property, - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - r = -ENOMEM; - goto finish; - } - - if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - r = -EIO; + r = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.DBus.Properties", + "Get", + &reply, + NULL, + DBUS_TYPE_STRING, &interface, + DBUS_TYPE_STRING, &property, + DBUS_TYPE_INVALID); + if (r) goto finish; - } if (!dbus_message_iter_init(reply, &iter) || dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) { @@ -3783,25 +3274,15 @@ static int show_enviroment(DBusConnection *bus, char **args) { r = 0; finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); - dbus_error_free(&error); - return r; } static int switch_root(DBusConnection *bus, char **args) { - DBusMessage *m = NULL, *reply = NULL; unsigned l; const char *root, *init; - DBusError error; - int r; - - dbus_error_init(&error); l = strv_length(args); if (l < 2 || l > 3) { @@ -3812,45 +3293,17 @@ static int switch_root(DBusConnection *bus, char **args) { root = args[1]; init = l >= 3 ? args[2] : ""; - m = dbus_message_new_method_call( + return bus_method_call_with_reply ( + bus, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", - "SwitchRoot"); - if (!m) { - log_error("Could not allocate message."); - return -ENOMEM; - } - - if (!dbus_message_append_args( - m, - DBUS_TYPE_STRING, &root, - DBUS_TYPE_STRING, &init, - 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; - goto finish; - } - - r = 0; - -finish: - if (m) - dbus_message_unref(m); - - if (reply) - dbus_message_unref(reply); - - dbus_error_free(&error); - - return r; + "SwitchRoot", + NULL, + NULL, + DBUS_TYPE_STRING, &root, + DBUS_TYPE_STRING, &init, + DBUS_TYPE_INVALID); } static int set_environment(DBusConnection *bus, char **args) { @@ -4290,7 +3743,7 @@ finish: static int unit_is_enabled(DBusConnection *bus, char **args) { DBusError error; int r; - DBusMessage *m = NULL, *reply = NULL; + DBusMessage *reply = NULL; bool enabled; char **name; @@ -4326,30 +3779,18 @@ static int unit_is_enabled(DBusConnection *bus, char **args) { STRV_FOREACH(name, args+1) { const char *s; - m = dbus_message_new_method_call( + r = bus_method_call_with_reply ( + bus, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", - "GetUnitFileState"); - if (!m) { - r = log_oom(); + "GetUnitFileState", + &reply, + NULL, + DBUS_TYPE_STRING, name, + DBUS_TYPE_INVALID); + if (r) goto finish; - } - - if (!dbus_message_append_args(m, - DBUS_TYPE_STRING, name, - 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; - goto finish; - } if (!dbus_message_get_args(reply, &error, DBUS_TYPE_STRING, &s, @@ -4359,9 +3800,8 @@ static int unit_is_enabled(DBusConnection *bus, char **args) { goto finish; } - dbus_message_unref(m); dbus_message_unref(reply); - m = reply = NULL; + reply = NULL; if (streq(s, "enabled") || streq(s, "enabled-runtime") || @@ -4376,9 +3816,6 @@ static int unit_is_enabled(DBusConnection *bus, char **args) { r = enabled ? 0 : 1; finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); @@ -5316,7 +4753,7 @@ static int talk_upstart(void) { if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) { - if (error_is_no_service(&error)) { + if (bus_error_is_no_service(&error)) { r = -EADDRNOTAVAIL; goto finish; } diff --git a/src/update-utmp/update-utmp.c b/src/update-utmp/update-utmp.c index ee9105bf47..fceeed8b44 100644 --- a/src/update-utmp/update-utmp.c +++ b/src/update-utmp/update-utmp.c @@ -50,36 +50,24 @@ static usec_t get_startup_time(Context *c) { *interface = "org.freedesktop.systemd1.Manager", *property = "StartupTimestamp"; - DBusError error; usec_t t = 0; - DBusMessage *m = NULL, *reply = NULL; + DBusMessage *reply = NULL; DBusMessageIter iter, sub; - dbus_error_init(&error); - assert(c); - if (!(m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.DBus.Properties", - "Get"))) { - log_error("Could not allocate message."); - goto finish; - } - - if (!dbus_message_append_args(m, - DBUS_TYPE_STRING, &interface, - DBUS_TYPE_STRING, &property, - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - goto finish; - } - - if (!(reply = dbus_connection_send_with_reply_and_block(c->bus, m, -1, &error))) { - log_error("Failed to send command: %s", bus_error_message(&error)); + if (bus_method_call_with_reply ( + c->bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.DBus.Properties", + "Get", + &reply, + NULL, + DBUS_TYPE_STRING, &interface, + DBUS_TYPE_STRING, &property, + DBUS_TYPE_INVALID)) goto finish; - } if (!dbus_message_iter_init(reply, &iter) || dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) { @@ -97,14 +85,8 @@ static usec_t get_startup_time(Context *c) { dbus_message_iter_get_basic(&sub, &t); finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); - - dbus_error_free(&error); - return t; } @@ -128,7 +110,7 @@ static int get_current_runlevel(Context *c) { *interface = "org.freedesktop.systemd1.Unit", *property = "ActiveState"; - DBusMessage *m = NULL, *reply = NULL; + DBusMessage *reply = NULL; int r = 0; unsigned i; DBusError error; @@ -141,28 +123,20 @@ static int get_current_runlevel(Context *c) { const char *path = NULL, *state; DBusMessageIter iter, sub; - if (!(m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - "GetUnit"))) { - log_error("Could not allocate message."); - r = -ENOMEM; + r = bus_method_call_with_reply ( + c->bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "GetUnit", + &reply, + NULL, + DBUS_TYPE_STRING, &table[i].special, + DBUS_TYPE_INVALID); + if (r == -ENOMEM) goto finish; - } - - if (!dbus_message_append_args(m, - DBUS_TYPE_STRING, &table[i].special, - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - r = -ENOMEM; - goto finish; - } - - if (!(reply = dbus_connection_send_with_reply_and_block(c->bus, m, -1, &error))) { - dbus_error_free(&error); + if (r) continue; - } if (!dbus_message_get_args(reply, &error, DBUS_TYPE_OBJECT_PATH, &path, @@ -172,32 +146,20 @@ static int get_current_runlevel(Context *c) { goto finish; } - dbus_message_unref(m); - if (!(m = dbus_message_new_method_call( - "org.freedesktop.systemd1", - path, - "org.freedesktop.DBus.Properties", - "Get"))) { - log_error("Could not allocate message."); - r = -ENOMEM; - goto finish; - } - - if (!dbus_message_append_args(m, - DBUS_TYPE_STRING, &interface, - DBUS_TYPE_STRING, &property, - DBUS_TYPE_INVALID)) { - log_error("Could not append arguments to message."); - r = -ENOMEM; - goto finish; - } - dbus_message_unref(reply); - if (!(reply = dbus_connection_send_with_reply_and_block(c->bus, m, -1, &error))) { - log_error("Failed to send command: %s", bus_error_message(&error)); - r = -EIO; + r = bus_method_call_with_reply ( + c->bus, + "org.freedesktop.systemd1", + path, + "org.freedesktop.DBus.Properties", + "Get", + &reply, + NULL, + DBUS_TYPE_STRING, &interface, + DBUS_TYPE_STRING, &property, + DBUS_TYPE_INVALID); + if (r) goto finish; - } if (!dbus_message_iter_init(reply, &iter) || dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) { @@ -219,18 +181,14 @@ static int get_current_runlevel(Context *c) { if (streq(state, "active") || streq(state, "reloading")) r = table[i].runlevel; - dbus_message_unref(m); dbus_message_unref(reply); - m = reply = NULL; + reply = NULL; if (r) break; } finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); |