MINOR: protocols: register the ->add function and stop calling them directly

cfgparse has no business directly calling each individual protocol's 'add'
function to create a listener. Now that they're all registered, better
perform a protocol lookup on the family and have a standard ->add method
for all of them.
diff --git a/src/cfgparse.c b/src/cfgparse.c
index 9752b81..759d407 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -72,8 +72,6 @@
 #include <proto/listener.h>
 #include <proto/log.h>
 #include <proto/protocol.h>
-#include <proto/proto_tcp.h>
-#include <proto/proto_uxst.h>
 #include <proto/proto_http.h>
 #include <proto/proxy.h>
 #include <proto/peers.h>
@@ -288,6 +286,13 @@
 		memcpy(&ss, ss2, sizeof(ss));
 
 		for (; port <= end; port++) {
+			struct protocol *proto = protocol_by_family(ss.ss_family);
+
+			if (!proto) {
+				memprintf(err, "unsupported protocol family %d for address '%s'.\n", ss.ss_family, str);
+				goto fail;
+			}
+
 			l = calloc(1, sizeof(*l));
 			l->obj_type = OBJ_TYPE_LISTENER;
 			LIST_ADDQ(&curproxy->conf.listeners, &l->by_fe);
@@ -298,15 +303,7 @@
 			memcpy(&l->addr, &ss, sizeof(ss));
 			l->state = LI_INIT;
 
-			if (ss.ss_family == AF_INET) {
-				tcpv4_add_listener(l, port);
-			}
-			else if (ss.ss_family == AF_INET6) {
-				tcpv6_add_listener(l, port);
-			}
-			else {
-				uxst_add_listener(l, port);
-			}
+			proto->add(l, port);
 
 			jobs++;
 			listeners++;
diff --git a/src/proto_tcp.c b/src/proto_tcp.c
index 6b1505a..0fad867 100644
--- a/src/proto_tcp.c
+++ b/src/proto_tcp.c
@@ -63,6 +63,8 @@
 
 static int tcp_bind_listeners(struct protocol *proto, char *errmsg, int errlen);
 static int tcp_bind_listener(struct listener *listener, char *errmsg, int errlen);
+static void tcpv4_add_listener(struct listener *listener, int port);
+static void tcpv6_add_listener(struct listener *listener, int port);
 
 /* Note: must not be declared <const> as its list will be overwritten */
 static struct protocol proto_tcpv4 = {
@@ -83,6 +85,7 @@
 	.get_dst = tcp_get_dst,
 	.drain = tcp_drain,
 	.pause = tcp_pause_listener,
+	.add = tcpv4_add_listener,
 	.listeners = LIST_HEAD_INIT(proto_tcpv4.listeners),
 	.nb_listeners = 0,
 };
@@ -106,6 +109,7 @@
 	.get_dst = tcp_get_dst,
 	.drain = tcp_drain,
 	.pause = tcp_pause_listener,
+	.add = tcpv6_add_listener,
 	.listeners = LIST_HEAD_INIT(proto_tcpv6.listeners),
 	.nb_listeners = 0,
 };
@@ -1141,7 +1145,7 @@
  * listener's state is automatically updated from LI_INIT to LI_ASSIGNED.
  * The number of listeners for the protocol is updated.
  */
-void tcpv4_add_listener(struct listener *listener, int port)
+static void tcpv4_add_listener(struct listener *listener, int port)
 {
 	if (listener->state != LI_INIT)
 		return;
@@ -1156,7 +1160,7 @@
  * listener's state is automatically updated from LI_INIT to LI_ASSIGNED.
  * The number of listeners for the protocol is updated.
  */
-void tcpv6_add_listener(struct listener *listener, int port)
+static void tcpv6_add_listener(struct listener *listener, int port)
 {
 	if (listener->state != LI_INIT)
 		return;
diff --git a/src/proto_uxst.c b/src/proto_uxst.c
index 767cd16..ae6e338 100644
--- a/src/proto_uxst.c
+++ b/src/proto_uxst.c
@@ -49,6 +49,7 @@
 static int uxst_bind_listeners(struct protocol *proto, char *errmsg, int errlen);
 static int uxst_unbind_listeners(struct protocol *proto);
 static int uxst_connect_server(struct connection *conn, int data, int delack);
+static void uxst_add_listener(struct listener *listener, int port);
 
 /* Note: must not be declared <const> as its list will be overwritten */
 static struct protocol proto_unix = {
@@ -69,6 +70,7 @@
 	.get_src = uxst_get_src,
 	.get_dst = uxst_get_dst,
 	.pause = uxst_pause_listener,
+	.add = uxst_add_listener,
 	.listeners = LIST_HEAD_INIT(proto_unix.listeners),
 	.nb_listeners = 0,
 };
@@ -369,7 +371,7 @@
  * listener's state is automatically updated from LI_INIT to LI_ASSIGNED.
  * The number of listeners for the protocol is updated.
  */
-void uxst_add_listener(struct listener *listener, int port)
+static void uxst_add_listener(struct listener *listener, int port)
 {
 	if (listener->state != LI_INIT)
 		return;