MEDIUM: peers: add the ability to disable a peers section

Sometimes it's very hard to disable the use of peers because an empty
section is not valid, so it is necessary to comment out all references
to the section, and not to forget to restore them in the same state
after the operation.

Let's add a "disabled" keyword just like for proxies. A ->state member
in the peers struct is even present for this purpose but was never used
at all.

Maybe it would make sense to backport this to 1.5 as it's really cumbersome
there.
(cherry picked from commit 77e4bd1497802a69fed73feb61cee53f3fbf75a0)
diff --git a/src/cfgparse.c b/src/cfgparse.c
index 583c009..746c7eb 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -1744,6 +1744,7 @@
 		curpeers->conf.line = linenum;
 		curpeers->last_change = now.tv_sec;
 		curpeers->id = strdup(args[1]);
+		curpeers->state = PR_STNEW;
 	}
 	else if (strcmp(args[0], "peer") == 0) { /* peer definition */
 		struct sockaddr_storage *sk;
@@ -1876,6 +1877,12 @@
 			}
 		}
 	} /* neither "peer" nor "peers" */
+	else if (!strcmp(args[0], "disabled")) {  /* disables this peers section */
+		curpeers->state = PR_STSTOPPED;
+	}
+	else if (!strcmp(args[0], "enabled")) {  /* enables this peers section (used to revert a disabled default) */
+		curpeers->state = PR_STNEW;
+	}
 	else if (*args[0] != 0) {
 		Alert("parsing [%s:%d] : unknown keyword '%s' in '%s' section\n", file, linenum, args[0], cursection);
 		err_code |= ERR_ALERT | ERR_FATAL;
@@ -6527,6 +6534,10 @@
 				curproxy->table.peers.p = NULL;
 				cfgerr++;
 			}
+			else if (curpeers->state == PR_STSTOPPED) {
+				/* silently disable this peers section */
+				curproxy->table.peers.p = NULL;
+			}
 			else if (!curpeers->peers_fe) {
 				Alert("Proxy '%s': unable to find local peer '%s' in peers section '%s'.\n",
 				      curproxy->id, localpeer, curpeers->id);
@@ -7396,14 +7407,23 @@
 		last = &peers;
 		while (*last) {
 			curpeers = *last;
-			if (curpeers->peers_fe) {
+
+			if (curpeers->state == PR_STSTOPPED) {
+				/* the "disabled" keyword was present */
+				if (curpeers->peers_fe)
+					stop_proxy(curpeers->peers_fe);
+				curpeers->peers_fe = NULL;
+			}
+			else if (!curpeers->peers_fe) {
+				Warning("Removing incomplete section 'peers %s' (no peer named '%s').\n",
+					curpeers->id, localpeer);
+			}
+			else {
 				last = &curpeers->next;
 				continue;
 			}
 
-			Warning("Removing incomplete section 'peers %s' (no peer named '%s').\n",
-				curpeers->id, localpeer);
-
+			/* clean what has been detected above */
 			p = curpeers->remote;
 			while (p) {
 				pb = p->next;