chiark / gitweb /
manager: recheck unit paths on daemon reload
[elogind.git] / src / manager.c
index e37aa836027ddb3da7da60a137b340daf21b091a..b4b963a66265e5c006aabb1c4e1b0a6530befbf6 100644 (file)
@@ -241,6 +241,12 @@ static int manager_find_paths(Manager *m) {
 
         assert(m);
 
+        /* Unset previous data, in case we are called on reload */
+        strv_free(m->unit_path);
+        strv_free(m->sysvinit_path);
+        strv_free(m->sysvrcnd_path);
+        m->unit_path = m->sysvinit_path = m->sysvrcnd_path = NULL;
+
         /* First priority is whatever has been passed to us via env
          * vars */
         if ((e = getenv("SYSTEMD_UNIT_PATH")))
@@ -543,13 +549,24 @@ static void manager_clear_jobs_and_units(Manager *m) {
 
         assert(m);
 
-        manager_dispatch_cleanup_queue(m);
-
         while ((j = hashmap_first(m->transaction_jobs)))
                 job_free(j);
 
         while ((u = hashmap_first(m->units)))
                 unit_free(u);
+
+        manager_dispatch_cleanup_queue(m);
+
+        assert(!m->load_queue);
+        assert(!m->run_queue);
+        assert(!m->dbus_unit_queue);
+        assert(!m->dbus_job_queue);
+        assert(!m->cleanup_queue);
+        assert(!m->gc_queue);
+
+        assert(hashmap_isempty(m->transaction_jobs));
+        assert(hashmap_isempty(m->jobs));
+        assert(hashmap_isempty(m->units));
 }
 
 void manager_free(Manager *m) {
@@ -2335,6 +2352,10 @@ int manager_reload(Manager *m) {
         /* From here on there is no way back. */
         manager_clear_jobs_and_units(m);
 
+        /* Find new unit paths */
+        if ((q = manager_find_paths(m)) < 0)
+                r = q;
+
         /* First, enumerate what we can from all config files */
         if ((q = manager_enumerate(m)) < 0)
                 r = q;