chiark / gitweb /
machined: fix enumeration of existing machines on restart
[elogind.git] / src / machine / machined.c
index d6dd984e7673947a34bfa4c75f2dc7c29be9d739..20e6f7cd63e92c2ae192eefa2d4e5407b3478a0c 100644 (file)
@@ -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;
 }
 
@@ -104,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));
@@ -129,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;
@@ -217,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));
@@ -278,26 +279,23 @@ int manager_startup(Manager *m) {
         return 0;
 }
 
-int manager_run(Manager *m) {
-        int r;
-
-        assert(m);
+static bool check_idle(void *userdata) {
+        Manager *m = userdata;
 
-        for (;;) {
-                r = sd_event_get_state(m->event);
-                if (r < 0)
-                        return r;
-                if (r == SD_EVENT_FINISHED)
-                        return 0;
+        manager_gc(m, true);
 
-                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[]) {