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);
if ((r = sysv_exec_commands(s)) < 0)
goto finish;
- if (!s->sysv_runlevels || chars_intersect(RUNLEVELS_UP, s->sysv_runlevels)) {
+ if (s->sysv_runlevels && !chars_intersect(RUNLEVELS_UP, s->sysv_runlevels)) {
/* If there a runlevels configured for this service
* but none of the standard ones, then we assume this
* is some special kind of service (which might be
* needed for early boot) and don't create any links
* to it. */
- if ((r = unit_add_dependency_by_name(u, UNIT_REQUIRES, SPECIAL_BASIC_TARGET, NULL, true)) < 0 ||
- (r = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_BASIC_TARGET, NULL, true)) < 0)
- goto finish;
+ s->meta.default_dependencies = false;
- } else
/* Don't timeout special services during boot (like fsck) */
s->timeout_usec = 0;
+ }
/* Special setting for all SysV services */
s->type = SERVICE_FORKING;
return 0;
}
+static int service_add_default_dependencies(Service *s) {
+ int r;
+
+ assert(s);
+
+ /* Add a number of automatic dependencies useful for the
+ * majority of services. */
+
+ /* First, pull in base system */
+ if (s->meta.manager->running_as == MANAGER_SYSTEM) {
+
+ if ((r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_BASIC_TARGET, NULL, true)) < 0)
+ return r;
+
+ } else if (s->meta.manager->running_as == MANAGER_SESSION) {
+
+ if ((r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SOCKETS_TARGET, NULL, true)) < 0)
+ return r;
+ }
+
+ /* Second, activate normal shutdown */
+ return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true);
+}
+
static int service_load(Unit *u) {
int r;
Service *s = SERVICE(u);
return r;
if ((r = unit_watch_bus_name(u, s->bus_name)) < 0)
- return r;
+ return r;
}
if (s->type == SERVICE_NOTIFY && s->notify_access == NOTIFY_NONE)
s->notify_access = NOTIFY_MAIN;
+
+ if (s->type == SERVICE_DBUS || s->bus_name)
+ if ((r = unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_REQUIRES, SPECIAL_DBUS_TARGET, NULL, true)) < 0)
+ return r;
+
+ if (s->meta.default_dependencies)
+ if ((r = service_add_default_dependencies(s)) < 0)
+ return r;
}
return service_verify(s);
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
* 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;
}
}
DEFINE_STRING_TABLE_LOOKUP(service_restart, ServiceRestart);
static const char* const service_type_table[_SERVICE_TYPE_MAX] = {
- [SERVICE_FORKING] = "forking",
[SERVICE_SIMPLE] = "simple",
+ [SERVICE_FORKING] = "forking",
[SERVICE_FINISH] = "finish",
[SERVICE_DBUS] = "dbus",
[SERVICE_NOTIFY] = "notify"