Skip to content

Commit

Permalink
exit-status: kill is_clean_exit_lsb(), move logic to sysv-generator
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
poettering committed Oct 10, 2016
1 parent 3b8769b commit 41e2036
Show file tree
Hide file tree
Showing 5 changed files with 10 additions and 14 deletions.
10 changes: 0 additions & 10 deletions src/basic/exit-status.c
Expand Up @@ -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);

Expand Down
1 change: 0 additions & 1 deletion src/basic/exit-status.h
Expand Up @@ -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);
Expand Down
3 changes: 1 addition & 2 deletions src/core/service.c
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/systemctl/systemctl.c
Expand Up @@ -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();
Expand Down
8 changes: 8 additions & 0 deletions src/sysv-generator/sysv-generator.c
Expand Up @@ -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"
Expand Down Expand Up @@ -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",
Expand Down

0 comments on commit 41e2036

Please sign in to comment.