trim the wildcard of partial patterns to keep the avl tree sorted properly

This commit is contained in:
Felix Fietkau 2011-02-07 03:20:05 +01:00
parent 27a16f8b1d
commit 12623b4306

View file

@ -17,6 +17,7 @@ struct event_source {
union { union {
struct { struct {
struct avl_node avl; struct avl_node avl;
bool partial;
} pattern; } pattern;
struct { struct {
struct list_head list; 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 event_source *ev;
struct ubus_object *obj; struct ubus_object *obj;
struct blob_attr *attr[EVREG_LAST]; struct blob_attr *attr[EVREG_LAST];
const char *pattern; char *pattern;
uint32_t id; uint32_t id;
bool partial = false;
int len;
blobmsg_parse(evr_policy, EVREG_LAST, attr, blob_data(msg), blob_len(msg)); blobmsg_parse(evr_policy, EVREG_LAST, attr, blob_data(msg), blob_len(msg));
if (!attr[EVREG_OBJECT]) 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); return ubusd_alloc_catchall(obj);
pattern = blobmsg_data(attr[EVREG_PATTERN]); 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); ev->pattern.avl.key = (void *) (ev + 1);
strcpy(ev->pattern.avl.key, pattern); strcpy(ev->pattern.avl.key, pattern);
avl_insert(&patterns, &ev->pattern.avl); avl_insert(&patterns, &ev->pattern.avl);