X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Funit.c;h=8b5714838dd8c6ccfcd42fad07e49e3a7702fa1c;hb=057fbb58851f97cfcf4d90d5d3c539ac6f8ab13d;hp=79b9e2bb8a0f8dc9563a6f6e42439e8bdb03a5fb;hpb=6124958c7bda3fed9b079e8217781480797703f5;p=elogind.git diff --git a/src/unit.c b/src/unit.c index 79b9e2bb8..8b5714838 100644 --- a/src/unit.c +++ b/src/unit.c @@ -69,6 +69,7 @@ Unit *unit_new(Manager *m) { u->meta.manager = m; u->meta.type = _UNIT_TYPE_INVALID; u->meta.deserialized_job = _JOB_TYPE_INVALID; + u->meta.default_dependencies = true; return u; } @@ -281,7 +282,8 @@ void unit_add_to_dbus_queue(Unit *u) { if (u->meta.load_state == UNIT_STUB || u->meta.in_dbus_queue) return; - if (set_isempty(u->meta.manager->subscribed)) { + /* Shortcut things if nobody cares */ + if (!bus_has_subscriber(u->meta.manager)) { u->meta.sent_dbus_new_signal = true; return; } @@ -593,8 +595,7 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) { "%s\tActive Enter Timestamp: %s\n" "%s\tActive Exit Timestamp: %s\n" "%s\tInactive Enter Timestamp: %s\n" - "%s\tGC Check Good: %s\n" - "%s\tOnly By Dependency: %s\n", + "%s\tGC Check Good: %s\n", prefix, u->meta.id, prefix, unit_description(u), prefix, strna(u->meta.instance), @@ -604,8 +605,7 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) { prefix, strna(format_timestamp(timestamp2, sizeof(timestamp2), u->meta.active_enter_timestamp.realtime)), prefix, strna(format_timestamp(timestamp3, sizeof(timestamp3), u->meta.active_exit_timestamp.realtime)), prefix, strna(format_timestamp(timestamp4, sizeof(timestamp4), u->meta.inactive_enter_timestamp.realtime)), - prefix, yes_no(unit_check_gc(u)), - prefix, yes_no(u->meta.only_by_dependency)); + prefix, yes_no(unit_check_gc(u))); SET_FOREACH(t, u->meta.names, i) fprintf(f, "%s\tName: %s\n", prefix, t); @@ -623,9 +623,13 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) { if (u->meta.load_state == UNIT_LOADED) { fprintf(f, "%s\tRecursive Stop: %s\n" - "%s\tStop When Unneeded: %s\n", + "%s\tStopWhenUnneeded: %s\n" + "%s\tOnlyByDependency: %s\n" + "%s\tDefaultDependencies: %s\n", prefix, yes_no(u->meta.recursive_stop), - prefix, yes_no(u->meta.stop_when_unneeded)); + prefix, yes_no(u->meta.stop_when_unneeded), + prefix, yes_no(u->meta.only_by_dependency), + prefix, yes_no(u->meta.default_dependencies)); LIST_FOREACH(by_unit, b, u->meta.cgroup_bondings) fprintf(f, "%s\tControlGroup: %s:%s\n", @@ -819,7 +823,7 @@ int unit_reload(Unit *u) { return -EBADR; state = unit_active_state(u); - if (unit_active_state(u) == UNIT_ACTIVE_RELOADING) + if (unit_active_state(u) == UNIT_RELOADING) return -EALREADY; if (unit_active_state(u) != UNIT_ACTIVE) @@ -998,7 +1002,7 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) { if (u->meta.job->state == JOB_RUNNING) { if (ns == UNIT_ACTIVE) job_finish_and_invalidate(u->meta.job, true); - else if (ns != UNIT_ACTIVATING && ns != UNIT_ACTIVE_RELOADING) { + else if (ns != UNIT_ACTIVATING && ns != UNIT_RELOADING) { unexpected = true; job_finish_and_invalidate(u->meta.job, false); } @@ -1012,7 +1016,7 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) { if (ns == UNIT_INACTIVE) job_finish_and_invalidate(u->meta.job, true); - else if (ns == UNIT_INACTIVE_MAINTENANCE) + else if (ns == UNIT_MAINTENANCE) job_finish_and_invalidate(u->meta.job, false); else if (u->meta.job->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) { unexpected = true; @@ -1324,6 +1328,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 +1396,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 +1438,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 +1968,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) @@ -1964,9 +2022,9 @@ DEFINE_STRING_TABLE_LOOKUP(unit_load_state, UnitLoadState); static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = { [UNIT_ACTIVE] = "active", - [UNIT_ACTIVE_RELOADING] = "active-reloading", + [UNIT_RELOADING] = "reloading", [UNIT_INACTIVE] = "inactive", - [UNIT_INACTIVE_MAINTENANCE] = "inactive-maintenance", + [UNIT_MAINTENANCE] = "maintenance", [UNIT_ACTIVATING] = "activating", [UNIT_DEACTIVATING] = "deactivating" };