From 2c966c038dc32ef39baa176371395cde4e541d01 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sat, 3 Jul 2010 19:46:38 +0200 Subject: [PATCH] unit: simplify things a little by introducing API to add two dependencies in one step --- src/automount.c | 5 +--- src/mount.c | 6 +---- src/path.c | 5 +--- src/service.c | 24 ++++--------------- src/socket.c | 5 +--- src/swap.c | 5 +--- src/unit.c | 62 +++++++++++++++++++++++++++++++++++++++++++++---- src/unit.h | 5 ++++ 8 files changed, 72 insertions(+), 45 deletions(-) diff --git a/src/automount.c b/src/automount.c index b8d7ad25..0689ec77 100644 --- a/src/automount.c +++ b/src/automount.c @@ -125,10 +125,7 @@ int automount_add_one_mount_link(Automount *a, Mount *m) { if (path_equal(a->where, m->where)) return 0; - if ((r = unit_add_dependency(UNIT(m), UNIT_BEFORE, UNIT(a), true)) < 0) - return r; - - if ((r = unit_add_dependency(UNIT(a), UNIT_REQUIRES, UNIT(m), true)) < 0) + if ((r = unit_add_two_dependencies(UNIT(a), UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true)) < 0) return r; return 0; diff --git a/src/mount.c b/src/mount.c index db8551e8..6b38741c 100644 --- a/src/mount.c +++ b/src/mount.c @@ -262,11 +262,7 @@ static int mount_add_target_links(Mount *m) { if ((r = unit_load_related_unit(UNIT(m), ".automount", &am)) < 0) return r; - if ((r = unit_add_dependency(tu, UNIT_WANTS, UNIT(am), true)) < 0) - return r; - - return unit_add_dependency(UNIT(am), UNIT_BEFORE, tu, true); - + return unit_add_two_dependencies(tu, UNIT_AFTER, UNIT_WANTS, UNIT(am), true); } else { if (!noauto && handle) diff --git a/src/path.c b/src/path.c index 80dc3c44..56936fd6 100644 --- a/src/path.c +++ b/src/path.c @@ -65,10 +65,7 @@ int path_add_one_mount_link(Path *p, Mount *m) { if (!path_startswith(s->path, m->where)) continue; - if ((r = unit_add_dependency(UNIT(m), UNIT_BEFORE, UNIT(p), true)) < 0) - return r; - - if ((r = unit_add_dependency(UNIT(p), UNIT_REQUIRES, UNIT(m), true)) < 0) + if ((r = unit_add_two_dependencies(UNIT(p), UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true)) < 0) return r; } diff --git a/src/service.c b/src/service.c index 10e9ccfb..cbc9c955 100644 --- a/src/service.c +++ b/src/service.c @@ -543,10 +543,8 @@ static int service_load_sysv_path(Service *s, const char *path) { if (unit_name_to_type(m) == UNIT_SERVICE) r = unit_add_name(u, m); - else { - if ((r = unit_add_dependency_by_name_inverse(u, UNIT_REQUIRES, m, NULL, true)) >= 0) - r = unit_add_dependency_by_name(u, UNIT_BEFORE, m, NULL, true); - } + else + r = unit_add_two_dependencies_by_name_inverse(u, UNIT_AFTER, UNIT_REQUIRES, m, NULL, true); free(m); @@ -2449,21 +2447,13 @@ static int service_enumerate(Manager *m) { service = unit_follow_merge(service); if (de->d_name[0] == 'S') { - Unit *runlevel_target; - - if ((r = manager_load_unit(m, rcnd_table[i].target, NULL, &runlevel_target)) < 0) - goto finish; - - if ((r = unit_add_dependency(runlevel_target, UNIT_WANTS, service, true)) < 0) - goto finish; - if ((r = unit_add_dependency(service, UNIT_BEFORE, runlevel_target, true)) < 0) + if ((r = unit_add_two_dependencies_by_name_inverse(service, UNIT_AFTER, UNIT_WANTS, rcnd_table[i].target, NULL, true)) < 0) goto finish; } else if (de->d_name[0] == 'K' && (rcnd_table[i].type == RUNLEVEL_DOWN || rcnd_table[i].type == RUNLEVEL_SYSINIT)) { - Unit *shutdown_target; /* We honour K links only for * halt/reboot. For the normal @@ -2481,13 +2471,7 @@ static int service_enumerate(Manager *m) { * too to the shutdown * target.*/ - if ((r = manager_load_unit(m, SPECIAL_SHUTDOWN_TARGET, NULL, &shutdown_target)) < 0) - goto finish; - - if ((r = unit_add_dependency(service, UNIT_CONFLICTS, shutdown_target, true)) < 0) - goto finish; - - if ((r = unit_add_dependency(service, UNIT_BEFORE, shutdown_target, true)) < 0) + if ((r = unit_add_two_dependencies_by_name_inverse(service, UNIT_AFTER, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true)) < 0) goto finish; } } diff --git a/src/socket.c b/src/socket.c index 8edf0ce5..91eea7d2 100644 --- a/src/socket.c +++ b/src/socket.c @@ -204,10 +204,7 @@ int socket_add_one_mount_link(Socket *s, Mount *m) { if (!socket_needs_mount(s, m->where)) return 0; - if ((r = unit_add_dependency(UNIT(m), UNIT_BEFORE, UNIT(s), true)) < 0) - return r; - - if ((r = unit_add_dependency(UNIT(s), UNIT_REQUIRES, UNIT(m), true)) < 0) + if ((r = unit_add_two_dependencies(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true)) < 0) return r; return 0; diff --git a/src/swap.c b/src/swap.c index 2e3e995c..d093c2e7 100644 --- a/src/swap.c +++ b/src/swap.c @@ -77,10 +77,7 @@ int swap_add_one_mount_link(Swap *s, Mount *m) { if (!path_startswith(s->what, m->where)) return 0; - if ((r = unit_add_dependency(UNIT(m), UNIT_BEFORE, UNIT(s), true)) < 0) - return r; - - if ((r = unit_add_dependency(UNIT(s), UNIT_REQUIRES, UNIT(m), true)) < 0) + if ((r = unit_add_two_dependencies(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true)) < 0) return r; return 0; diff --git a/src/unit.c b/src/unit.c index 9fed5a0f..8c495b46 100644 --- a/src/unit.c +++ b/src/unit.c @@ -1324,6 +1324,20 @@ fail: return r; } +int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference) { + int r; + + assert(u); + + if ((r = unit_add_dependency(u, d, other, add_reference)) < 0) + return r; + + if ((r = unit_add_dependency(u, e, other, add_reference)) < 0) + return r; + + return 0; +} + static const char *resolve_template(Unit *u, const char *name, const char*path, char **p) { char *s; @@ -1378,6 +1392,27 @@ finish: return r; } +int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) { + Unit *other; + int r; + char *s; + + assert(u); + assert(name || path); + + if (!(name = resolve_template(u, name, path, &s))) + return -ENOMEM; + + if ((r = manager_load_unit(u->meta.manager, name, path, &other)) < 0) + goto finish; + + r = unit_add_two_dependencies(u, d, e, other, add_reference); + +finish: + free(s); + return r; +} + int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) { Unit *other; int r; @@ -1399,6 +1434,28 @@ finish: return r; } +int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) { + Unit *other; + int r; + char *s; + + assert(u); + assert(name || path); + + if (!(name = resolve_template(u, name, path, &s))) + return -ENOMEM; + + if ((r = manager_load_unit(u->meta.manager, name, path, &other)) < 0) + goto finish; + + if ((r = unit_add_two_dependencies(other, d, e, u, add_reference)) < 0) + goto finish; + +finish: + free(s); + return r; +} + int set_unit_path(const char *p) { char *cwd, *c; int r; @@ -1907,10 +1964,7 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) { if (r < 0) return r; - if ((r = unit_add_dependency(u, UNIT_AFTER, device, true)) < 0) - return r; - - if ((r = unit_add_dependency(u, UNIT_REQUIRES, device, true)) < 0) + if ((r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_REQUIRES, device, true)) < 0) return r; if (wants) diff --git a/src/unit.h b/src/unit.h index aa80aadb..d3dd5dec 100644 --- a/src/unit.h +++ b/src/unit.h @@ -367,8 +367,13 @@ void unit_free(Unit *u); int unit_add_name(Unit *u, const char *name); int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference); +int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference); + int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *filename, bool add_reference); +int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference); + int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *filename, bool add_reference); +int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference); int unit_add_exec_dependencies(Unit *u, ExecContext *c); -- 2.39.5