+service_handle_state(struct ubus_context *ctx, struct ubus_object *obj,
+ struct ubus_request_data *req, const char *method,
+ struct blob_attr *msg)
+{
+ struct blob_attr *tb[__SERVICE_STATE_ATTR_MAX];
+ struct service *s;
+ struct service_instance *in;
+ int spawn;
+
+ blobmsg_parse(service_state_attrs, __SERVICE_STATE_ATTR_MAX, tb, blob_data(msg), blob_len(msg));
+
+ if (!tb[SERVICE_STATE_ATTR_SPAWN])
+ return UBUS_STATUS_INVALID_ARGUMENT;
+
+ if (!tb[SERVICE_STATE_ATTR_NAME])
+ return UBUS_STATUS_NOT_FOUND;
+
+ s = avl_find_element(&services, blobmsg_data(tb[SERVICE_STATE_ATTR_NAME]), s, avl);
+ if (!s)
+ return UBUS_STATUS_NOT_FOUND;
+
+ spawn = !!blobmsg_get_u8(tb[SERVICE_STATE_ATTR_SPAWN]);
+ vlist_for_each_element(&s->instances, in, node) {
+ if (!!in->proc.pending == !!spawn)
+ continue;
+ else if (!in->proc.pending)
+ instance_start(in);
+ else
+ instance_stop(in, false);
+ }
+
+ return UBUS_STATUS_OK;
+}
+
+static int