X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=service%2Ftrigger.c;h=ced758baefadf2ac2e6d2926512cc1aa24fd8665;hp=41fb55dc4c5288f65faf082c4075c6cd72c1f380;hb=79872ea6ca5867631c1ec5405721af12bea818b2;hpb=916f95cb58604038695347ee41a430d8ca1f0556 diff --git a/service/trigger.c b/service/trigger.c index 41fb55d..ced758b 100644 --- a/service/trigger.c +++ b/service/trigger.c @@ -88,13 +88,21 @@ static void q_job_run(struct runqueue *q, struct runqueue_task *t) j->cmd->handler(j, j->exec, j->env); } +static void trigger_free(struct trigger *t) +{ + json_script_free(&t->jctx); + uloop_timeout_cancel(&t->delay); + free(t->data); + list_del(&t->list); + free(t); +} + static void q_job_complete(struct runqueue *q, struct runqueue_task *p) { struct job *j = container_of(p, struct job, proc.task); if (j->trigger->remove) { - list_del(&j->trigger->list); - free(j->trigger); + trigger_free(j->trigger); } else { j->trigger->pending = 0; } @@ -219,6 +227,7 @@ static void trigger_delay_cb(struct uloop_timeout *tout) json_script_run(&t->jctx, "foo", t->data); free(t->data); + t->data = NULL; } static struct trigger* _trigger_add(char *type, struct blob_attr *rule, int timeout, void *id) @@ -302,8 +311,8 @@ void trigger_del(void *id) t->remove = 1; continue; } - list_del(&t->list); - free(t); + + trigger_free(t); } } @@ -314,17 +323,25 @@ void trigger_init(void) q.max_running_tasks = 1; } -void trigger_event(char *type, struct blob_attr *data) +static int trigger_match(const char *event, const char *match) +{ + char *wildcard = strstr(match, ".*"); + if (wildcard) + return strncmp(event, match, wildcard - match); + return strcmp(event, match); +} + +void trigger_event(const char *type, struct blob_attr *data) { struct trigger *t; list_for_each_entry(t, &triggers, list) { if (t->pending || t->remove) continue; - if (!strcmp(t->type, type)) { + if (!trigger_match(type, t->type)) { if (t->timeout) { - t->data = malloc(blob_pad_len(data)); - memcpy(t->data, data, blob_pad_len(data)); + free(t->data); + t->data = blob_memdup(data); uloop_timeout_set(&t->delay, t->timeout); } else { json_script_run(&t->jctx, "foo", data);