X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fmachine%2Fmachined.c;h=20e6f7cd63e92c2ae192eefa2d4e5407b3478a0c;hb=8a8d55f2c104cf99efe5f244fc4857a15e9f60de;hp=a5f529384befd2011e660b75148e0e723acc3cef;hpb=d3e84ddb885e9d5f0ae9930eb905910e3a81f157;p=elogind.git diff --git a/src/machine/machined.c b/src/machine/machined.c index a5f529384..20e6f7cd6 100644 --- a/src/machine/machined.c +++ b/src/machine/machined.c @@ -53,12 +53,14 @@ Manager *manager_new(void) { return NULL; } - r = sd_event_new(&m->event); + r = sd_event_default(&m->event); if (r < 0) { manager_free(m); return NULL; } + sd_event_set_watchdog(m->event, true); + return m; } @@ -80,47 +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) - 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_enumerate_machines(Manager *m) { _cleanup_closedir_ DIR *d = NULL; struct dirent *de; @@ -145,6 +106,10 @@ int manager_enumerate_machines(Manager *m) { if (!dirent_is_file(de)) continue; + /* Ignore symlinks that map the unit name to the machine */ + if (startswith(de->d_name, "unit:")) + continue; + k = manager_add_machine(m, de->d_name, &machine); if (k < 0) { log_error("Failed to add machine by file name %s: %s", de->d_name, strerror(-k)); @@ -170,7 +135,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; @@ -258,17 +223,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)); @@ -319,26 +279,23 @@ int manager_startup(Manager *m) { return 0; } -int manager_run(Manager *m) { - int r; +static bool check_idle(void *userdata) { + Manager *m = userdata; - assert(m); + manager_gc(m, true); - for (;;) { - r = sd_event_get_state(m->event); - if (r < 0) - return r; - if (r == SD_EVENT_FINISHED) - return 0; - - manager_gc(m, true); + return hashmap_isempty(m->machines); +} - r = sd_event_run(m->event, (uint64_t) -1); - if (r < 0) - return r; - } +int manager_run(Manager *m) { + assert(m); - return 0; + return bus_event_loop_with_idle( + m->event, + m->bus, + "org.freedesktop.machine1", + DEFAULT_EXIT_USEC, + check_idle, m); } int main(int argc, char *argv[]) {