X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fdbus-manager.c;h=f2a7de738419316dbb6327ad472c9b5e2b2fdbaa;hp=c80b22b9e67f368af02f19d15165e428b3c47f44;hb=9a1ac7b9ae2fb218170d1bd106d5351a76d03a95;hpb=c87eba546a33ce7ecd66f0e3b61bdf55ae1389f0 diff --git a/src/dbus-manager.c b/src/dbus-manager.c index c80b22b9e..f2a7de738 100644 --- a/src/dbus-manager.c +++ b/src/dbus-manager.c @@ -56,6 +56,11 @@ " \n" \ " \n" \ " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ @@ -103,12 +108,17 @@ " " \ " \n" \ " \n" \ - " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ " \n" \ " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ " \n" #define INTROSPECTION_BEGIN \ @@ -185,18 +195,23 @@ static int bus_manager_append_n_jobs(Manager *m, DBusMessageIter *i, const char return 0; } -static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusMessage *message, void *data) { +static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusMessage *message, void *data) { Manager *m = data; const BusProperty properties[] = { - { "org.freedesktop.systemd1.Manager", "Version", bus_property_append_string, "s", PACKAGE_STRING }, - { "org.freedesktop.systemd1.Manager", "RunningAs", bus_manager_append_running_as, "s", &m->running_as }, - { "org.freedesktop.systemd1.Manager", "BootTimestamp", bus_property_append_uint64, "t", &m->startup_timestamp.realtime }, - { "org.freedesktop.systemd1.Manager", "LogLevel", bus_manager_append_log_level, "s", NULL }, - { "org.freedesktop.systemd1.Manager", "LogTarget", bus_manager_append_log_target, "s", NULL }, - { "org.freedesktop.systemd1.Manager", "NNames", bus_manager_append_n_names, "u", NULL }, - { "org.freedesktop.systemd1.Manager", "NJobs", bus_manager_append_n_jobs, "u", NULL }, - { "org.freedesktop.systemd1.Manager", "Environment", bus_property_append_strv, "as", m->environment }, + { "org.freedesktop.systemd1.Manager", "Version", bus_property_append_string, "s", PACKAGE_STRING }, + { "org.freedesktop.systemd1.Manager", "RunningAs", bus_manager_append_running_as, "s", &m->running_as }, + { "org.freedesktop.systemd1.Manager", "StartupTimestamp", bus_property_append_uint64, "t", &m->startup_timestamp.realtime }, + { "org.freedesktop.systemd1.Manager", "LogLevel", bus_manager_append_log_level, "s", NULL }, + { "org.freedesktop.systemd1.Manager", "LogTarget", bus_manager_append_log_target, "s", NULL }, + { "org.freedesktop.systemd1.Manager", "NNames", bus_manager_append_n_names, "u", NULL }, + { "org.freedesktop.systemd1.Manager", "NJobs", bus_manager_append_n_jobs, "u", NULL }, + { "org.freedesktop.systemd1.Manager", "Environment", bus_property_append_strv, "as", m->environment }, + { "org.freedesktop.systemd1.Manager", "ConfirmSpawn", bus_property_append_bool, "b", &m->confirm_spawn }, + { "org.freedesktop.systemd1.Manager", "UnitPath", bus_property_append_strv, "as", m->lookup_paths.unit_path }, + { "org.freedesktop.systemd1.Manager", "SysVInitPath", bus_property_append_strv, "as", m->lookup_paths.sysvinit_path }, + { "org.freedesktop.systemd1.Manager", "SysVRcndPath", bus_property_append_strv, "as", m->lookup_paths.sysvrcnd_path }, + { "org.freedesktop.systemd1.Manager", "NotifySocket", bus_property_append_string, "s", m->notify_socket }, { NULL, NULL, NULL, NULL, NULL } }; @@ -226,10 +241,10 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection &error, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID)) - return bus_send_error_reply(m, message, &error, -EINVAL); + return bus_send_error_reply(m, connection, message, &error, -EINVAL); if (!(u = manager_get_unit(m, name))) - return bus_send_error_reply(m, message, NULL, -ENOENT); + return bus_send_error_reply(m, connection, message, NULL, -ENOENT); if (!(reply = dbus_message_new_method_return(message))) goto oom; @@ -252,10 +267,10 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection &error, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID)) - return bus_send_error_reply(m, message, &error, -EINVAL); + return bus_send_error_reply(m, connection, message, &error, -EINVAL); if ((r = manager_load_unit(m, name, NULL, &u)) < 0) - return bus_send_error_reply(m, message, NULL, r); + return bus_send_error_reply(m, connection, message, NULL, r); if (!(reply = dbus_message_new_method_return(message))) goto oom; @@ -277,6 +292,8 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection job_type = JOB_RELOAD; else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "RestartUnit")) job_type = JOB_RESTART; + else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "TryRestartUnit")) + job_type = JOB_TRY_RESTART; else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "GetJob")) { uint32_t id; Job *j; @@ -286,10 +303,10 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection &error, DBUS_TYPE_UINT32, &id, DBUS_TYPE_INVALID)) - return bus_send_error_reply(m, message, &error, -EINVAL); + return bus_send_error_reply(m, connection, message, &error, -EINVAL); if (!(j = manager_get_job(m, id))) - return bus_send_error_reply(m, message, NULL, -ENOENT); + return bus_send_error_reply(m, connection, message, NULL, -ENOENT); if (!(reply = dbus_message_new_method_return(message))) goto oom; @@ -442,14 +459,25 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "Subscribe")) { char *client; + Set *s; + + if (!(s = BUS_CONNECTION_SUBSCRIBED(m, connection))) { + if (!(s = set_new(string_hash_func, string_compare_func))) + goto oom; + + if (!(dbus_connection_set_data(connection, m->subscribed_data_slot, s, NULL))) { + set_free(s); + goto oom; + } + } if (!(client = strdup(dbus_message_get_sender(message)))) goto oom; - r = set_put(m->subscribed, client); - - if (r < 0) - return bus_send_error_reply(m, message, NULL, r); + if ((r = set_put(s, client)) < 0) { + free(client); + return bus_send_error_reply(m, connection, message, NULL, r); + } if (!(reply = dbus_message_new_method_return(message))) goto oom; @@ -457,8 +485,8 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "Unsubscribe")) { char *client; - if (!(client = set_remove(m->subscribed, (char*) dbus_message_get_sender(message)))) - return bus_send_error_reply(m, message, NULL, -ENOENT); + if (!(client = set_remove(BUS_CONNECTION_SUBSCRIBED(m, connection), (char*) dbus_message_get_sender(message)))) + return bus_send_error_reply(m, connection, message, NULL, -ENOENT); free(client); @@ -504,13 +532,13 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection DBUS_TYPE_STRING, &name, DBUS_TYPE_BOOLEAN, &cleanup, DBUS_TYPE_INVALID)) - return bus_send_error_reply(m, message, &error, -EINVAL); + return bus_send_error_reply(m, connection, message, &error, -EINVAL); if (name && name[0] == 0) name = NULL; if ((r = snapshot_create(m, name, cleanup, &s)) < 0) - return bus_send_error_reply(m, message, NULL, r); + return bus_send_error_reply(m, connection, message, NULL, r); if (!(reply = dbus_message_new_method_return(message))) goto oom; @@ -608,8 +636,8 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "Exit")) { - if (m->running_as == MANAGER_INIT) - return bus_send_error_reply(m, message, NULL, -ENOTSUP); + if (m->running_as == MANAGER_SYSTEM) + return bus_send_error_reply(m, connection, message, NULL, -ENOTSUP); if (!(reply = dbus_message_new_method_return(message))) goto oom; @@ -623,10 +651,10 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection if (r == -ENOMEM) goto oom; - return bus_send_error_reply(m, message, NULL, r); + return bus_send_error_reply(m, connection, message, NULL, r); } - e = strv_env_merge(m->environment, l, NULL); + e = strv_env_merge(2, m->environment, l); strv_free(l); if (!e) @@ -647,10 +675,10 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection if (r == -ENOMEM) goto oom; - return bus_send_error_reply(m, message, NULL, r); + return bus_send_error_reply(m, connection, message, NULL, r); } - e = strv_env_delete(m->environment, l, NULL); + e = strv_env_delete(m->environment, 1, l); strv_free(l); if (!e) @@ -663,7 +691,7 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection m->environment = e; } else - return bus_default_message_handler(m, message, NULL, properties); + return bus_default_message_handler(m, connection, message, NULL, properties); if (job_type != _JOB_TYPE_INVALID) { @@ -678,19 +706,24 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection DBUS_TYPE_STRING, &name, DBUS_TYPE_STRING, &smode, DBUS_TYPE_INVALID)) - return bus_send_error_reply(m, message, &error, -EINVAL); + return bus_send_error_reply(m, connection, message, &error, -EINVAL); if ((mode = job_mode_from_string(smode)) == _JOB_MODE_INVALID) - return bus_send_error_reply(m, message, NULL, -EINVAL); + return bus_send_error_reply(m, connection, message, NULL, -EINVAL); if ((r = manager_load_unit(m, name, NULL, &u)) < 0) - return bus_send_error_reply(m, message, NULL, r); + return bus_send_error_reply(m, connection, message, NULL, r); if (job_type == JOB_START && u->meta.only_by_dependency) - return bus_send_error_reply(m, message, NULL, -EPERM); + return bus_send_error_reply(m, connection, message, NULL, -EPERM); if ((r = manager_add_job(m, job_type, u, mode, true, &j)) < 0) - return bus_send_error_reply(m, message, NULL, r); + return bus_send_error_reply(m, connection, message, NULL, r); + + if (!(j->bus_client = strdup(dbus_message_get_sender(message)))) + goto oom; + + j->bus = connection; if (!(reply = dbus_message_new_method_return(message))) goto oom; @@ -703,6 +736,7 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID)) goto oom; + } free(path);