chiark / gitweb /
refuse to add jobs for names that are not loaded
[elogind.git] / manager.c
index a104e2f401c8689ec572558206ad37699a776020..8e1c64a90c12ad1b319c9f7e2739474b203cd57c 100644 (file)
--- a/manager.c
+++ b/manager.c
@@ -8,6 +8,7 @@
 #include "hashmap.h"
 #include "macro.h"
 #include "strv.h"
+#include "log.h"
 
 Manager* manager_new(void) {
         Manager *m;
@@ -166,7 +167,6 @@ static void transaction_merge_and_delete_job(Manager *m, Job *j, Job *other, Job
                 j->object_list = other->object_list;
         }
 
-
         /* Kill the other job */
         other->subject_list = NULL;
         other->object_list = NULL;
@@ -221,6 +221,7 @@ static int transaction_verify_order_one(Manager *m, Job *j, Job *from, unsigned
 
                 for (k = from; k; k = (k->generation == generation ? k->marker : NULL)) {
                         if (!k->matters_to_anchor) {
+                                log_debug("Breaking order cycle by deleting job %s", name_id(k->name));
                                 manager_transaction_delete_job(m, k);
                                 return -EAGAIN;
                         }
@@ -486,8 +487,17 @@ void manager_transaction_delete_job(Manager *m, Job *j) {
 
         while (j->subject_list)
                 job_dependency_free(j->subject_list);
-        while (j->object_list)
+
+        while (j->object_list) {
+                Job *other = j->object_list->matters ? j->object_list->subject : NULL;
+
                 job_dependency_free(j->object_list);
+
+                if (other) {
+                        log_debug("Deleting job %s, as dependency of job %s", name_id(j->name), name_id(other->name));
+                        manager_transaction_delete_job(m, other);
+                }
+        }
 }
 
 static int transaction_add_job_and_dependencies(Manager *m, JobType type, Name *name, Job *by, bool matters, bool force, Job **_ret) {
@@ -501,6 +511,9 @@ static int transaction_add_job_and_dependencies(Manager *m, JobType type, Name *
         assert(type < _JOB_TYPE_MAX);
         assert(name);
 
+        if (name->meta.state != NAME_LOADED)
+                return -EINVAL;
+
         /* First add the job. */
         if (!(ret = transaction_add_one_job(m, type, name, &is_new)))
                 return -ENOMEM;