X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=manager.c;h=86ed086eb31c3f48f586a9b38831f2dbcc7d5d2d;hp=97c99e50465538f100b39f46c4a53cce70956c3a;hb=a66d02c3290008d50b2b52f84cfbf46a546ba831;hpb=223dabab498a89e008a2a5cebb24bd168c80bae5 diff --git a/manager.c b/manager.c index 97c99e504..86ed086eb 100644 --- a/manager.c +++ b/manager.c @@ -2,6 +2,7 @@ #include #include +#include #include "manager.h" #include "hashmap.h" @@ -91,28 +92,28 @@ int manager_add_job(Manager *m, JobType type, Name *name, JobMode mode, Job **_r goto fail; if (type == JOB_START || type == JOB_VERIFY_STARTED || type == JOB_RESTART_FINISH) { - SET_FOREACH(dep, ret->name->meta.requires, state) + SET_FOREACH(dep, ret->name->meta.dependencies[NAME_REQUIRES], state) if ((r = manager_add_job(m, type, dep, mode, NULL)) < 0) goto fail; - SET_FOREACH(dep, ret->name->meta.soft_requires, state) + SET_FOREACH(dep, ret->name->meta.dependencies[NAME_SOFT_REQUIRES], state) if ((r = manager_add_job(m, type, dep, JOB_FAIL, NULL)) < 0) goto fail; - SET_FOREACH(dep, ret->name->meta.wants, state) + SET_FOREACH(dep, ret->name->meta.dependencies[NAME_WANTS], state) if ((r = manager_add_job(m, type, dep, JOB_FAIL, NULL)) < 0) goto fail; - SET_FOREACH(dep, ret->name->meta.requisite, state) + SET_FOREACH(dep, ret->name->meta.dependencies[NAME_REQUISITE], state) if ((r = manager_add_job(m, JOB_VERIFY_STARTED, dep, mode, NULL)) < 0) goto fail; - SET_FOREACH(dep, ret->name->meta.soft_requisite, state) + SET_FOREACH(dep, ret->name->meta.dependencies[NAME_SOFT_REQUISITE], state) if ((r = manager_add_job(m, JOB_VERIFY_STARTED, dep, JOB_FAIL, NULL)) < 0) goto fail; - SET_FOREACH(dep, ret->name->meta.conflicts, state) + SET_FOREACH(dep, ret->name->meta.dependencies[NAME_CONFLICTS], state) if ((r = manager_add_job(m, type, dep, mode, NULL)) < 0) goto fail; } else if (type == JOB_STOP || type == JOB_RESTART || type == JOB_TRY_RESTART) { - SET_FOREACH(dep, ret->name->meta.required_by, state) + SET_FOREACH(dep, ret->name->meta.dependencies[NAME_REQUIRED_BY], state) if ((r = manager_add_job(m, type, dep, mode, NULL)) < 0) goto fail; } @@ -142,17 +143,18 @@ Name *manager_get_name(Manager *m, const char *name) { return hashmap_get(m->names, name); } -static int detect_type(Name *name) { - char **n; +static int verify_type(Name *name) { + char *n; + void *state; assert(name); - name->meta.type = _NAME_TYPE_INVALID; + /* Checks that all aliases of this name have the same and valid type */ - STRV_FOREACH(n, name->meta.names) { + SET_FOREACH(n, name->meta.names, state) { NameType t; - if ((t = name_type_from_string(*n)) == _NAME_TYPE_INVALID) + if ((t = name_type_from_string(n)) == _NAME_TYPE_INVALID) return -EINVAL; if (name->meta.type == _NAME_TYPE_INVALID) { @@ -164,6 +166,9 @@ static int detect_type(Name *name) { return -EINVAL; } + if (name->meta.type == _NAME_TYPE_INVALID) + return -EINVAL; + return 0; } @@ -209,7 +214,7 @@ static int load(Name *name) { if (name->meta.state != NAME_STUB) return 0; - if ((r = detect_type(name)) < 0) + if ((r = verify_type(name)) < 0) return r; if (name->meta.type == NAME_SERVICE) { @@ -278,6 +283,7 @@ int manager_load_name(Manager *m, const char *name, Name **_ret) { Name *ret; NameType t; int r; + char *n; assert(m); assert(name); @@ -300,8 +306,14 @@ int manager_load_name(Manager *m, const char *name, Name **_ret) { ret->meta.type = t; - if (!(ret->meta.names = strv_new(name, NULL))) { + if (!(n = strdup(name))) { + name_free(ret); + return -ENOMEM; + } + + if (set_put(ret->meta.names, n) < 0) { name_free(ret); + free(n); return -ENOMEM; } @@ -321,3 +333,25 @@ finish: *_ret = ret; return 0; } + +void manager_dump_jobs(Manager *s, FILE *f) { + void *state; + Job *j; + + assert(s); + assert(f); + + HASHMAP_FOREACH(j, s->jobs, state) + job_dump(j, f); +} + +void manager_dump_names(Manager *s, FILE *f) { + void *state; + Name *n; + + assert(s); + assert(f); + + HASHMAP_FOREACH(n, s->names, state) + name_dump(n, f); +}