X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=service%2Fservice.c;h=9c798aae67c97f1ef6c75ffba8d215d6dcad185e;hp=6ba0c1741daba8872c221d69fb23452c3eb901fa;hb=d4a183f91f88be1e195e40277f709177d5142ba9;hpb=e0098d49a95d6f33252c9eb2f98e963c3fffe50b;ds=sidebyside diff --git a/service/service.c b/service/service.c index 6ba0c17..9c798aa 100644 --- a/service/service.c +++ b/service/service.c @@ -25,6 +25,7 @@ AVL_TREE(services, avl_strcmp, false, NULL); static struct blob_buf b; static struct ubus_context *ctx; +static struct ubus_object main_object; static void service_instance_add(struct service *s, struct blob_attr *attr) @@ -266,7 +267,7 @@ service_handle_set(struct ubus_context *ctx, struct ubus_object *obj, int ret; blobmsg_parse(service_set_attrs, __SERVICE_SET_MAX, tb, blob_data(msg), blob_len(msg)); - cur = tb[SERVICE_ATTR_NAME]; + cur = tb[SERVICE_SET_NAME]; if (!cur) return UBUS_STATUS_INVALID_ARGUMENT; @@ -502,12 +503,27 @@ service_handle_update(struct ubus_context *ctx, struct ubus_object *obj, return 0; } +static void ubus_event_bcast(const char *type, const char *param1, const char *val1, + const char *param2, const char *val2) +{ + if (!ctx) + return; + + blob_buf_init(&b, 0); + if (param1 && val1) + blobmsg_add_string(&b, param1, val1); + if (param2 && val2) + blobmsg_add_string(&b, param2, val2); + ubus_notify(ctx, &main_object, type, b.head, -1); +} + static int service_handle_event(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) { struct blob_attr *tb[__EVENT_MAX]; + const char *event; if (!msg) return UBUS_STATUS_INVALID_ARGUMENT; @@ -516,8 +532,18 @@ service_handle_event(struct ubus_context *ctx, struct ubus_object *obj, if (!tb[EVENT_TYPE] || !tb[EVENT_DATA]) return UBUS_STATUS_INVALID_ARGUMENT; - trigger_event(blobmsg_get_string(tb[EVENT_TYPE]), tb[EVENT_DATA]); + event = blobmsg_get_string(tb[EVENT_TYPE]); + trigger_event(event, tb[EVENT_DATA]); + if (!strcmp(event, "config.change")) { + struct blob_attr *tb2[__DATA_MAX]; + + blobmsg_parse(validate_policy, __VALIDATE_MAX, tb2, + blobmsg_data(tb[EVENT_DATA]), blobmsg_len(tb[EVENT_DATA])); + if (tb2[VALIDATE_PACKAGE]) + ubus_event_bcast("config.change", "config", + blobmsg_get_string(tb2[VALIDATE_PACKAGE]), NULL, NULL); + } return 0; } @@ -666,22 +692,15 @@ void service_stopped(struct service *s) 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); } } void service_event(const char *type, const char *service, const char *instance) { - if (!ctx) - return; - - blob_buf_init(&b, 0); - blobmsg_add_string(&b, "service", service); - if (instance) - blobmsg_add_string(&b, "instance", instance); - ubus_notify(ctx, &main_object, type, b.head, -1); + ubus_event_bcast(type, "service", service, "instance", instance); } void ubus_init_service(struct ubus_context *_ctx)