X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=manager.c;h=a104e2f401c8689ec572558206ad37699a776020;hp=a870db6cce69a89d5afaa242bf5c301e4871c4f3;hb=5899f3b7f62151dade30010370fb5d2bcdb93d3a;hpb=e5b5ae50f02d7814f37b15329da2adce0fb30825 diff --git a/manager.c b/manager.c index a870db6cc..a104e2f40 100644 --- a/manager.c +++ b/manager.c @@ -8,7 +8,6 @@ #include "hashmap.h" #include "macro.h" #include "strv.h" -#include "load-fragment.h" Manager* manager_new(void) { Manager *m; @@ -122,7 +121,7 @@ static int types_merge(JobType *a, JobType b) { return -EEXIST; } -static void manager_merge_and_delete_prospective_job(Manager *m, Job *j, Job *other, JobType t) { +static void transaction_merge_and_delete_job(Manager *m, Job *j, Job *other, JobType t) { JobDependency *l, *last; assert(j); @@ -191,17 +190,17 @@ static int transaction_merge_jobs(Manager *m) { while ((k = j->transaction_next)) { if (j->linked) { - manager_merge_and_delete_prospective_job(m, k, j, t); + transaction_merge_and_delete_job(m, k, j, t); j = k; } else - manager_merge_and_delete_prospective_job(m, j, k, t); + transaction_merge_and_delete_job(m, j, k, t); } assert(!j->transaction_next); assert(!j->transaction_prev); } - return r; + return 0; } static int transaction_verify_order_one(Manager *m, Job *j, Job *from, unsigned generation) { @@ -212,12 +211,12 @@ static int transaction_verify_order_one(Manager *m, Job *j, Job *from, unsigned assert(m); assert(j); - /* Did we find a loop? */ + /* Did we find a cycle? */ if (j->marker && j->generation == generation) { Job *k; /* So, we already have been here. We have a - * loop. Let's try to break it. We go backwards in our + * cycle. Let's try to break it. We go backwards in our * path and try to find a suitable job to remove. */ for (k = from; k; k = (k->generation == generation ? k->marker : NULL)) { @@ -227,7 +226,7 @@ static int transaction_verify_order_one(Manager *m, Job *j, Job *from, unsigned } /* Check if this in fact was the beginning of - * the loop */ + * the cycle */ if (k == j) break; } @@ -275,7 +274,7 @@ static int transaction_verify_order(Manager *m, unsigned *generation) { if ((r = transaction_verify_order_one(m, j, NULL, (*generation)++)) < 0) { - /* There was a loop, but it was fixed, + /* There was a cycleq, but it was fixed, * we need to restart our algorithm */ if (r == -EAGAIN) { again = true; @@ -421,7 +420,7 @@ rollback: return r; } -static Job* transaction_add_job(Manager *m, JobType type, Name *name, bool *is_new) { +static Job* transaction_add_one_job(Manager *m, JobType type, Name *name, bool *is_new) { Job *j, *f; int r; @@ -491,7 +490,7 @@ void manager_transaction_delete_job(Manager *m, Job *j) { job_dependency_free(j->object_list); } -static int real_add_job(Manager *m, JobType type, Name *name, Job *by, bool matters, bool force, Job **_ret) { +static int transaction_add_job_and_dependencies(Manager *m, JobType type, Name *name, Job *by, bool matters, bool force, Job **_ret) { Job *ret; void *state; Name *dep; @@ -503,7 +502,7 @@ static int real_add_job(Manager *m, JobType type, Name *name, Job *by, bool matt assert(name); /* First add the job. */ - if (!(ret = transaction_add_job(m, type, name, &is_new))) + if (!(ret = transaction_add_one_job(m, type, name, &is_new))) return -ENOMEM; /* Then, add a link to the job. */ @@ -514,28 +513,28 @@ static int real_add_job(Manager *m, JobType type, Name *name, Job *by, bool matt /* Finally, recursively add in all dependencies. */ if (type == JOB_START || type == JOB_RELOAD_OR_START) { SET_FOREACH(dep, ret->name->meta.dependencies[NAME_REQUIRES], state) - if ((r = real_add_job(m, JOB_START, dep, ret, true, force, NULL)) < 0) + if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, true, force, NULL)) < 0) goto fail; SET_FOREACH(dep, ret->name->meta.dependencies[NAME_SOFT_REQUIRES], state) - if ((r = real_add_job(m, JOB_START, dep, ret, !force, force, NULL)) < 0) + if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, !force, force, NULL)) < 0) goto fail; SET_FOREACH(dep, ret->name->meta.dependencies[NAME_WANTS], state) - if ((r = real_add_job(m, JOB_START, dep, ret, false, force, NULL)) < 0) + if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, false, force, NULL)) < 0) goto fail; SET_FOREACH(dep, ret->name->meta.dependencies[NAME_REQUISITE], state) - if ((r = real_add_job(m, JOB_VERIFY_STARTED, dep, ret, true, force, NULL)) < 0) + if ((r = transaction_add_job_and_dependencies(m, JOB_VERIFY_STARTED, dep, ret, true, force, NULL)) < 0) goto fail; SET_FOREACH(dep, ret->name->meta.dependencies[NAME_SOFT_REQUISITE], state) - if ((r = real_add_job(m, JOB_VERIFY_STARTED, dep, ret, !force, force, NULL)) < 0) + if ((r = transaction_add_job_and_dependencies(m, JOB_VERIFY_STARTED, dep, ret, !force, force, NULL)) < 0) goto fail; SET_FOREACH(dep, ret->name->meta.dependencies[NAME_CONFLICTS], state) - if ((r = real_add_job(m, JOB_STOP, dep, ret, true, force, NULL)) < 0) + if ((r = transaction_add_job_and_dependencies(m, JOB_STOP, dep, ret, true, force, NULL)) < 0) goto fail; } else if (type == JOB_STOP || type == JOB_RESTART || type == JOB_TRY_RESTART) { SET_FOREACH(dep, ret->name->meta.dependencies[NAME_REQUIRED_BY], state) - if ((r = real_add_job(m, type, dep, ret, true, force, NULL)) < 0) + if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, true, force, NULL)) < 0) goto fail; } @@ -557,7 +556,7 @@ int manager_add_job(Manager *m, JobType type, Name *name, JobMode mode, bool for assert(name); assert(mode < _JOB_MODE_MAX); - if ((r = real_add_job(m, type, name, NULL, true, force, &ret))) { + if ((r = transaction_add_job_and_dependencies(m, type, name, NULL, true, force, &ret))) { transaction_abort(m); return r; } @@ -584,121 +583,6 @@ Name *manager_get_name(Manager *m, const char *name) { return hashmap_get(m->names, name); } -static int verify_type(Name *name) { - char *n; - void *state; - - assert(name); - - /* Checks that all aliases of this name have the same and valid type */ - - SET_FOREACH(n, name->meta.names, state) { - NameType t; - - if ((t = name_type_from_string(n)) == _NAME_TYPE_INVALID) - return -EINVAL; - - if (name->meta.type == _NAME_TYPE_INVALID) { - name->meta.type = t; - continue; - } - - if (name->meta.type != t) - return -EINVAL; - } - - if (name->meta.type == _NAME_TYPE_INVALID) - return -EINVAL; - - return 0; -} - -static int service_load_sysv(Service *s) { - assert(s); - - /* Load service data from SysV init scripts, preferably with - * LSB headers ... */ - - return 0; -} - -static int name_load_fstab(Name *n) { - assert(n); - assert(n->meta.type == NAME_MOUNT || n->meta.type == NAME_AUTOMOUNT); - - /* Load mount data from /etc/fstab */ - - return 0; -} - -static int snapshot_load(Snapshot *s) { - assert(s); - - /* Load snapshots from disk */ - - return 0; -} - -static int name_load_dropin(Name *n) { - assert(n); - - /* Load dependencies from drop-in directories */ - - return 0; -} - -static int load(Name *name) { - int r; - - assert(name); - - if (name->meta.state != NAME_STUB) - return 0; - - if ((r = verify_type(name)) < 0) - return r; - - if (name->meta.type == NAME_SERVICE) { - - /* Load a .service file */ - if ((r = name_load_fragment(name)) == 0) - goto finish; - - /* Load a classic init script */ - if (r == -ENOENT) - if ((r = service_load_sysv(SERVICE(name))) == 0) - goto finish; - - } else if (name->meta.type == NAME_MOUNT || - name->meta.type == NAME_AUTOMOUNT) { - - if ((r = name_load_fstab(name)) == 0) - goto finish; - - } else if (name->meta.type == NAME_SNAPSHOT) { - - if ((r = snapshot_load(SNAPSHOT(name))) == 0) - goto finish; - - } else { - if ((r = name_load_fragment(name)) == 0) - goto finish; - } - - name->meta.state = NAME_FAILED; - return r; - -finish: - if ((r = name_load_dropin(name)) < 0) - return r; - - if ((r = name_link_names(name, true)) < 0) - return r; - - name->meta.state = NAME_LOADED; - return 0; -} - static int dispatch_load_queue(Manager *m) { Meta *meta; @@ -714,7 +598,7 @@ static int dispatch_load_queue(Manager *m) { * tries to load its data until the queue is empty */ while ((meta = m->load_queue)) { - load(NAME(meta)); + name_load(NAME(meta)); LIST_REMOVE(Meta, m->load_queue, meta); } @@ -778,7 +662,7 @@ finish: return 0; } -void manager_dump_jobs(Manager *s, FILE *f) { +void manager_dump_jobs(Manager *s, FILE *f, const char *prefix) { void *state; Job *j; @@ -786,10 +670,10 @@ void manager_dump_jobs(Manager *s, FILE *f) { assert(f); HASHMAP_FOREACH(j, s->jobs, state) - job_dump(j, f); + job_dump(j, f, prefix); } -void manager_dump_names(Manager *s, FILE *f) { +void manager_dump_names(Manager *s, FILE *f, const char *prefix) { void *state; Name *n; const char *t; @@ -799,5 +683,16 @@ void manager_dump_names(Manager *s, FILE *f) { HASHMAP_FOREACH_KEY(n, t, s->names, state) if (name_id(n) == t) - name_dump(n, f); + name_dump(n, f, prefix); +} + +void manager_clear_jobs(Manager *m) { + Job *j; + + assert(m); + + transaction_abort(m); + + while ((j = hashmap_first(m->jobs))) + job_free(j); }