exit-status: kill is_clean_exit_lsb(), move logic to sysv-generator
Let's get rid of is_clean_exit_lsb(), let's move the logic for the special handling of the two LSB exit codes into the sysv-generator by writing out appropriate SuccessExitStatus= lines if the LSB header exists. This is not only semantically more correct, bug also fixes a bug as the code in service.c that chose between is_clean_exit_lsb() and is_clean_exit() based this check on whether a native unit files was available for the unit. However, that check was bogus since a long time, since the SysV generator was introduced and native SysV script support was removed from PID 1, as in that case a unit file always existed.
This commit is contained in:
parent
3b8769bda8
commit
41e2036eb8
|
@ -194,16 +194,6 @@ bool is_clean_exit(int code, int status, ExitStatusSet *success_status) {
|
|||
return false;
|
||||
}
|
||||
|
||||
bool is_clean_exit_lsb(int code, int status, ExitStatusSet *success_status) {
|
||||
|
||||
if (is_clean_exit(code, status, success_status))
|
||||
return true;
|
||||
|
||||
return
|
||||
code == CLD_EXITED &&
|
||||
IN_SET(status, EXIT_NOTINSTALLED, EXIT_NOTCONFIGURED);
|
||||
}
|
||||
|
||||
void exit_status_set_free(ExitStatusSet *x) {
|
||||
assert(x);
|
||||
|
||||
|
|
|
@ -99,7 +99,6 @@ typedef struct ExitStatusSet {
|
|||
const char* exit_status_to_string(int status, ExitStatusLevel level) _const_;
|
||||
|
||||
bool is_clean_exit(int code, int status, ExitStatusSet *success_status);
|
||||
bool is_clean_exit_lsb(int code, int status, ExitStatusSet *success_status);
|
||||
|
||||
void exit_status_set_free(ExitStatusSet *x);
|
||||
bool exit_status_set_is_empty(ExitStatusSet *x);
|
||||
|
|
|
@ -2600,8 +2600,7 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
|
|||
assert(s);
|
||||
assert(pid >= 0);
|
||||
|
||||
if (UNIT(s)->fragment_path ? is_clean_exit(code, status, &s->success_status) :
|
||||
is_clean_exit_lsb(code, status, &s->success_status))
|
||||
if (is_clean_exit(code, status, &s->success_status))
|
||||
f = SERVICE_SUCCESS;
|
||||
else if (code == CLD_EXITED)
|
||||
f = SERVICE_FAILURE_EXIT_CODE;
|
||||
|
|
|
@ -3936,7 +3936,7 @@ static void print_status_info(
|
|||
argv = strv_join(p->argv, " ");
|
||||
printf(" Process: "PID_FMT" %s=%s ", p->pid, p->name, strna(argv));
|
||||
|
||||
good = is_clean_exit_lsb(p->code, p->status, NULL);
|
||||
good = is_clean_exit(p->code, p->status, NULL);
|
||||
if (!good) {
|
||||
on = ansi_highlight_red();
|
||||
off = ansi_normal();
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
|
||||
#include "alloc-util.h"
|
||||
#include "dirent-util.h"
|
||||
#include "exit-status.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
#include "hashmap.h"
|
||||
|
@ -199,6 +200,13 @@ static int generate_unit_file(SysvStub *s) {
|
|||
if (s->pid_file)
|
||||
fprintf(f, "PIDFile=%s\n", s->pid_file);
|
||||
|
||||
/* Consider two special LSB exit codes a clean exit */
|
||||
if (s->has_lsb)
|
||||
fprintf(f,
|
||||
"SuccessExitStatus=%i %i\n",
|
||||
EXIT_NOTINSTALLED,
|
||||
EXIT_NOTCONFIGURED);
|
||||
|
||||
fprintf(f,
|
||||
"ExecStart=%s start\n"
|
||||
"ExecStop=%s stop\n",
|
||||
|
|
Loading…
Reference in a new issue