From 12623b43060a683ceaccb42af88f90db5bb00d9f Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Mon, 7 Feb 2011 03:20:05 +0100 Subject: [PATCH] trim the wildcard of partial patterns to keep the avl tree sorted properly --- ubusd_event.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/ubusd_event.c b/ubusd_event.c index 8e15d8d..de36879 100644 --- a/ubusd_event.c +++ b/ubusd_event.c @@ -17,6 +17,7 @@ struct event_source { union { struct { struct avl_node avl; + bool partial; } pattern; struct { struct list_head list; @@ -86,8 +87,10 @@ static int ubusd_alloc_event_pattern(struct ubus_client *cl, struct blob_attr *m struct event_source *ev; struct ubus_object *obj; struct blob_attr *attr[EVREG_LAST]; - const char *pattern; + char *pattern; uint32_t id; + bool partial = false; + int len; blobmsg_parse(evr_policy, EVREG_LAST, attr, blob_data(msg), blob_len(msg)); if (!attr[EVREG_OBJECT]) @@ -108,7 +111,16 @@ static int ubusd_alloc_event_pattern(struct ubus_client *cl, struct blob_attr *m return ubusd_alloc_catchall(obj); pattern = blobmsg_data(attr[EVREG_PATTERN]); - ev = ubusd_alloc_event_source(obj, EVS_PATTERN, strlen(pattern) + 1); + + len = strlen(pattern); + if (pattern[len - 1] == '*') { + partial = true; + pattern[len - 1] = 0; + len--; + } + + ev = ubusd_alloc_event_source(obj, EVS_PATTERN, len + 1); + ev->pattern.partial = partial; ev->pattern.avl.key = (void *) (ev + 1); strcpy(ev->pattern.avl.key, pattern); avl_insert(&patterns, &ev->pattern.avl);