jail: add option for pidfile
[project/procd.git] / service / instance.c
index a57fe30b1045c3e34ebacbc56715a3cb2c95796c..f1242d6a5b7fa50b1f11db9bc4cf54f233ff2fac 100644 (file)
@@ -119,6 +119,7 @@ enum {
        JAIL_ATTR_CONSOLE,
        JAIL_ATTR_REQUIREJAIL,
        JAIL_ATTR_IMMEDIATELY,
+       JAIL_ATTR_PIDFILE,
        __JAIL_ATTR_MAX,
 };
 
@@ -137,6 +138,7 @@ static const struct blobmsg_policy jail_attr[__JAIL_ATTR_MAX] = {
        [JAIL_ATTR_CONSOLE] = { "console", BLOBMSG_TYPE_BOOL },
        [JAIL_ATTR_REQUIREJAIL] = { "requirejail", BLOBMSG_TYPE_BOOL },
        [JAIL_ATTR_IMMEDIATELY] = { "immediately", BLOBMSG_TYPE_BOOL },
+       [JAIL_ATTR_PIDFILE] = { "pidfile", BLOBMSG_TYPE_STRING },
 };
 
 struct instance_netdev {
@@ -311,6 +313,11 @@ jail_run(struct service_instance *in, char **argv)
        if (in->immediately)
                argv[argc++] = "-i";
 
+       if (jail->pidfile) {
+               argv[argc++] = "-P";
+               argv[argc++] = jail->pidfile;
+       }
+
        if (in->bundle) {
                argv[argc++] = "-J";
                argv[argc++] = in->bundle;
@@ -928,6 +935,9 @@ instance_config_changed(struct service_instance *in, struct service_instance *in
        if (string_changed(in->jail.hostname, in_new->jail.hostname))
                return true;
 
+       if (string_changed(in->jail.pidfile, in_new->jail.pidfile))
+               return true;
+
        if (in->jail.procfs != in_new->jail.procfs)
                return true;
 
@@ -1117,6 +1127,10 @@ instance_jail_parse(struct service_instance *in, struct blob_attr *attr)
                jail->console = true;
                jail->argc++;
        }
+       if (tb[JAIL_ATTR_PIDFILE]) {
+               jail->pidfile = strdup(blobmsg_get_string(tb[JAIL_ATTR_PIDFILE]));
+               jail->argc += 2;
+       }
 
        if (tb[JAIL_ATTR_MOUNT]) {
                struct blob_attr *cur;
@@ -1447,6 +1461,7 @@ instance_config_move(struct service_instance *in, struct service_instance *in_sr
        instance_config_move_strdup(&in->group, in_src->group);
        instance_config_move_strdup(&in->jail.name, in_src->jail.name);
        instance_config_move_strdup(&in->jail.hostname, in_src->jail.hostname);
+       instance_config_move_strdup(&in->jail.pidfile, in_src->jail.pidfile);
 
        free(in->config);
        in->config = in_src->config;
@@ -1490,6 +1505,7 @@ instance_free(struct service_instance *in)
        free(in->bundle);
        free(in->jail.name);
        free(in->jail.hostname);
+       free(in->jail.pidfile);
        free(in->seccomp);
        free(in->capabilities);
        free(in->pidfile);
@@ -1640,6 +1656,9 @@ void instance_dump(struct blob_buf *b, struct service_instance *in, int verbose)
                        blobmsg_add_u8(b, "userns", in->jail.userns);
                        blobmsg_add_u8(b, "cgroupsns", in->jail.cgroupsns);
                } else {
+                       if (in->jail.pidfile)
+                               blobmsg_add_string(b, "pidfile", in->jail.pidfile);
+
                        blobmsg_add_u8(b, "immediately", in->immediately);
                }
                blobmsg_add_u8(b, "console", (in->console.fd.fd > -1));