X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fmachine%2Fmachined-dbus.c;h=d60be0d3ba02db8b88755b047f7fb47ec9211c51;hp=6035597913ec6dc0295e80da8a58a48fe7a5a1f6;hb=ab49725fd8587ef2b90dd0a67b2c915bc772d089;hpb=c335068380fe8c9d843cdb2cf8a00f822cfabed3 diff --git a/src/machine/machined-dbus.c b/src/machine/machined-dbus.c index 603559791..d60be0d3b 100644 --- a/src/machine/machined-dbus.c +++ b/src/machine/machined-dbus.c @@ -86,17 +86,25 @@ static int method_get_machine_by_pid(sd_bus *bus, sd_bus_message *message, void _cleanup_free_ char *p = NULL; Manager *m = userdata; Machine *machine = NULL; - uint32_t pid; + pid_t pid; int r; assert(bus); assert(message); assert(m); + assert_cc(sizeof(pid_t) == sizeof(uint32_t)); + r = sd_bus_message_read(message, "u", &pid); if (r < 0) return sd_bus_reply_method_errno(bus, message, r, NULL); + if (pid == 0) { + r = sd_bus_get_owner_pid(bus, sd_bus_message_get_sender(message), &pid); + if (r < 0) + return sd_bus_reply_method_errno(bus, message, r, NULL); + } + r = manager_get_machine_by_pid(m, pid, &machine); if (r < 0) return sd_bus_reply_method_errno(bus, message, r, NULL); @@ -334,35 +342,6 @@ const sd_bus_vtable manager_vtable[] = { SD_BUS_VTABLE_END }; -int machine_node_enumerator(sd_bus *bus, const char *path, char ***nodes, void *userdata) { - Machine *machine = NULL; - Manager *m = userdata; - char **l = NULL; - Iterator i; - int r; - - assert(bus); - assert(path); - assert(nodes); - - HASHMAP_FOREACH(machine, m->machines, i) { - char *p; - - p = machine_bus_path(machine); - if (!p) - return -ENOMEM; - - r = strv_push(&l, p); - if (r < 0) { - free(p); - return r; - } - } - - *nodes = l; - return 1; -} - int match_job_removed(sd_bus *bus, sd_bus_message *message, void *userdata) { const char *path, *result, *unit; Manager *m = userdata; @@ -456,6 +435,8 @@ int match_unit_removed(sd_bus *bus, sd_bus_message *message, void *userdata) { int match_reloading(sd_bus *bus, sd_bus_message *message, void *userdata) { Manager *m = userdata; + Machine *machine; + Iterator i; int b, r; assert(bus); @@ -466,16 +447,14 @@ int match_reloading(sd_bus *bus, sd_bus_message *message, void *userdata) { return 0; } - /* systemd finished reloading, let's recheck all our machines */ - if (!b) { - Machine *machine; - Iterator i; + if (b) + return 0; - log_debug("System manager has been reloaded, rechecking machines..."); + /* systemd finished reloading, let's recheck all our machines */ + log_debug("System manager has been reloaded, rechecking machines..."); - HASHMAP_FOREACH(machine, m->machines, i) - machine_add_to_gc_queue(machine); - } + HASHMAP_FOREACH(machine, m->machines, i) + machine_add_to_gc_queue(machine); return 0; } @@ -507,7 +486,7 @@ int manager_start_scope( if (r < 0) return r; - r = sd_bus_message_append(m, "ss", scope, "fail"); + r = sd_bus_message_append(m, "ss", strempty(scope), "fail"); if (r < 0) return r; @@ -620,23 +599,18 @@ int manager_stop_unit(Manager *manager, const char *unit, sd_bus_error *error, c } int manager_kill_unit(Manager *manager, const char *unit, KillWho who, int signo, sd_bus_error *error) { - _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; - int r; - assert(manager); assert(unit); - r = sd_bus_call_method( + return sd_bus_call_method( manager->bus, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "KillUnit", error, - &reply, + NULL, "ssi", unit, who == KILL_LEADER ? "main" : "all", signo); - - return r; } int manager_unit_is_active(Manager *manager, const char *unit) { @@ -714,3 +688,44 @@ int manager_job_is_active(Manager *manager, const char *path) { return true; } + +int manager_get_machine_by_pid(Manager *m, pid_t pid, Machine **machine) { + _cleanup_free_ char *unit = NULL; + Machine *mm; + int r; + + assert(m); + assert(pid >= 1); + assert(machine); + + r = cg_pid_get_unit(pid, &unit); + if (r < 0) + mm = hashmap_get(m->machine_leaders, UINT_TO_PTR(pid)); + else + mm = hashmap_get(m->machine_units, unit); + + if (!mm) + return 0; + + *machine = mm; + return 1; +} + +int manager_add_machine(Manager *m, const char *name, Machine **_machine) { + Machine *machine; + + assert(m); + assert(name); + + machine = hashmap_get(m->machines, name); + if (!machine) { + machine = machine_new(m, name); + if (!machine) + return -ENOMEM; + } + + if (_machine) + *_machine = machine; + + return 0; +}