diff --git a/src/proxy.c b/src/proxy.c index 3cbc1b4ac..c2ba2ccde 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -25,6 +25,9 @@ #include #include +#include +#include + #include #include #include @@ -339,23 +342,44 @@ struct proxy *findproxy(const char *name, int cap) { struct proxy *curproxy, *target = NULL; int pid = -1; - if (*name == '#') + if (*name == '#') { + struct eb32_node *node; + pid = atoi(name + 1); - for (curproxy = proxy; curproxy; curproxy = curproxy->next) { - if ((curproxy->cap & cap) != cap || - (pid >= 0 && curproxy->uuid != pid) || - (pid < 0 && strcmp(curproxy->id, name))) - continue; + for (node = eb32_lookup(&used_proxy_id, pid); node; node = eb32_next(node)) { + curproxy = container_of(node, struct proxy, conf.id); + + if (curproxy->uuid != pid) + break; + + if ((curproxy->cap & cap) != cap) + continue; + + if (target) + return NULL; - if (!target) { target = curproxy; - continue; } - - return NULL; } + else { + struct ebpt_node *node; + for (node = ebis_lookup(&proxy_by_name, name); node; node = ebpt_next(node)) { + curproxy = container_of(node, struct proxy, conf.by_name); + + if (strcmp(curproxy->id, name) != 0) + break; + + if ((curproxy->cap & cap) != cap) + continue; + + if (target) + return NULL; + + target = curproxy; + } + } return target; }