[MEDIUM] Implement and use generic findproxy and relax duplicated proxy check

This patch:
 - adds proxy_mode_str() similar to proxy_type_str()
 - adds a generic findproxy function used with default_backend/setbe/use_backed
 - rewrite default_backend/senbe/use_backed to use introduced findproxy()
 - relaxes duplicated proxy check
 - changes capabilities displaying from "%X" to "%s" with a call to proxy_type_str()
diff --git a/src/cfgparse.c b/src/cfgparse.c
index 5e6ce4e..fc333bf 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -539,9 +539,8 @@
 			if (!strcmp(curproxy->id, args[1]) &&
 				(rc!=(PR_CAP_FE|PR_CAP_RS) || curproxy->cap!=(PR_CAP_BE|PR_CAP_RS)) &&
 				(rc!=(PR_CAP_BE|PR_CAP_RS) || curproxy->cap!=(PR_CAP_FE|PR_CAP_RS))) {
-				Alert("parsing %s: duplicated proxy %s with conflicting capabilities: %X/%X!\n",
-					file, args[1], curproxy->cap, rc);
-				return -1;
+				Warning("Parsing [%s:%d]: duplicated proxy '%s' with conflicting capabilities: %s/%s!\n",
+					file, linenum, args[1], proxy_type_str(curproxy), args[0]);
 			}
 		}
 
@@ -2529,21 +2528,14 @@
 		if (curproxy->defbe.name) {
 			struct proxy *target;
 
-			for (target = proxy; target != NULL; target = target->next) {
-				if ((target->cap & PR_CAP_BE) && !strcmp(target->id, curproxy->defbe.name))
-					break;
-			}
-			if (target == NULL) {
-				Alert("parsing %s: default proxy '%s' with backend capability in HTTP %s '%s' was not found!\n", 
-				      file, curproxy->defbe.name, proxy_type_str(curproxy), curproxy->id);
+			target = findproxy(curproxy->defbe.name, curproxy->mode, PR_CAP_BE);
+			if (!target) {
+				Alert("Proxy '%s': unable to find required default_backend: '%s'.\n",
+					curproxy->id, curproxy->defbe.name);
 				cfgerr++;
 			} else if (target == curproxy) {
-				Alert("parsing %s : loop detected for default backend %s !\n", file, curproxy->defbe.name);
-				cfgerr++;
-			} else if (target->mode != curproxy->mode) {
-				Alert("parsing %s : default backend '%s' in HTTP %s '%s' is not of same mode (tcp/http) !\n",
-				      file, curproxy->defbe.name, proxy_type_str(curproxy), curproxy->id);
-				cfgerr++;
+				Alert("Proxy '%s': loop detected for default_backend: '%s'.\n",
+					curproxy->id, curproxy->defbe.name);
 			} else {
 				free(curproxy->defbe.name);
 				curproxy->defbe.be = target;
@@ -2554,24 +2546,20 @@
 		if (curproxy->mode == PR_MODE_HTTP && curproxy->req_exp != NULL) {
 			/* map jump target for ACT_SETBE in req_rep chain */ 
 			struct hdr_exp *exp;
-			struct proxy *target;
 			for (exp = curproxy->req_exp; exp != NULL; exp = exp->next) {
+				struct proxy *target;
+
 				if (exp->action != ACT_SETBE)
 					continue;
-				for (target = proxy; target != NULL; target = target->next) {
-					if ((target->cap & PR_CAP_BE) && !strcmp(target->id, exp->replace))
-						break;
-				}
-				if (target == NULL) {
-					Alert("parsing %s: proxy '%s' with backend capability in HTTP %s '%s' was not found!\n", 
-					      file, exp->replace, proxy_type_str(curproxy), curproxy->id);
+
+				target = findproxy(exp->replace, PR_MODE_HTTP, PR_CAP_BE);
+				if (!target) {
+					Alert("Proxy '%s': unable to find required setbe: '%s'.\n",
+						curproxy->id, exp->replace);
 					cfgerr++;
 				} else if (target == curproxy) {
-					Alert("parsing %s : loop detected for backend %s !\n", file, exp->replace);
-					cfgerr++;
-				} else if (target->mode != PR_MODE_HTTP) {
-					Alert("parsing %s : backend '%s' in HTTP %s '%s' is not HTTP (use 'mode http') !\n",
-					      file, exp->replace, proxy_type_str(curproxy), curproxy->id);
+					Alert("Proxy '%s': loop detected for setbe: '%s'.\n",
+						curproxy->id, exp->replace);
 					cfgerr++;
 				} else {
 					free((void *)exp->replace);
@@ -2582,24 +2570,17 @@
 
 		/* find the target proxy for 'use_backend' rules */
 		list_for_each_entry(rule, &curproxy->switching_rules, list) {
-			/* map jump target for ACT_SETBE in req_rep chain */ 
 			struct proxy *target;
 
-			for (target = proxy; target != NULL; target = target->next) {
-				if ((target->cap & PR_CAP_BE) && !strcmp(target->id, rule->be.name))
-					break;
-			}
+			target = findproxy(rule->be.name, curproxy->mode, PR_CAP_BE);
 
-			if (target == NULL) {
-				Alert("parsing %s: proxy '%s' with backend capability in HTTP %s '%s' was not found!\n", 
-				      file, rule->be.name, proxy_type_str(curproxy), curproxy->id);
+			if (!target) {
+				Alert("Proxy '%s': unable to find required use_backend: '%s'.\n",
+					curproxy->id, rule->be.name);
 				cfgerr++;
 			} else if (target == curproxy) {
-				Alert("parsing %s : loop detected for backend %s !\n", file, rule->be.name);
-				cfgerr++;
-			} else if (target->mode != curproxy->mode) {
-				Alert("parsing %s : backend '%s' referenced in %s '%s' is of different mode !\n",
-				      file, rule->be.name, proxy_type_str(curproxy), curproxy->id);
+				Alert("Proxy '%s': loop detected for use_backend: '%s'.\n",
+					curproxy->id, rule->be.name);
 				cfgerr++;
 			} else {
 				free((void *)rule->be.name);