chiark / gitweb /
dbus: add introspection to midlevel paths
[elogind.git] / src / service.c
index 116e539d951df7303039759645589b54b0e49342..d3852c76a13644570b7d8967e90e6570c6b2cb21 100644 (file)
@@ -39,6 +39,9 @@
 #define NEWLINES "\n\r"
 
 #ifdef HAVE_SYSV_COMPAT
+
+#define DEFAULT_SYSV_TIMEOUT_USEC (3*USEC_PER_MINUTE)
+
 typedef enum RunlevelType {
         RUNLEVEL_UP,
         RUNLEVEL_DOWN,
@@ -790,7 +793,8 @@ static int service_load_sysv_path(Service *s, const char *path) {
 
                 /* Don't timeout special services during boot (like fsck) */
                 s->timeout_usec = 0;
-        }
+        } else
+                s->timeout_usec = DEFAULT_SYSV_TIMEOUT_USEC;
 
         /* Special setting for all SysV services */
         s->type = SERVICE_FORKING;
@@ -1623,7 +1627,11 @@ static void service_enter_dead(Service *s, bool success, bool allow_restart) {
         if (allow_restart &&
             !s->forbid_restart &&
             (s->restart == SERVICE_RESTART_ALWAYS ||
-             (s->restart == SERVICE_RESTART_ON_SUCCESS && !s->failure))) {
+             (s->restart == SERVICE_RESTART_ON_SUCCESS && !s->failure) ||
+             (s->restart == SERVICE_RESTART_ON_FAILURE && s->failure) ||
+             (s->restart == SERVICE_RESTART_ON_ABORT && s->failure &&
+              (s->main_exec_status.code == CLD_KILLED ||
+               s->main_exec_status.code == CLD_DUMPED)))) {
 
                 if ((r = unit_watch_timer(UNIT(s), s->restart_usec, &s->timer_watch)) < 0)
                         goto fail;
@@ -2402,7 +2410,7 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
         if (s->main_pid == pid) {
 
                 s->main_pid = 0;
-                exec_status_exit(&s->main_exec_status, pid, code, status);
+                exec_status_exit(&s->main_exec_status, pid, code, status, s->exec_context.utmp_id);
 
                 if (s->type != SERVICE_FORKING && s->control_command) {
                         s->control_command->exec_status = s->main_exec_status;
@@ -2479,7 +2487,7 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
                 s->control_pid = 0;
 
                 if (s->control_command) {
-                        exec_status_exit(&s->control_command->exec_status, pid, code, status);
+                        exec_status_exit(&s->control_command->exec_status, pid, code, status, s->exec_context.utmp_id);
 
                         if (s->control_command->ignore)
                                 success = true;
@@ -3111,7 +3119,9 @@ DEFINE_STRING_TABLE_LOOKUP(service_state, ServiceState);
 static const char* const service_restart_table[_SERVICE_RESTART_MAX] = {
         [SERVICE_RESTART_NO] = "no",
         [SERVICE_RESTART_ON_SUCCESS] = "on-success",
-        [SERVICE_RESTART_ALWAYS] = "always",
+        [SERVICE_RESTART_ON_FAILURE] = "on-failure",
+        [SERVICE_RESTART_ON_ABORT] = "on-abort",
+        [SERVICE_RESTART_ALWAYS] = "always"
 };
 
 DEFINE_STRING_TABLE_LOOKUP(service_restart, ServiceRestart);