diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/execute.h | 1 | ||||
| -rw-r--r-- | src/core/service.c | 27 | 
2 files changed, 24 insertions, 4 deletions
| diff --git a/src/core/execute.h b/src/core/execute.h index 8d659ca178..2b4238ed7e 100644 --- a/src/core/execute.h +++ b/src/core/execute.h @@ -217,6 +217,7 @@ typedef enum ExecFlags {          /* The following are not used by execute.c, but by consumers internally */          EXEC_PASS_FDS          = 1U << 4,          EXEC_IS_CONTROL        = 1U << 5, +        EXEC_SETENV_RESULT     = 1U << 6,  } ExecFlags;  struct ExecParameters { diff --git a/src/core/service.c b/src/core/service.c index 32b8e7d2c5..0cbea52276 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -1216,7 +1216,7 @@ static int service_spawn(          if (r < 0)                  return r; -        our_env = new0(char*, 6); +        our_env = new0(char*, 9);          if (!our_env)                  return -ENOMEM; @@ -1264,6 +1264,24 @@ static int service_spawn(                  }          } +        if (flags & EXEC_SETENV_RESULT) { +                if (asprintf(our_env + n_env++, "SERVICE_RESULT=%s", service_result_to_string(s->result)) < 0) +                        return -ENOMEM; + +                if (s->main_exec_status.pid > 0 && +                    dual_timestamp_is_set(&s->main_exec_status.exit_timestamp)) { +                        if (asprintf(our_env + n_env++, "EXIT_CODE=%s", sigchld_code_to_string(s->main_exec_status.code)) < 0) +                                return -ENOMEM; + +                        if (s->main_exec_status.code == CLD_EXITED) +                                r = asprintf(our_env + n_env++, "EXIT_STATUS=%i", s->main_exec_status.status); +                        else +                                r = asprintf(our_env + n_env++, "EXIT_STATUS=%s", signal_to_string(s->main_exec_status.status)); +                        if (r < 0) +                                return -ENOMEM; +                } +        } +          final_env = strv_env_merge(2, UNIT(s)->manager->environment, our_env, NULL);          if (!final_env)                  return -ENOMEM; @@ -1467,7 +1485,7 @@ static void service_enter_stop_post(Service *s, ServiceResult f) {                  r = service_spawn(s,                                    s->control_command,                                    s->timeout_stop_usec, -                                  EXEC_APPLY_PERMISSIONS|EXEC_APPLY_CHROOT|EXEC_APPLY_TTY_STDIN|EXEC_IS_CONTROL, +                                  EXEC_APPLY_PERMISSIONS|EXEC_APPLY_CHROOT|EXEC_APPLY_TTY_STDIN|EXEC_IS_CONTROL|EXEC_SETENV_RESULT,                                    &s->control_pid);                  if (r < 0)                          goto fail; @@ -1578,7 +1596,7 @@ static void service_enter_stop(Service *s, ServiceResult f) {                  r = service_spawn(s,                                    s->control_command,                                    s->timeout_stop_usec, -                                  EXEC_APPLY_PERMISSIONS|EXEC_APPLY_CHROOT|EXEC_IS_CONTROL, +                                  EXEC_APPLY_PERMISSIONS|EXEC_APPLY_CHROOT|EXEC_IS_CONTROL|EXEC_SETENV_RESULT,                                    &s->control_pid);                  if (r < 0)                          goto fail; @@ -1898,7 +1916,8 @@ static void service_run_next_control(Service *s) {                            s->control_command,                            timeout,                            EXEC_APPLY_PERMISSIONS|EXEC_APPLY_CHROOT|EXEC_IS_CONTROL| -                          (IN_SET(s->control_command_id, SERVICE_EXEC_START_PRE, SERVICE_EXEC_STOP_POST) ? EXEC_APPLY_TTY_STDIN : 0), +                          (IN_SET(s->control_command_id, SERVICE_EXEC_START_PRE, SERVICE_EXEC_STOP_POST) ? EXEC_APPLY_TTY_STDIN : 0)| +                          (IN_SET(s->control_command_id, SERVICE_EXEC_STOP, SERVICE_EXEC_STOP_POST) ? EXEC_SETENV_RESULT : 0),                            &s->control_pid);          if (r < 0)                  goto fail; | 
