chiark / gitweb /
execute: socket isn't abstract anymore
[elogind.git] / src / service.c
index 39a46d6cf563a1b47edc41f583cac0c6f4ea17bc..1735a96c80b930844d9d24d2d94e4d63692ed24e 100644 (file)
 #include "special.h"
 #include "bus-errors.h"
 #include "exit-status.h"
-
-#define COMMENTS "#;\n"
-#define NEWLINES "\n\r"
+#include "def.h"
+#include "util.h"
 
 #ifdef HAVE_SYSV_COMPAT
 
-#define DEFAULT_SYSV_TIMEOUT_USEC (3*USEC_PER_MINUTE)
+#define DEFAULT_SYSV_TIMEOUT_USEC (5*USEC_PER_MINUTE)
 
 typedef enum RunlevelType {
         RUNLEVEL_UP,
@@ -275,7 +274,13 @@ static int sysv_translate_facility(const char *name, const char *filename, char
         static const char * const table[] = {
                 /* LSB defined facilities */
                 "local_fs",             SPECIAL_LOCAL_FS_TARGET,
+#ifndef TARGET_MANDRIVA
+               /* Due to unfortunate name selection in Mandriva,
+                * $network is provided by network-up which is ordered
+                * after network which actually starts interfaces.
+                * To break the loop, just ignore it */
                 "network",              SPECIAL_NETWORK_TARGET,
+#endif
                 "named",                SPECIAL_NSS_LOOKUP_TARGET,
                 "portmap",              SPECIAL_RPCBIND_TARGET,
                 "remote_fs",            SPECIAL_REMOTE_FS_TARGET,
@@ -345,9 +350,7 @@ static int sysv_translate_facility(const char *name, const char *filename, char
                 return -ENOMEM;
 
 finish:
-
-        if (_r)
-                *_r = r;
+        *_r = r;
 
         return 1;
 }
@@ -652,16 +655,21 @@ 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 {
-                                                r = unit_add_dependency_by_name(u, UNIT_BEFORE, m, NULL, true);
-
-                                                if (s->sysv_enabled) {
-                                                        int k;
-
-                                                        if ((k = unit_add_dependency_by_name_inverse(u, UNIT_WANTS, m, NULL, true)) < 0)
-                                                                r = k;
-                                                }
-                                        }
+                                        else
+                                                /* NB: SysV targets
+                                                 * which are provided
+                                                 * by a service are
+                                                 * pulled in by the
+                                                 * services, as an
+                                                 * indication that the
+                                                 * generic service is
+                                                 * now available. This
+                                                 * is strictly
+                                                 * one-way. The
+                                                 * targets do NOT pull
+                                                 * in the SysV
+                                                 * services! */
+                                                r = unit_add_two_dependencies_by_name(u, UNIT_BEFORE, UNIT_WANTS, m, NULL, true);
 
                                         if (r < 0)
                                                 log_error("[%s:%u] Failed to add LSB Provides name %s, ignoring: %s", path, line, m, strerror(-r));
@@ -837,7 +845,7 @@ static int service_load_sysv_path(Service *s, const char *path) {
         if (description) {
                 char *d;
 
-                if (!(d = strappend("LSB: ", description))) {
+                if (!(d = strappend(s->sysv_has_lsb ? "LSB: " : "SYSV: ", description))) {
                         r = -ENOMEM;
                         goto finish;
                 }
@@ -1126,7 +1134,7 @@ static int service_load(Unit *u) {
                         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)
+                        if ((r = unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_REQUIRES, SPECIAL_DBUS_SOCKET, NULL, true)) < 0)
                                 return r;
 
                 if (s->meta.default_dependencies)
@@ -1655,7 +1663,7 @@ static int service_spawn(
         }
 
         if (set_notify_socket)
-                if (asprintf(our_env + n_env++, "NOTIFY_SOCKET=@%s", s->meta.manager->notify_socket) < 0) {
+                if (asprintf(our_env + n_env++, "NOTIFY_SOCKET=%s", s->meta.manager->notify_socket) < 0) {
                         r = -ENOMEM;
                         goto fail;
                 }
@@ -1830,9 +1838,9 @@ static void service_enter_signal(Service *s, ServiceState state, bool success) {
                 int sig = (state == SERVICE_STOP_SIGTERM || state == SERVICE_FINAL_SIGTERM) ? s->exec_context.kill_signal : SIGKILL;
 
                 if (s->main_pid > 0) {
-                        if (kill(s->exec_context.kill_mode == KILL_PROCESS_GROUP ?
-                                 -s->main_pid :
-                                 s->main_pid, sig) < 0 && errno != ESRCH)
+                        if (kill_and_sigcont(s->exec_context.kill_mode == KILL_PROCESS_GROUP ?
+                                             -s->main_pid :
+                                             s->main_pid, sig) < 0 && errno != ESRCH)
 
                                 log_warning("Failed to kill main process %li: %m", (long) s->main_pid);
                         else
@@ -1840,9 +1848,9 @@ static void service_enter_signal(Service *s, ServiceState state, bool success) {
                 }
 
                 if (s->control_pid > 0) {
-                        if (kill(s->exec_context.kill_mode == KILL_PROCESS_GROUP ?
-                                 -s->control_pid :
-                                 s->control_pid, sig) < 0 && errno != ESRCH)
+                        if (kill_and_sigcont(s->exec_context.kill_mode == KILL_PROCESS_GROUP ?
+                                             -s->control_pid :
+                                             s->control_pid, sig) < 0 && errno != ESRCH)
 
                                 log_warning("Failed to kill control process %li: %m", (long) s->control_pid);
                         else
@@ -1865,7 +1873,7 @@ static void service_enter_signal(Service *s, ServiceState state, bool success) {
                                 if ((r = set_put(pid_set, LONG_TO_PTR(s->control_pid))) < 0)
                                         goto fail;
 
-                        if ((r = cgroup_bonding_kill_list(s->meta.cgroup_bondings, sig, pid_set)) < 0) {
+                        if ((r = cgroup_bonding_kill_list(s->meta.cgroup_bondings, sig, true, pid_set)) < 0) {
                                 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
                                         log_warning("Failed to kill control group: %s", strerror(-r));
                         } else if (r > 0)
@@ -3230,7 +3238,7 @@ static int service_kill(Unit *u, KillWho who, KillMode mode, int signo, DBusErro
                                 goto finish;
                         }
 
-                if ((q = cgroup_bonding_kill_list(s->meta.cgroup_bondings, signo, pid_set)) < 0)
+                if ((q = cgroup_bonding_kill_list(s->meta.cgroup_bondings, signo, false, pid_set)) < 0)
                         if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
                                 r = q;
         }