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>
+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)
{
static void
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);
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);
uloop_timeout_cancel(&in->timeout);
service_event("instance.stop", in->srv->name, in->name);
in->proc.cb = instance_exit;
in->term_timeout = 5;
in->syslog_facility = LOG_DAEMON;
in->proc.cb = instance_exit;
in->term_timeout = 5;
in->syslog_facility = LOG_DAEMON;
in->_stdout.fd.fd = -2;
in->_stdout.stream.string_data = true;
in->_stdout.fd.fd = -2;
in->_stdout.stream.string_data = true;
if (in->command)
blobmsg_add_blob(b, in->command);
blobmsg_add_u32(b, "term_timeout", in->term_timeout);
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;
if (!avl_is_empty(&in->errors.avl)) {
struct blobmsg_list_node *var;
#include "../utils/utils.h"
#define RESPAWN_ERROR (5 * 60)
#include "../utils/utils.h"
#define RESPAWN_ERROR (5 * 60)
+#define SIGNALLED_OFFSET 128
struct jail {
bool procfs;
struct jail {
bool procfs;
char *seccomp;
char *pidfile;
int syslog_facility;
char *seccomp;
char *pidfile;
int syslog_facility;
uint32_t term_timeout;
uint32_t respawn_timeout;
uint32_t term_timeout;
uint32_t respawn_timeout;