X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fmachine%2Fmachined-dbus.c;h=2b622d1793f00fccc5fdd816f9fe4863c60e866b;hb=71fda00f320379f5cbee8e118848de98caaa229d;hp=1e8bc609a3598340221e7a64a832e73b066fd72c;hpb=554604b3073467af75dc94fac9e2343148603289;p=elogind.git diff --git a/src/machine/machined-dbus.c b/src/machine/machined-dbus.c index 1e8bc609a..2b622d179 100644 --- a/src/machine/machined-dbus.c +++ b/src/machine/machined-dbus.c @@ -40,6 +40,7 @@ #include "unit-name.h" #include "bus-errors.h" #include "virt.h" +#include "cgroup-util.h" #define BUS_MANAGER_INTERFACE \ " \n" \ @@ -117,7 +118,6 @@ static bool valid_machine_name(const char *p) { static int bus_manager_create_machine(Manager *manager, DBusMessage *message) { const char *name, *service, *class, *root_directory; - _cleanup_free_ char *p = NULL; DBusMessageIter iter, sub; MachineClass c; uint32_t leader; @@ -203,7 +203,7 @@ static int bus_manager_create_machine(Manager *manager, DBusMessage *message) { r = manager_add_machine(manager, name, &m); if (r < 0) - goto fail; + return r; m->leader = leader; m->class = c; @@ -234,8 +234,7 @@ static int bus_manager_create_machine(Manager *manager, DBusMessage *message) { return 0; fail: - if (m) - machine_add_to_gc_queue(m); + machine_add_to_gc_queue(m); return r; } @@ -543,7 +542,6 @@ DBusHandlerResult bus_message_filter( if (streq_ptr(path, mm->scope_job)) { free(mm->scope_job); mm->scope_job = NULL; - machine_save(mm); if (mm->started) { if (streq(result, "done")) @@ -552,7 +550,8 @@ DBusHandlerResult bus_message_filter( dbus_set_error(&error, BUS_ERROR_JOB_FAILED, "Start job for unit %s failed with '%s'", unit, result); machine_send_create_reply(mm, &error); } - } + } else + machine_save(mm); } machine_add_to_gc_queue(mm); @@ -560,7 +559,6 @@ DBusHandlerResult bus_message_filter( } else if (dbus_message_is_signal(message, "org.freedesktop.DBus.Properties", "PropertiesChanged")) { - _cleanup_dbus_message_unref_ DBusMessage *reply = NULL; _cleanup_free_ char *unit = NULL; const char *path; @@ -996,3 +994,43 @@ int manager_unit_is_active(Manager *manager, const char *unit) { return !streq(state, "inactive") && !streq(state, "failed"); } + +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; +} + +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) + return r; + + mm = hashmap_get(m->machine_units, unit); + if (!mm) + return 0; + + *machine = mm; + return 1; +}