X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fmachine%2Fmachined.c;h=6550075b564412f51c4055435a95c2c539d5a9e5;hb=eca7a27add5aa3ec85c272fc4cef287fdca034ce;hp=63915519c11cf0044f377806852098966fafc3f6;hpb=c335068380fe8c9d843cdb2cf8a00f822cfabed3;p=elogind.git diff --git a/src/machine/machined.c b/src/machine/machined.c index 63915519c..6550075b5 100644 --- a/src/machine/machined.c +++ b/src/machine/machined.c @@ -46,18 +46,21 @@ Manager *manager_new(void) { m->machines = hashmap_new(string_hash_func, string_compare_func); m->machine_units = hashmap_new(string_hash_func, string_compare_func); + m->machine_leaders = hashmap_new(trivial_hash_func, trivial_compare_func); - r = sd_event_new(&m->event); - if (r < 0) { + if (!m->machines || !m->machine_units || !m->machine_leaders) { manager_free(m); return NULL; } - if (!m->machines || !m->machine_units) { + r = sd_event_default(&m->event); + if (r < 0) { manager_free(m); return NULL; } + sd_event_set_watchdog(m->event, true); + return m; } @@ -71,6 +74,7 @@ void manager_free(Manager *m) { hashmap_free(m->machines); hashmap_free(m->machine_units); + hashmap_free(m->machine_leaders); sd_bus_unref(m->bus); sd_event_unref(m->event); @@ -78,46 +82,6 @@ void manager_free(Manager *m) { free(m); } -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; -} - int manager_enumerate_machines(Manager *m) { _cleanup_closedir_ DIR *d = NULL; struct dirent *de; @@ -167,7 +131,7 @@ static int manager_connect_bus(Manager *m) { assert(m); assert(!m->bus); - r = sd_bus_open_system(&m->bus); + r = sd_bus_default_system(&m->bus); if (r < 0) { log_error("Failed to connect to system bus: %s", strerror(-r)); return r; @@ -255,17 +219,12 @@ static int manager_connect_bus(Manager *m) { return r; } - r = sd_bus_request_name(m->bus, "org.freedesktop.machine1", SD_BUS_NAME_DO_NOT_QUEUE); + r = sd_bus_request_name(m->bus, "org.freedesktop.machine1", 0); if (r < 0) { log_error("Failed to register name: %s", strerror(-r)); return r; } - if (r != SD_BUS_NAME_PRIMARY_OWNER) { - log_error("Failed to acquire name."); - return -EEXIST; - } - r = sd_bus_attach_event(m->bus, m->event, 0); if (r < 0) { log_error("Failed to attach bus to event loop: %s", strerror(-r)); @@ -284,7 +243,7 @@ void manager_gc(Manager *m, bool drop_not_started) { LIST_REMOVE(gc_queue, m->machine_gc_queue, machine); machine->in_gc_queue = false; - if (machine_check_gc(machine, drop_not_started) == 0) { + if (!machine_check_gc(machine, drop_not_started)) { machine_stop(machine); machine_free(machine); }