s->name = new_name;
s->avl.key = s->name;
INIT_LIST_HEAD(&s->validators);
+ blobmsg_list_simple_init(&s->data_blob);
return s;
}
SERVICE_SET_TRIGGER,
SERVICE_SET_VALIDATE,
SERVICE_SET_AUTOSTART,
+ SERVICE_SET_DATA,
__SERVICE_SET_MAX
};
[SERVICE_SET_TRIGGER] = { "triggers", BLOBMSG_TYPE_ARRAY },
[SERVICE_SET_VALIDATE] = { "validate", BLOBMSG_TYPE_ARRAY },
[SERVICE_SET_AUTOSTART] = { "autostart", BLOBMSG_TYPE_BOOL },
+ [SERVICE_SET_DATA] = { "data", BLOBMSG_TYPE_TABLE },
};
static int
s->trigger = NULL;
}
+ if (s->data) {
+ blobmsg_list_free(&s->data_blob);
+ free(s->data);
+ s->data = NULL;
+ }
+
service_validate_del(s);
if (tb[SERVICE_SET_AUTOSTART] && !blobmsg_get_bool(tb[SERVICE_SET_AUTOSTART]))
vlist_flush(&s->instances);
}
+ if (tb[SERVICE_SET_DATA] && blobmsg_data_len(tb[SERVICE_SET_DATA])) {
+ s->data = blob_memdup(tb[SERVICE_SET_DATA]);
+ if (!s->data)
+ return -1;
+ blobmsg_list_fill(&s->data_blob, blobmsg_data(s->data),
+ blobmsg_data_len(s->data), false);
+ }
+
s->deleted = false;
rc(s->name, "running");
static void
service_delete(struct service *s)
{
+ blobmsg_list_free(&s->data_blob);
+ free(s->data);
vlist_flush_all(&s->instances);
s->deleted = true;
service_stopped(s);
bool add = !strcmp(method, "add");
int ret;
- blobmsg_parse(service_set_attrs, __SERVICE_SET_MAX, tb, blob_data(msg), blob_len(msg));
+ blobmsg_parse(service_set_attrs, __SERVICE_SET_MAX, tb, blobmsg_data(msg), blobmsg_data_len(msg));
cur = tb[SERVICE_SET_NAME];
if (!cur)
return UBUS_STATUS_INVALID_ARGUMENT;
if (!s->autostart)
blobmsg_add_u8(&b, "autostart", false);
+ if (!avl_is_empty(&s->data_blob.avl)) {
+ struct blobmsg_list_node *var;
+ i = blobmsg_open_table(&b, "data");
+ blobmsg_list_for_each(&s->data_blob, var)
+ blobmsg_add_blob(&b, var->data);
+ blobmsg_close_table(&b, i);
+ }
+
if (!avl_is_empty(&s->instances.avl)) {
i = blobmsg_open_table(&b, "instances");
vlist_for_each_element(&s->instances, in, node)
const char *name = NULL;
bool verbose = false;
- blobmsg_parse(service_list_attrs, __SERVICE_LIST_ATTR_MAX, tb, blob_data(msg), blob_len(msg));
+ blobmsg_parse(service_list_attrs, __SERVICE_LIST_ATTR_MAX, tb, blobmsg_data(msg), blobmsg_data_len(msg));
if (tb[SERVICE_LIST_ATTR_VERBOSE])
verbose = blobmsg_get_bool(tb[SERVICE_LIST_ATTR_VERBOSE]);
struct service *s;
struct service_instance *in;
- blobmsg_parse(service_del_attrs, __SERVICE_DEL_ATTR_MAX, tb, blob_data(msg), blob_len(msg));
+ blobmsg_parse(service_del_attrs, __SERVICE_DEL_ATTR_MAX, tb, blobmsg_data(msg), blobmsg_data_len(msg));
cur = tb[SERVICE_DEL_ATTR_NAME];
if (!cur)
int sig = SIGHUP;
int rv = 0;
- blobmsg_parse(service_signal_attrs, __SERVICE_SIGNAL_ATTR_MAX, tb, blob_data(msg), blob_len(msg));
+ blobmsg_parse(service_signal_attrs, __SERVICE_SIGNAL_ATTR_MAX, tb, blobmsg_data(msg), blobmsg_data_len(msg));
cur = tb[SERVICE_SIGNAL_ATTR_SIGNAL];
if (cur)
struct service_instance *in;
int spawn;
- blobmsg_parse(service_state_attrs, __SERVICE_STATE_ATTR_MAX, tb, blob_data(msg), blob_len(msg));
+ blobmsg_parse(service_state_attrs, __SERVICE_STATE_ATTR_MAX, tb, blobmsg_data(msg), blobmsg_data_len(msg));
if (!tb[SERVICE_STATE_ATTR_SPAWN])
return UBUS_STATUS_INVALID_ARGUMENT;
struct blob_attr *tb[__SERVICE_ATTR_MAX], *cur;
struct service *s;
- blobmsg_parse(service_attrs, __SERVICE_ATTR_MAX, tb, blob_data(msg), blob_len(msg));
+ blobmsg_parse(service_attrs, __SERVICE_ATTR_MAX, tb, blobmsg_data(msg), blobmsg_data_len(msg));
cur = tb[SERVICE_SET_NAME];
if (!cur)
if (!msg)
return UBUS_STATUS_INVALID_ARGUMENT;
- blobmsg_parse(event_policy, __EVENT_MAX, tb, blob_data(msg), blob_len(msg));
+ blobmsg_parse(event_policy, __EVENT_MAX, tb, blobmsg_data(msg), blobmsg_data_len(msg));
if (!tb[EVENT_TYPE] || !tb[EVENT_DATA])
return UBUS_STATUS_INVALID_ARGUMENT;
struct blob_attr *tb2[__VALIDATE_MAX];
blobmsg_parse(validate_policy, __VALIDATE_MAX, tb2,
- blobmsg_data(tb[EVENT_DATA]), blobmsg_len(tb[EVENT_DATA]));
+ blobmsg_data(tb[EVENT_DATA]), blobmsg_data_len(tb[EVENT_DATA]));
if (tb2[VALIDATE_PACKAGE])
ubus_event_bcast("config.change", "config",
blobmsg_get_string(tb2[VALIDATE_PACKAGE]), NULL, NULL);
if (!msg)
return UBUS_STATUS_INVALID_ARGUMENT;
- blobmsg_parse(validate_policy, __VALIDATE_MAX, tb, blob_data(msg), blob_len(msg));
+ blobmsg_parse(validate_policy, __VALIDATE_MAX, tb, blobmsg_data(msg), blobmsg_data_len(msg));
if (tb[VALIDATE_SERVICE]) {
return 0;
}
const char *instance = NULL;
const char *type = NULL;
- blobmsg_parse(get_data_policy, __DATA_MAX, tb, blob_data(msg), blob_len(msg));
+ blobmsg_parse(get_data_policy, __DATA_MAX, tb, blobmsg_data(msg), blobmsg_data_len(msg));
if (tb[DATA_NAME])
name = blobmsg_data(tb[DATA_NAME]);
if (tb[DATA_INSTANCE])
blob_buf_init(&b, 0);
avl_for_each_element(&services, s, avl) {
void *cs = NULL;
+ void *ci = NULL;
+ struct blobmsg_list_node *var;
if (name && strcmp(name, s->name))
continue;
+ blobmsg_list_for_each(&s->data_blob, var) {
+ if (type && strcmp(blobmsg_name(var->data), type))
+ continue;
+
+ if (!cs)
+ cs = blobmsg_open_table(&b, s->name);
+
+ blobmsg_add_blob(&b, var->data);
+ }
+
vlist_for_each_element(&s->instances, in, node) {
- struct blobmsg_list_node *var;
- void *ci = NULL;
+ ci = NULL;
if (instance && strcmp(instance, in->name))
continue;