From: Willy Tarreau Date: Sat, 15 Mar 2014 06:43:51 +0000 (+0100) Subject: MEDIUM: proxy: make findproxy() use trees to look up proxies X-Git-Tag: v1.5-dev23~142 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cfd837fb6c5cad7a641be7af1748cb039968ff73;p=thirdparty%2Fhaproxy.git MEDIUM: proxy: make findproxy() use trees to look up proxies Both proxy IDs and names are now looked up from the trees. --- diff --git a/src/proxy.c b/src/proxy.c index 3cbc1b4ac2..c2ba2ccde6 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; }