X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fsystemctl%2Fsystemctl.c;h=dd835aa37a3b0286d4996370ecc4d2a408710443;hp=e587cfbfae552e0b10fc1d33be62e29ee0d043d8;hb=37370d0cbe7c79d3f5b44a9ddbfac87c59dc09dd;hpb=c74f17d96cccd4cc998fd037cb92046930188c91 diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index e587cfbfa..dd835aa37 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -74,7 +74,6 @@ static bool arg_no_block = false; static bool arg_no_legend = false; static bool arg_no_pager = false; static bool arg_no_wtmp = false; -static bool arg_no_sync = false; static bool arg_no_wall = false; static bool arg_no_reload = false; static bool arg_dry = false; @@ -202,21 +201,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); @@ -247,12 +231,13 @@ static int translate_bus_error_to_exit_status(int r, const DBusError *error) { static void warn_wall(enum action a) { static const char *table[_ACTION_MAX] = { - [ACTION_HALT] = "The system is going down for system halt NOW!", - [ACTION_REBOOT] = "The system is going down for reboot NOW!", - [ACTION_POWEROFF] = "The system is going down for power-off NOW!", - [ACTION_KEXEC] = "The system is going down for kexec reboot NOW!", - [ACTION_RESCUE] = "The system is going down to rescue mode NOW!", - [ACTION_EMERGENCY] = "The system is going down to emergency mode NOW!" + [ACTION_HALT] = "The system is going down for system halt NOW!", + [ACTION_REBOOT] = "The system is going down for reboot NOW!", + [ACTION_POWEROFF] = "The system is going down for power-off NOW!", + [ACTION_KEXEC] = "The system is going down for kexec reboot NOW!", + [ACTION_RESCUE] = "The system is going down to rescue mode NOW!", + [ACTION_EMERGENCY] = "The system is going down to emergency mode NOW!", + [ACTION_CANCEL_SHUTDOWN] = "The system shutdown has been cancelled NOW!" }; if (arg_no_wall) @@ -440,40 +425,34 @@ static void output_units_list(const struct unit_info *unit_infos, unsigned c) { "JOB = Pending job for the unit.\n"); if (arg_all) - printf("\n%u units listed.\n", n_shown); + printf("\n%u loaded units listed.\n" + "To show all installed unit files use 'systemctl list-unit-files'.\n", n_shown); else - printf("\n%u units listed. Pass --all to see inactive units, too.\n", n_shown); + printf("\n%u loaded units listed. Pass --all to see loaded but inactive units, too.\n" + "To show all installed unit files use 'systemctl list-unit-files'.\n", n_shown); } } 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 || @@ -537,19 +516,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; } @@ -615,7 +587,8 @@ static void output_unit_file_list(const UnitFileList *units, unsigned c) { if (u->state == UNIT_FILE_MASKED || u->state == UNIT_FILE_MASKED_RUNTIME || - u->state == UNIT_FILE_DISABLED) { + u->state == UNIT_FILE_DISABLED || + u->state == UNIT_FILE_INVALID) { on = ansi_highlight_red(true); off = ansi_highlight_red(false); } else if (u->state == UNIT_FILE_ENABLED) { @@ -640,15 +613,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()) { @@ -657,10 +627,8 @@ static int list_unit_files(DBusConnection *bus, char **args) { Iterator i; h = hashmap_new(string_hash_func, string_compare_func); - if (!h) { - log_error("Out of memory"); - return -ENOMEM; - } + if (!h) + return log_oom(); r = unit_file_get_list(arg_scope, arg_root, h); if (r < 0) { @@ -673,8 +641,7 @@ static int list_unit_files(DBusConnection *bus, char **args) { units = new(UnitFileList, n_units); if (!units) { unit_file_list_free(h); - log_error("Out of memory"); - return -ENOMEM; + return log_oom(); } HASHMAP_FOREACH(u, h, i) { @@ -684,24 +651,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 || @@ -764,16 +724,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; } @@ -783,7 +738,7 @@ static int dot_one_property(const char *name, const char *prop, DBusMessageIter "RequiresOverridable", "[color=\"black\"]", "Requisite", "[color=\"darkblue\"]", "RequisiteOverridable", "[color=\"darkblue\"]", - "Wants", "[color=\"darkgrey\"]", + "Wants", "[color=\"grey66\"]", "Conflicts", "[color=\"red\"]", "ConflictedBy", "[color=\"red\"]", "After", "[color=\"green\"]" @@ -836,40 +791,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 || @@ -915,44 +855,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 || @@ -1010,44 +935,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 || @@ -1101,87 +1013,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; + 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; - } - - 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) @@ -1191,83 +1060,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 @@ -1275,28 +1116,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, @@ -1304,25 +1140,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) || @@ -1337,9 +1167,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); @@ -1518,90 +1345,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); - 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) + 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 (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) { @@ -1625,16 +1420,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; } @@ -1642,8 +1434,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", @@ -1651,8 +1442,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); @@ -1662,32 +1452,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; } @@ -1697,10 +1478,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; } @@ -1720,14 +1500,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); } @@ -1739,54 +1514,37 @@ 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; + else + log_error("Failed to issue method call: %s", bus_error_message(error)); goto finish; } @@ -1826,9 +1584,6 @@ static int start_unit_one( r = 0; finish: - if (m) - dbus_message_unref(m); - if (reply) dbus_message_unref(reply); @@ -1976,12 +1731,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(); @@ -2007,56 +1757,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 @@ -2126,69 +1836,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 { @@ -2476,7 +2150,7 @@ static void print_status_info(UnitStatusInfo *i) { printf("\t Process: %u %s=%s ", p->pid, p->name, strna(t)); free(t); - good = is_clean_exit_lsb(p->code, p->status); + good = is_clean_exit_lsb(p->code, p->status, NULL); if (!good) { on = ansi_highlight_red(true); off = ansi_highlight_red(false); @@ -2587,9 +2261,12 @@ static void print_status_info(UnitStatusInfo *i) { } if (i->id && arg_transport != TRANSPORT_SSH) { - int flags = (arg_lines*OUTPUT_SHOW_ALL | - arg_follow*OUTPUT_FOLLOW | - !arg_quiet*OUTPUT_WARN_CUTOFF); + int flags = + arg_all * OUTPUT_SHOW_ALL | + arg_follow * OUTPUT_FOLLOW | + !arg_quiet * OUTPUT_WARN_CUTOFF | + on_tty() * OUTPUT_COLOR; + printf("\n"); show_journal_by_unit(i->id, arg_output, 0, i->inactive_exit_timestamp_monotonic, @@ -2630,14 +2307,14 @@ static void show_unit_help(UnitStatusInfo *i) { if (e) { page = strndup((*p) + 4, e - *p - 4); if (!page) { - log_error("Out of memory."); + log_oom(); return; } section = strndup(e + 1, *p + k - e - 2); if (!section) { free(page); - log_error("Out of memory"); + log_oom(); return; } @@ -3069,44 +2746,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 || @@ -3185,50 +2848,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, @@ -3241,9 +2886,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); @@ -3282,10 +2924,8 @@ static int show(DBusConnection *bus, char **args) { n = unit_name_mangle(*name); p = unit_dbus_path_from_name(n ? n : *name); free(n); - if (!p) { - log_error("Out of memory"); - return -ENOMEM; - } + if (!p) + return log_oom(); r = show_one(args[0], bus, p, show_properties, &new_line); free(p); @@ -3298,10 +2938,8 @@ static int show(DBusConnection *bus, char **args) { /* Interpret as job id */ char *p; - if (asprintf(&p, "/org/freedesktop/systemd1/job/%u", id) < 0) { - log_error("Out of memory"); - return -ENOMEM; - } + if (asprintf(&p, "/org/freedesktop/systemd1/job/%u", id) < 0) + return log_oom(); r = show_one(args[0], bus, p, show_properties, &new_line); free(p); @@ -3323,7 +2961,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; @@ -3332,20 +2970,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, @@ -3357,12 +2992,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); @@ -3372,51 +3002,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); - 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; + 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 (r) goto finish; - } if (!dbus_message_get_args(reply, &error, DBUS_TYPE_OBJECT_PATH, &path, @@ -3426,33 +3042,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) { @@ -3473,12 +3076,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); @@ -3488,12 +3087,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); @@ -3501,91 +3099,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); + DBusError error; if (arg_action == ACTION_RELOAD) method = "Reload"; @@ -3607,148 +3168,82 @@ 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; - } - + r = bus_method_call_with_reply ( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + method, + NULL, + &error, + 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; + else if (r) 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; } 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) { @@ -3786,25 +3281,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) { @@ -3815,45 +3300,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) { @@ -3974,8 +3431,7 @@ static int enable_sysv_units(char **args) { asprintf(&p, "%s/%s", *k, name); if (!p) { - log_error("No memory"); - r = -ENOMEM; + r = log_oom(); goto finish; } @@ -3995,8 +3451,7 @@ static int enable_sysv_units(char **args) { else asprintf(&p, SYSTEM_SYSVINIT_PATH "/%s", name); if (!p) { - log_error("No memory"); - r = -ENOMEM; + r = log_oom(); goto finish; } @@ -4024,10 +3479,9 @@ static int enable_sysv_units(char **args) { l = strv_join((char**)argv, " "); if (!l) { - log_error("No memory."); free(q); free(p); - r = -ENOMEM; + r = log_oom(); goto finish; } @@ -4097,6 +3551,28 @@ finish: return r; } +static int mangle_names(char **original_names, char ***mangled_names) { + char **names_it = NULL; + char **name = NULL; + + (*mangled_names) = new(char*, strv_length(original_names)+1); + if(!(*mangled_names)) + return log_oom(); + + names_it = *mangled_names; + + STRV_FOREACH(name, original_names) { + char *n = unit_name_mangle(*name); + (*names_it) = n ? n : strdup(*name); + if(!(*names_it)) + return log_oom(); + names_it++; + } + *names_it = NULL; + + return 0; +} + static int enable_unit(DBusConnection *bus, char **args) { const char *verb = args[0]; UnitFileChange *changes = NULL; @@ -4105,6 +3581,7 @@ static int enable_unit(DBusConnection *bus, char **args) { DBusMessage *m = NULL, *reply = NULL; int r; DBusError error; + char **mangled_names = NULL; r = enable_sysv_units(args); if (r < 0) @@ -4184,14 +3661,17 @@ static int enable_unit(DBusConnection *bus, char **args) { "org.freedesktop.systemd1.Manager", method); if (!m) { - log_error("Out of memory"); - r = -ENOMEM; + r = log_oom(); goto finish; } dbus_message_iter_init_append(m, &iter); - r = bus_append_strv_iter(&iter, args+1); + r = mangle_names(args+1, &mangled_names); + if(r < 0) + goto finish; + + r = bus_append_strv_iter(&iter, mangled_names); if (r < 0) { log_error("Failed to append unit files."); goto finish; @@ -4291,13 +3771,16 @@ finish: unit_file_changes_free(changes, n_changes); dbus_error_free(&error); + + strv_free(mangled_names); + return r; } 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; @@ -4333,31 +3816,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) { - log_error("Out of memory"); - r = -ENOMEM; - 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; + "GetUnitFileState", + &reply, + NULL, + DBUS_TYPE_STRING, name, + DBUS_TYPE_INVALID); + if (r) goto finish; - } if (!dbus_message_get_args(reply, &error, DBUS_TYPE_STRING, &s, @@ -4367,9 +3837,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") || @@ -4384,9 +3853,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); @@ -4437,7 +3903,7 @@ static int systemctl_help(void) { " -n --lines=INTEGER Journal entries to show\n" " --follow Follow journal\n" " -o --output=STRING Change journal output mode (short, short-monotonic,\n" - " verbose, export, json, cat)\n\n" + " verbose, export, json, json-pretty, cat)\n\n" "Unit Commands:\n" " list-units List loaded units\n" " start [NAME...] Start (activate) one or more units\n" @@ -4515,7 +3981,6 @@ static int halt_help(void) { " -f --force Force immediate halt/power-off/reboot\n" " -w --wtmp-only Don't halt/power-off/reboot, just write wtmp record\n" " -d --no-wtmp Don't write wtmp record\n" - " -n --no-sync Don't sync before halt/power-off/reboot\n" " --no-wall Don't send wall message before halt/power-off/reboot\n", program_invocation_short_name, arg_action == ACTION_REBOOT ? "Reboot" : @@ -4837,7 +4302,6 @@ static int halt_parse_argv(int argc, char *argv[]) { { "force", no_argument, NULL, 'f' }, { "wtmp-only", no_argument, NULL, 'w' }, { "no-wtmp", no_argument, NULL, 'd' }, - { "no-sync", no_argument, NULL, 'n' }, { "no-wall", no_argument, NULL, ARG_NO_WALL }, { NULL, 0, NULL, 0 } }; @@ -4883,16 +4347,13 @@ static int halt_parse_argv(int argc, char *argv[]) { arg_no_wtmp = true; break; - case 'n': - arg_no_sync = true; - break; - case ARG_NO_WALL: arg_no_wall = true; break; case 'i': case 'h': + case 'n': /* Compatibility nops */ break; @@ -5042,7 +4503,7 @@ static int shutdown_parse_argv(int argc, char *argv[]) { } } - if (argc > optind) { + if (argc > optind && arg_action != ACTION_CANCEL_SHUTDOWN) { r = parse_time_spec(argv[optind], &arg_when); if (r < 0) { log_error("Failed to parse time specification: %s", argv[optind]); @@ -5051,8 +4512,11 @@ static int shutdown_parse_argv(int argc, char *argv[]) { } else arg_when = now(CLOCK_REALTIME) + USEC_PER_MINUTE; - /* We skip the time argument */ - if (argc > optind + 1) + if (argc > optind && arg_action == ACTION_CANCEL_SHUTDOWN) + /* No time argument for shutdown cancel */ + arg_wall = argv + optind; + else if (argc > optind + 1) + /* We skip the time argument */ arg_wall = argv + optind + 1; optind = argc; @@ -5321,7 +4785,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; } @@ -5641,7 +5105,7 @@ done: return 0; } -static void halt_now(enum action a) { +static _noreturn_ void halt_now(enum action a) { /* Make sure C-A-D is handled by the kernel from this * point on... */ @@ -5731,9 +5195,6 @@ static int halt_main(DBusConnection *bus) { } } - if (!arg_no_sync) - sync(); - if (arg_dry) return 0; @@ -5831,9 +5292,22 @@ int main(int argc, char*argv[]) { r = reload_with_fallback(bus); break; - case ACTION_CANCEL_SHUTDOWN: - r = send_shutdownd(0, 0, false, false, NULL); + case ACTION_CANCEL_SHUTDOWN: { + char *m = NULL; + + if (arg_wall) { + m = strv_join(arg_wall, " "); + if (!m) { + retval = EXIT_FAILURE; + goto finish; + } + } + r = send_shutdownd(arg_when, SD_SHUTDOWN_NONE, false, !arg_no_wall, m); + if (r < 0) + log_warning("Failed to talk to shutdownd, shutdown hasn't been cancelled: %s", strerror(-r)); + free(m); break; + } case ACTION_INVALID: case ACTION_RUNLEVEL: