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 3cbc1b4..c2ba2cc 100644
--- a/src/proxy.c
+++ b/src/proxy.c
@@ -25,6 +25,9 @@
 #include <common/memory.h>
 #include <common/time.h>
 
+#include <eb32tree.h>
+#include <ebistree.h>
+
 #include <types/global.h>
 #include <types/obj_type.h>
 #include <types/peers.h>
@@ -339,23 +342,44 @@
 	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 (!target) {
+			if (curproxy->uuid != pid)
+				break;
+
+			if ((curproxy->cap & cap) != cap)
+				continue;
+
+			if (target)
+				return NULL;
+
 			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;
 }