From 1c4dd05f407633b9d8ca156a7ee4984e1b131cf6 Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Sat, 15 Aug 2020 23:11:09 -0400 Subject: Add 126 to hardcoded stop exits > If a command is not found, the exit status shall be 127. If the > command name is found, but it is not an executable utility, the exit > status shall be 126. Applications that invoke utilities without using > the shell should use these exit status values to report similar errors. [1]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_08_02 --- catsitd.8 | 4 ++-- daemon.h | 1 - service.c | 19 ++++++++++++++----- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/catsitd.8 b/catsitd.8 index abedb13..3bc4b3f 100644 --- a/catsitd.8 +++ b/catsitd.8 @@ -122,8 +122,8 @@ The default list contains the values of .Dv EX_CANTCREAT defined in .Xr sysexits 3 . -The exit status 127 -is always treated as a stop exit. +The exit statuses 127 and 126 +are always treated as stop exits. . .It Fl t Ar restart Set the initial interval in milliseconds diff --git a/daemon.h b/daemon.h index 1ee3ea5..0dcf4de 100644 --- a/daemon.h +++ b/daemon.h @@ -154,7 +154,6 @@ static inline uint32_t setTest(const struct Set256 *set, byte x) { return set->bits[x / 32] & (1 << (uint32_t)(x & 31)); } -enum { StopExit = 127 }; extern struct Set256 stopExits; extern struct timespec restartInterval; extern struct timespec resetInterval; diff --git a/service.c b/service.c index e7cfe2f..63a647c 100644 --- a/service.c +++ b/service.c @@ -34,6 +34,11 @@ #include "daemon.h" +enum { + ExitNotFound = 127, + ExitNoExec = 126, +}; + const char *serviceDir = "/"; uid_t serviceUID; gid_t serviceGID; @@ -173,13 +178,13 @@ void serviceStart(struct Service *service) { dup2(service->errPipe[1], STDERR_FILENO); int error = chdir(serviceDir); - if (error) err(StopExit, "%s", serviceDir); + if (error) err(ExitNoExec, "%s", serviceDir); error = setgid(serviceGID); - if (error) err(StopExit, "setgid"); + if (error) err(ExitNoExec, "setgid"); error = setuid(serviceUID); - if (error) err(StopExit, "setuid"); + if (error) err(ExitNoExec, "setuid"); size_t len = 0; char command[ARG_MAX]; @@ -197,7 +202,7 @@ void serviceStart(struct Service *service) { _PATH_BSHELL, "-c", command, service->name, NULL, serviceEnviron ); - err(StopExit, "%s", _PATH_BSHELL); + err(ExitNotFound, "%s", _PATH_BSHELL); } void serviceSignal(struct Service *service, int signal) { @@ -266,7 +271,11 @@ void serviceReap(pid_t pid, int status) { service->state = Stop; if (WIFEXITED(status)) { int exit = WEXITSTATUS(status); - if (exit == StopExit || setTest(&stopExits, exit)) { + if ( + exit == ExitNotFound || + exit == ExitNoExec || + setTest(&stopExits, exit) + ) { service->intent = Stop; } if (exit) { -- cgit 1.4.1