summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOndřej Votava2020-01-23 14:31:31 +0000
committerPetr Štetiar2020-01-24 05:24:08 +0000
commit00aafc4f439ec3ace834c1a803b899bd1ceba9db (patch)
treed3b5455f3269cb81a5da28144ba6589e3b244328
parent856b5f8be04620c785b1af35cc16bc3f6d625a61 (diff)
downloadprocd-00aafc4f439ec3ace834c1a803b899bd1ceba9db.tar.gz
procd: show process's exit code
Adds feature to show exit code of processes launched by procd. The exit code is shown for finished process when ubus's service list method is called. The exit code value is computed according to waitpid(2) and http://tldp.org/LDP/abs/html/exitcodes.html Signed-off-by: Ondřej Votava <ondrej.votava@cvut.cz>
-rw-r--r--service/instance.c22
-rw-r--r--service/instance.h2
2 files changed, 24 insertions, 0 deletions
diff --git a/service/instance.c b/service/instance.c
index 658c086..e872ba0 100644
--- a/service/instance.c
+++ b/service/instance.c
@@ -566,6 +566,24 @@ instance_delete(struct service_instance *in)
service_stopped(s);
}
+static int
+instance_exit_code(int ret)
+{
+ if (WIFEXITED(ret)) {
+ return WEXITSTATUS(ret);
+ }
+
+ if (WIFSIGNALED(ret)) {
+ return SIGNALLED_OFFSET + WTERMSIG(ret);
+ }
+
+ if (WIFSTOPPED(ret)) {
+ return WSTOPSIG(ret);
+ }
+
+ return 1;
+}
+
static void
instance_exit(struct uloop_process *p, int ret)
{
@@ -580,6 +598,7 @@ 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);
+ in->exit_code = instance_exit_code(ret);
uloop_timeout_cancel(&in->timeout);
service_event("instance.stop", in->srv->name, in->name);
@@ -1126,6 +1145,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;
@@ -1159,6 +1179,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 e53c606..7d91b51 100644
--- a/service/instance.h
+++ b/service/instance.h
@@ -21,6 +21,7 @@
#include "../utils/utils.h"
#define RESPAWN_ERROR (5 * 60)
+#define SIGNALLED_OFFSET 128
struct jail {
bool procfs;
@@ -63,6 +64,7 @@ struct service_instance {
char *seccomp;
char *pidfile;
int syslog_facility;
+ int exit_code;
uint32_t term_timeout;
uint32_t respawn_timeout;