static void change_runlevel(Server *s, int runlevel) { const char *target; DBusMessage *m = NULL, *reply = NULL; DBusError error; const char *mode; bool isolate = false; assert(s); dbus_error_init(&error); if (!(target = translate_runlevel(runlevel, &isolate))) { log_warning("Got request for unknown runlevel %c, ignoring.", runlevel); goto finish; } if (isolate) mode = "isolate"; else mode = "replace-irreversibly"; log_debug("Running request %s/start/%s", target, mode); if (!(m = dbus_message_new_method_call("org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "StartUnit"))) { log_error("Could not allocate message."); goto finish; } if (!dbus_message_append_args(m, DBUS_TYPE_STRING, &target, DBUS_TYPE_STRING, &mode, DBUS_TYPE_INVALID)) { log_error("Could not attach target and flag information to message."); goto finish; } if (!(reply = dbus_connection_send_with_reply_and_block(s->bus, m, -1, &error))) { log_error("Failed to start unit: %s", bus_error_message(&error)); goto finish; } finish: if (m) dbus_message_unref(m); if (reply) dbus_message_unref(reply); dbus_error_free(&error); }
static void change_runlevel(Server *s, int runlevel) { const char *target; _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; const char *mode; bool isolate = false; int r; assert(s); target = translate_runlevel(runlevel, &isolate); if (!target) { log_warning("Got request for unknown runlevel %c, ignoring.", runlevel); return; } if (isolate) mode = "isolate"; else mode = "replace-irreversibly"; log_debug("Running request %s/start/%s", target, mode); r = sd_bus_call_method( s->bus, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "StartUnit", &error, NULL, "ss", target, mode); if (r < 0) { log_error("Failed to change runlevel: %s", bus_error_message(&error, -r)); return; } }