trim the wildcard of partial patterns to keep the avl tree sorted properly
This commit is contained in:
parent
27a16f8b1d
commit
12623b4306
1 changed files with 14 additions and 2 deletions
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue