[OpenWrt-Devel] [PATCH] procd: show process's exit code

ondrej.votava at cvut.cz ondrej.votava at cvut.cz
Mon Jan 20 04:53:05 EST 2020


From: Ondřej Votava <ondrej.votava at cvut.cz>

Adds feature to show process's exit code when
ubus service list is called.

Signed-off-by: Ondřej Votava <ondrej.votava at cvut.cz>
---
 service/instance.c | 12 ++++++++++++
 service/instance.h |  1 +
 2 files changed, 13 insertions(+)

diff --git a/service/instance.c b/service/instance.c
index abd1f34..c360343 100644
--- a/service/instance.c
+++ b/service/instance.c
@@ -574,6 +574,15 @@ instance_exit(struct uloop_process *p, int ret)
 
 	DEBUG(2, "Instance %s::%s exit with error code %d after %ld seconds\n", in->srv->name, in->name, ret, runtime);
 
+	/*
+	According to man waitpid(2) exit codes might be:
+	0 -- everything is OK
+	SIGNALLED -- 1 - 64 - and since we want the same behavior as SHELL, we add 128
+		@see http://tldp.org/LDP/abs/html/exitcodes.html
+	256 - 65536 -- regular exit, strip the bottom byte with WEXITSTATUS macro.
+		@see man waitpid(2)
+	*/
+	in->exit_code = WIFEXITED(ret) ? WEXITSTATUS(ret) : WIFSIGNALED(ret) ? 128 + WTERMSIG(ret) : 1;
 	uloop_timeout_cancel(&in->timeout);
 	service_event("instance.stop", in->srv->name, in->name);
 
@@ -1091,6 +1100,7 @@ instance_init(struct service_instance *in, struct service *s, struct blob_attr *
 	in->proc.cb = instance_exit;
 	in->term_timeout = 5;
 	in->syslog_facility = LOG_DAEMON;
+	in->exit_code = 0;
 
 	in->_stdout.fd.fd = -2;
 	in->_stdout.stream.string_data = true;
@@ -1124,6 +1134,8 @@ void instance_dump(struct blob_buf *b, struct service_instance *in, int verbose)
 	if (in->command)
 		blobmsg_add_blob(b, in->command);
 	blobmsg_add_u32(b, "term_timeout", in->term_timeout);
+	if (!in->proc.pending)
+		blobmsg_add_u32(b, "exit_code", in->exit_code);
 
 	if (!avl_is_empty(&in->errors.avl)) {
 		struct blobmsg_list_node *var;
diff --git a/service/instance.h b/service/instance.h
index 42cc4be..05a2fc3 100644
--- a/service/instance.h
+++ b/service/instance.h
@@ -62,6 +62,7 @@ struct service_instance {
 	char *seccomp;
 	char *pidfile;
 	int syslog_facility;
+	int exit_code;
 
 	uint32_t term_timeout;
 	uint32_t respawn_timeout;
-- 
2.21.0 (Apple Git-122.2)


_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


More information about the openwrt-devel mailing list