service: fix calls to blobmsg_parse()
[project/procd.git] / service / service.c
index 0584ee04524cbcfa28c6b0bad8c977232760bb3f..9b1318e4530db71f599a38aab25fbfde8ac75a89 100644 (file)
@@ -140,6 +140,8 @@ service_update(struct service *s, struct blob_attr **tb, bool add)
                        vlist_flush(&s->instances);
        }
 
+       s->deleted = false;
+
        rc(s->name, "running");
 
        return 0;
@@ -149,6 +151,7 @@ static void
 service_delete(struct service *s)
 {
        vlist_flush_all(&s->instances);
+       s->deleted = true;
        service_stopped(s);
 }
 
@@ -244,8 +247,8 @@ service_handle_set(struct ubus_context *ctx, struct ubus_object *obj,
        bool add = !strcmp(method, "add");
        int ret;
 
-       blobmsg_parse(service_set_attrs, __SERVICE_SET_MAX, tb, blob_data(msg), blob_len(msg));
-       cur = tb[SERVICE_ATTR_NAME];
+       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;
 
@@ -304,7 +307,7 @@ service_handle_list(struct ubus_context *ctx, struct ubus_object *obj,
        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]);
@@ -333,7 +336,7 @@ service_handle_delete(struct ubus_context *ctx, struct ubus_object *obj,
        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)
@@ -386,7 +389,7 @@ service_handle_signal(struct ubus_context *ctx, struct ubus_object *obj,
        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)
@@ -425,7 +428,7 @@ service_handle_update(struct ubus_context *ctx, struct ubus_object *obj,
        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)
@@ -453,7 +456,7 @@ service_handle_event(struct ubus_context *ctx, struct ubus_object *obj,
        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;
 
@@ -473,7 +476,7 @@ service_handle_validate(struct ubus_context *ctx, struct ubus_object *obj,
        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;
        }
@@ -502,7 +505,7 @@ service_get_data(struct ubus_context *ctx, struct ubus_object *obj,
        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])
@@ -602,13 +605,13 @@ service_start_early(char *name, char *cmdline)
 
 void service_stopped(struct service *s)
 {
-       if (avl_is_empty(&s->instances.avl)) {
+       if (s->deleted && avl_is_empty(&s->instances.avl)) {
                service_event("service.stop", s->name, NULL);
                avl_delete(&services, &s->avl);
                trigger_del(s);
+               service_validate_del(s);
                free(s->trigger);
                free(s);
-               service_validate_del(s);
        }
 }