+static int
+instance_jail_parse(struct service_instance *in, struct blob_attr *attr)
+{
+ struct blob_attr *tb[__JAIL_ATTR_MAX];
+ struct jail *jail = &in->jail;
+ struct stat s;
+
+ if (stat("/sbin/ujail", &s))
+ return 0;
+
+ blobmsg_parse(jail_attr, __JAIL_ATTR_MAX, tb,
+ blobmsg_data(attr), blobmsg_data_len(attr));
+
+ jail->argc = 2;
+
+ if (tb[JAIL_ATTR_NAME]) {
+ jail->name = blobmsg_get_string(tb[JAIL_ATTR_NAME]);
+ jail->argc += 2;
+ }
+ if (tb[JAIL_ATTR_ROOT]) {
+ jail->root = blobmsg_get_string(tb[JAIL_ATTR_ROOT]);
+ jail->argc += 2;
+ }
+ if (tb[JAIL_ATTR_PROCFS]) {
+ jail->procfs = blobmsg_get_bool(tb[JAIL_ATTR_PROCFS]);
+ jail->argc++;
+ }
+ if (tb[JAIL_ATTR_SYSFS]) {
+ jail->sysfs = blobmsg_get_bool(tb[JAIL_ATTR_SYSFS]);
+ jail->argc++;
+ }
+ if (tb[JAIL_ATTR_UBUS]) {
+ jail->ubus = blobmsg_get_bool(tb[JAIL_ATTR_UBUS]);
+ jail->argc++;
+ }
+ if (tb[JAIL_ATTR_LOG]) {
+ jail->log = blobmsg_get_bool(tb[JAIL_ATTR_LOG]);
+ jail->argc++;
+ }
+ if (tb[JAIL_ATTR_MOUNT]) {
+ struct blob_attr *cur;
+ int rem;
+
+ blobmsg_for_each_attr(cur, tb[JAIL_ATTR_MOUNT], rem)
+ jail->argc += 2;
+ instance_fill_array(&jail->mount, tb[JAIL_ATTR_MOUNT], NULL, false);
+ }
+ if (in->seccomp)
+ jail->argc += 2;
+
+ return 1;
+}
+