X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=dbus-manager.c;h=a8661bace3332def5359bc410182e93afe07aa74;hp=03a39300df53a6ff9d2268e880f39231c4302376;hb=57ee42cefda6a3f3ea3252e0ab9190b709f0ce49;hpb=a7334b0952ab66c17ee787e36e6d2c5ceb387de6 diff --git a/dbus-manager.c b/dbus-manager.c index 03a39300d..a8661bace 100644 --- a/dbus-manager.c +++ b/dbus-manager.c @@ -38,7 +38,7 @@ " " \ " " \ " " \ - " " \ + " " \ " " \ " " \ " " \ @@ -47,6 +47,30 @@ " " \ " " \ " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ " " \ BUS_PROPERTIES_INTERFACE \ BUS_INTROSPECTABLE_INTERFACE @@ -54,9 +78,51 @@ #define INTROSPECTION_END \ "" -DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusMessage *message, void *data) { - int r; +DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_manager_append_running_as, manager_running_as, ManagerRunningAs); + +static int bus_manager_append_log_target(Manager *m, DBusMessageIter *i, const char *property, void *data) { + const char *t; + + assert(m); + assert(i); + assert(property); + + t = log_target_to_string(log_get_target()); + + if (!dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &t)) + return -ENOMEM; + + return 0; +} + +static int bus_manager_append_log_level(Manager *m, DBusMessageIter *i, const char *property, void *data) { + const char *t; + + assert(m); + assert(i); + assert(property); + + t = log_level_to_string(log_get_max_level()); + + if (!dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &t)) + return -ENOMEM; + + return 0; +} + +static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusMessage *message, void *data) { Manager *m = data; + + const BusProperty properties[] = { + { "org.freedesktop.systemd1", "Version", bus_property_append_string, "s", PACKAGE_VERSION }, + { "org.freedesktop.systemd1", "RunningAs", bus_manager_append_running_as, "s", &m->running_as }, + { "org.freedesktop.systemd1", "BootTimestamp", bus_property_append_uint64, "t", &m->boot_timestamp }, + { "org.freedesktop.systemd1", "LogLevel", bus_manager_append_log_level, "s", NULL }, + { "org.freedesktop.systemd1", "LogTarget", bus_manager_append_log_target, "s", NULL }, + { NULL, NULL, NULL, NULL, NULL } + }; + + int r; DBusError error; DBusMessage *reply = NULL; char * path = NULL; @@ -124,7 +190,7 @@ DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusM DBUS_TYPE_INVALID)) goto oom; - } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1", "GetJob")) { + } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1", "GetJob")) { uint32_t id; Job *j; @@ -150,14 +216,14 @@ DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusM DBUS_TYPE_INVALID)) goto oom; - } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1", "ClearJobs")) { + } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1", "ClearJobs")) { manager_clear_jobs(m); if (!(reply = dbus_message_new_method_return(message))) goto oom; - } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1", "ListUnits")) { + } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1", "ListUnits")) { DBusMessageIter iter, sub; Iterator i; Unit *u; @@ -172,7 +238,7 @@ DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusM goto oom; HASHMAP_FOREACH_KEY(u, k, m->units, i) { - char *unit_path, *job_path; + char *u_path, *j_path; const char *id, *description, *load_state, *active_state, *job_type; DBusMessageIter sub2; uint32_t job_id; @@ -188,21 +254,21 @@ DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusM load_state = unit_load_state_to_string(u->meta.load_state); active_state = unit_active_state_to_string(unit_active_state(u)); - if (!(unit_path = unit_dbus_path(u))) + if (!(u_path = unit_dbus_path(u))) goto oom; if (u->meta.job) { job_id = (uint32_t) u->meta.job->id; - if (!(job_path = job_dbus_path(u->meta.job))) { - free(unit_path); + if (!(j_path = job_dbus_path(u->meta.job))) { + free(u_path); goto oom; } job_type = job_type_to_string(u->meta.job->type); } else { job_id = 0; - job_path = unit_path; + j_path = u_path; job_type = ""; } @@ -210,19 +276,19 @@ DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusM !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &description) || !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &load_state) || !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &active_state) || - !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_OBJECT_PATH, &unit_path) || + !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_OBJECT_PATH, &u_path) || !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_UINT32, &job_id) || !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &job_type) || - !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_OBJECT_PATH, &job_path)) { - free(unit_path); + !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_OBJECT_PATH, &j_path)) { + free(u_path); if (u->meta.job) - free(job_path); + free(j_path); goto oom; } - free(unit_path); + free(u_path); if (u->meta.job) - free(job_path); + free(j_path); if (!dbus_message_iter_close_container(&sub, &sub2)) goto oom; @@ -231,7 +297,7 @@ DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusM if (!dbus_message_iter_close_container(&iter, &sub)) goto oom; - } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1", "ListJobs")) { + } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1", "ListJobs")) { DBusMessageIter iter, sub; Iterator i; Job *j; @@ -245,7 +311,7 @@ DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusM goto oom; HASHMAP_FOREACH(j, m->jobs, i) { - char *unit_path, *job_path; + char *u_path, *j_path; const char *unit, *state, *type; uint32_t id; DBusMessageIter sub2; @@ -258,11 +324,11 @@ DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusM state = job_state_to_string(j->state); type = job_type_to_string(j->type); - if (!(job_path = job_dbus_path(j))) + if (!(j_path = job_dbus_path(j))) goto oom; - if (!(unit_path = unit_dbus_path(j->unit))) { - free(job_path); + if (!(u_path = unit_dbus_path(j->unit))) { + free(j_path); goto oom; } @@ -270,15 +336,15 @@ DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusM !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &unit) || !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &type) || !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &state) || - !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_OBJECT_PATH, &job_path) || - !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_OBJECT_PATH, &unit_path)) { - free(job_path); - free(unit_path); + !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_OBJECT_PATH, &j_path) || + !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_OBJECT_PATH, &u_path)) { + free(j_path); + free(u_path); goto oom; } - free(job_path); - free(unit_path); + free(j_path); + free(u_path); if (!dbus_message_iter_close_container(&sub, &sub2)) goto oom; @@ -287,6 +353,60 @@ DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusM if (!dbus_message_iter_close_container(&iter, &sub)) goto oom; + } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1", "Subscribe")) { + char *client; + + 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 (!(reply = dbus_message_new_method_return(message))) + goto oom; + + } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1", "Unsubscribe")) { + char *client; + + if (!(client = set_remove(m->subscribed, (char*) dbus_message_get_sender(message)))) + return bus_send_error_reply(m, message, NULL, -ENOENT); + + free(client); + + if (!(reply = dbus_message_new_method_return(message))) + goto oom; + + } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1", "Dump")) { + FILE *f; + char *dump = NULL; + size_t size; + + if (!(reply = dbus_message_new_method_return(message))) + goto oom; + + if (!(f = open_memstream(&dump, &size))) + goto oom; + + manager_dump_units(m, f, NULL); + manager_dump_jobs(m, f, NULL); + + if (ferror(f)) { + fclose(f); + free(dump); + goto oom; + } + + fclose(f); + + if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &dump, DBUS_TYPE_INVALID)) { + free(dump); + goto oom; + } + + free(dump); + } else if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Introspectable", "Introspect")) { char *introspection = NULL; FILE *f; @@ -349,7 +469,7 @@ DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusM free(introspection); } else - return bus_default_message_handler(m, message, NULL, NULL); + return bus_default_message_handler(m, message, NULL, properties); free(path);