X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Funit.c;h=da7a5700551de5cb71d50aa97783038c58d21120;hb=60649f17bd5ef8659dab474ace8bf42ee23ffca3;hp=ae6f69183d284055ec624391c9670a80a1a8a3e8;hpb=6b78f9b4354010f8af2fe48c783ffd52b2db8f57;p=elogind.git diff --git a/src/core/unit.c b/src/core/unit.c index ae6f69183..da7a57005 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -1596,10 +1596,12 @@ int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_referen [UNIT_REQUISITE] = UNIT_REQUIRED_BY, [UNIT_REQUISITE_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE, [UNIT_BINDS_TO] = UNIT_BOUND_BY, + [UNIT_PART_OF] = UNIT_CONSISTS_OF, [UNIT_REQUIRED_BY] = _UNIT_DEPENDENCY_INVALID, [UNIT_REQUIRED_BY_OVERRIDABLE] = _UNIT_DEPENDENCY_INVALID, [UNIT_WANTED_BY] = _UNIT_DEPENDENCY_INVALID, [UNIT_BOUND_BY] = UNIT_BINDS_TO, + [UNIT_CONSISTS_OF] = UNIT_PART_OF, [UNIT_CONFLICTS] = UNIT_CONFLICTED_BY, [UNIT_CONFLICTED_BY] = UNIT_CONFLICTS, [UNIT_BEFORE] = UNIT_AFTER, @@ -1610,7 +1612,7 @@ int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_referen [UNIT_TRIGGERS] = UNIT_TRIGGERED_BY, [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS, [UNIT_PROPAGATES_RELOAD_TO] = UNIT_RELOAD_PROPAGATED_FROM, - [UNIT_RELOAD_PROPAGATED_FROM] = UNIT_PROPAGATES_RELOAD_TO + [UNIT_RELOAD_PROPAGATED_FROM] = UNIT_PROPAGATES_RELOAD_TO, }; int r, q = 0, v = 0, w = 0; @@ -2721,20 +2723,16 @@ bool unit_pending_active(Unit *u) { return false; } -int unit_kill(Unit *u, KillWho w, KillMode m, int signo, DBusError *error) { +int unit_kill(Unit *u, KillWho w, int signo, DBusError *error) { assert(u); assert(w >= 0 && w < _KILL_WHO_MAX); - assert(m >= 0 && m < _KILL_MODE_MAX); assert(signo > 0); assert(signo < _NSIG); - if (m == KILL_NONE) - return 0; - if (!UNIT_VTABLE(u)->kill) return -ENOTSUP; - return UNIT_VTABLE(u)->kill(u, w, m, signo, error); + return UNIT_VTABLE(u)->kill(u, w, signo, error); } int unit_following_set(Unit *u, Set **s) { @@ -2820,17 +2818,31 @@ int unit_add_mount_links(Unit *u) { return 0; } -int unit_patch_working_directory(Unit *u, ExecContext *c) { +int unit_exec_context_defaults(Unit *u, ExecContext *c) { + unsigned i; + int r; + assert(u); assert(c); - if (u->manager->running_as != MANAGER_USER) - return 0; + /* This only copies in the ones that need memory */ - if (c->working_directory) - return 0; + for (i = 0; i < RLIMIT_NLIMITS; i++) + if (u->manager->rlimit[i] && !c->rlimit[i]) { + c->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1); + if (!c->rlimit[i]) + return -ENOMEM; + } - return get_home_dir(&c->working_directory); + if (u->manager->running_as == MANAGER_USER && + !c->working_directory) { + + r = get_home_dir(&c->working_directory); + if (r < 0) + return r; + } + + return 0; } static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {