service: use avl_remove_all_elements()
[project/procd.git] / service / service.c
index 3fc8424..23532e8 100644 (file)
@@ -103,7 +103,7 @@ static const struct blobmsg_policy service_set_attrs[__SERVICE_SET_MAX] = {
 };
 
 static int
-service_update(struct service *s, struct blob_attr *config, struct blob_attr **tb, bool add)
+service_update(struct service *s, struct blob_attr **tb, bool add)
 {
        struct blob_attr *cur;
        int rem;
@@ -117,10 +117,9 @@ service_update(struct service *s, struct blob_attr *config, struct blob_attr **t
        service_validate_del(s);
 
        if (tb[SERVICE_SET_TRIGGER] && blobmsg_data_len(tb[SERVICE_SET_TRIGGER])) {
-               s->trigger = malloc(blob_pad_len(tb[SERVICE_SET_TRIGGER]));
+               s->trigger = blob_memdup(tb[SERVICE_SET_TRIGGER]);
                if (!s->trigger)
                        return -1;
-               memcpy(s->trigger, tb[SERVICE_SET_TRIGGER], blob_pad_len(tb[SERVICE_SET_TRIGGER]));
                trigger_add(s->trigger, s);
        }
 
@@ -217,20 +216,20 @@ service_handle_set(struct ubus_context *ctx, struct ubus_object *obj,
        struct blob_attr *tb[__SERVICE_SET_MAX], *cur;
        struct service *s = NULL;
        const char *name;
-       int ret = UBUS_STATUS_INVALID_ARGUMENT;
        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];
        if (!cur)
-               goto free;
+               return UBUS_STATUS_INVALID_ARGUMENT;
 
        name = blobmsg_data(cur);
 
        s = avl_find_element(&services, name, s, avl);
        if (s) {
                DEBUG(2, "Update service %s\n", name);
-               return service_update(s, msg, tb, add);
+               return service_update(s, tb, add);
        }
 
        DEBUG(2, "Create service %s\n", name);
@@ -238,17 +237,13 @@ service_handle_set(struct ubus_context *ctx, struct ubus_object *obj,
        if (!s)
                return UBUS_STATUS_UNKNOWN_ERROR;
 
-       ret = service_update(s, msg, tb, add);
+       ret = service_update(s, tb, add);
        if (ret)
-               goto free;
+               return ret;
 
        avl_insert(&services, &s->avl);
 
        return 0;
-
-free:
-       free(msg);
-       return ret;
 }
 
 static void