summary refs log tree commit diff
diff options
context:
space:
mode:
authorC. McEnroe <june@causal.agency>2020-08-15 23:11:09 -0400
committerC. McEnroe <june@causal.agency>2020-08-15 23:11:09 -0400
commit1c4dd05f407633b9d8ca156a7ee4984e1b131cf6 (patch)
tree8a15e665d2d9686dc6185f8c489d8fb744173ddd
parentRemove EX_CONFIG from default stopexits (diff)
downloadcatsit-1c4dd05f407633b9d8ca156a7ee4984e1b131cf6.tar.gz
catsit-1c4dd05f407633b9d8ca156a7ee4984e1b131cf6.zip
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
-rw-r--r--catsitd.84
-rw-r--r--daemon.h1
-rw-r--r--service.c19
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) {