service: reorder function to avoid forward declaration
[project/procd.git] / service / instance.c
index f5b61fa..35b2def 100644 (file)
@@ -282,16 +282,35 @@ instance_run(struct service_instance *in, int _stdout, int _stderr)
                closefd(_stderr);
        }
 
-       if (in->uid || in->gid) {
-               if (setuid(in->uid) || setgid(in->gid)) {
-                       ERROR("failed to set uid:%d, gid:%d\n", in->uid, in->gid);
-                       exit(127);
-               }
+       if (in->gid && setgid(in->gid)) {
+               ERROR("failed to set group id %d: %d (%s)\n", in->gid, errno, strerror(errno));
+               exit(127);
+       }
+       if (in->uid && setuid(in->uid)) {
+               ERROR("failed to set user id %d: %d (%s)\n", in->uid, errno, strerror(errno));
+               exit(127);
        }
+
        execvp(argv[0], argv);
        exit(127);
 }
 
+static void
+instance_free_stdio(struct service_instance *in)
+{
+       if (in->_stdout.fd.fd > -1) {
+               ustream_free(&in->_stdout.stream);
+               close(in->_stdout.fd.fd);
+               in->_stdout.fd.fd = -1;
+       }
+
+       if (in->_stderr.fd.fd > -1) {
+               ustream_free(&in->_stderr.stream);
+               close(in->_stderr.fd.fd);
+               in->_stderr.fd.fd = -1;
+       }
+}
+
 void
 instance_start(struct service_instance *in)
 {
@@ -307,6 +326,7 @@ instance_start(struct service_instance *in)
        if (in->proc.pending)
                return;
 
+       instance_free_stdio(in);
        if (in->_stdout.fd.fd > -2) {
                if (pipe(opipe)) {
                        ULOG_WARN("pipe() failed: %d (%s)\n", errno, strerror(errno));
@@ -363,6 +383,10 @@ instance_stdio(struct ustream *s, int prio, struct service_instance *in)
        char *newline, *str, *arg0, ident[32];
        int len;
 
+       arg0 = basename(blobmsg_data(blobmsg_data(in->command)));
+       snprintf(ident, sizeof(ident), "%s[%d]", arg0, in->proc.pid);
+       ulog_open(ULOG_SYSLOG, LOG_DAEMON, ident);
+
        do {
                str = ustream_get_read_buf(s, NULL);
                if (!str)
@@ -373,17 +397,13 @@ instance_stdio(struct ustream *s, int prio, struct service_instance *in)
                        break;
 
                *newline = 0;
-               len = newline + 1 - str;
-
-               arg0 = basename(blobmsg_data(blobmsg_data(in->command)));
-               snprintf(ident, sizeof(ident), "%s[%d]", arg0, in->proc.pid);
-
-               ulog_open(ULOG_SYSLOG, LOG_DAEMON, ident);
                ulog(prio, "%s\n", str);
-               ulog_open(ULOG_SYSLOG, LOG_DAEMON, "procd");
 
+               len = newline + 1 - str;
                ustream_consume(s, len);
        } while (1);
+
+       ulog_open(ULOG_SYSLOG, LOG_DAEMON, "procd");
 }
 
 static void
@@ -820,16 +840,7 @@ instance_update(struct service_instance *in, struct service_instance *in_new)
 void
 instance_free(struct service_instance *in)
 {
-       if (in->_stdout.fd.fd > -1) {
-               ustream_free(&in->_stdout.stream);
-               close(in->_stdout.fd.fd);
-       }
-
-       if (in->_stderr.fd.fd > -1) {
-               ustream_free(&in->_stderr.stream);
-               close(in->_stderr.fd.fd);
-       }
-
+       instance_free_stdio(in);
        uloop_process_delete(&in->proc);
        uloop_timeout_cancel(&in->timeout);
        trigger_del(in);
@@ -871,6 +882,9 @@ void instance_dump(struct blob_buf *b, struct service_instance *in, int verbose)
 {
        void *i;
 
+       if (!in->valid)
+               return;
+
        i = blobmsg_open_table(b, in->name);
        blobmsg_add_u8(b, "running", in->proc.pending);
        if (in->proc.pending)
@@ -911,8 +925,8 @@ void instance_dump(struct blob_buf *b, struct service_instance *in, int verbose)
 
        if (in->respawn) {
                void *r = blobmsg_open_table(b, "respawn");
-               blobmsg_add_u32(b, "timeout", in->respawn_timeout);
                blobmsg_add_u32(b, "threshold", in->respawn_threshold);
+               blobmsg_add_u32(b, "timeout", in->respawn_timeout);
                blobmsg_add_u32(b, "retry", in->respawn_retry);
                blobmsg_close_table(b, r);
        }