X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fmachine%2Fmachined-dbus.c;h=71f985345a1579aa1836a9203aa759d83c4152a5;hb=46e65dcc3a522b5e992e165b5e61d14254026859;hp=b55266249bf322d2f3a70bcf1d57a3359d9398d7;hpb=a658cafa98ab55ea948c29bc87eb3945d515fb41;p=elogind.git diff --git a/src/machine/machined-dbus.c b/src/machine/machined-dbus.c index b55266249..71f985345 100644 --- a/src/machine/machined-dbus.c +++ b/src/machine/machined-dbus.c @@ -37,6 +37,7 @@ #include "unit-name.h" #include "bus-util.h" #include "time-util.h" +#include "cgroup-util.h" #include "machined.h" static bool valid_machine_name(const char *p) { @@ -86,17 +87,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,37 +343,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) { - _cleanup_strv_free_ char **l = NULL; - Machine *machine = NULL; - Manager *m = userdata; - 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; - l = NULL; - - return 1; -} - int match_job_removed(sd_bus *bus, sd_bus_message *message, void *userdata) { const char *path, *result, *unit; Manager *m = userdata; @@ -711,3 +689,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; +}