X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fmachine%2Fmachined-dbus.c;h=22caadfcebff4928421040790264794839e8eb33;hb=cac914e643a50c72893c5478f6886e0978f8fa18;hp=6c4d50b3a2274fdcb961320ea04d16835ed84712;hpb=cba38758b4d49c6fe7c2f0eea255e11ee9df23eb;p=elogind.git diff --git a/src/machine/machined-dbus.c b/src/machine/machined-dbus.c index 6c4d50b3a..22caadfce 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; @@ -551,9 +551,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); } - } - - machine_save(mm); + } else + machine_save(mm); } machine_add_to_gc_queue(mm); @@ -561,7 +560,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; @@ -997,3 +995,48 @@ 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) { + if (_machine) + *_machine = machine; + + return 0; + } + + 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; +}