]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: protocol: do not call proto->bind() anymore from bind_listener()
authorWilly Tarreau <w@1wt.eu>
Wed, 2 Sep 2020 16:40:02 +0000 (18:40 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 16 Sep 2020 20:08:07 +0000 (22:08 +0200)
All protocol's listeners now only take care of themselves and not of
the receiver anymore since that's already being done in proto_bind_all().
Now it finally becomes obvious that UDP doesn't need a listener, as the
only thing it does is to set the listener's state to LI_LISTEN!

src/proto_sockpair.c
src/proto_tcp.c
src/proto_udp.c
src/proto_uxst.c

index 00fce76cbff73b03e2ce65db2ba3bd9707daa30b..a920f4e61dd35ecd36af38601a471b19502368e0 100644 (file)
@@ -162,12 +162,11 @@ static int sockpair_bind_listener(struct listener *listener, char *errmsg, int e
        if (listener->state != LI_ASSIGNED)
                return ERR_NONE; /* already bound */
 
-       err = sockpair_bind_receiver(&listener->rx, listener->rx.proto->accept, &msg);
-       if (err != ERR_NONE) {
-               snprintf(errmsg, errlen, "%s", msg);
-               free(msg); msg = NULL;
-               return err;
+       if (!(listener->rx.flags & RX_F_BOUND)) {
+               msg = "receiving socket not bound";
+               goto err_return;
        }
+
        listener->state = LI_LISTEN;
        return err;
 
index 57ccfed23b0f28b8a65b384a02900c41461923b0..4af22e557a2a313d8b04aff3a14b1939175d66b5 100644 (file)
@@ -561,6 +561,8 @@ int tcp_bind_listener(struct listener *listener, char *errmsg, int errlen)
        socklen_t ready_len;
        char *msg = NULL;
 
+       err = ERR_NONE;
+
        /* ensure we never return garbage */
        if (errlen)
                *errmsg = 0;
@@ -568,11 +570,9 @@ int tcp_bind_listener(struct listener *listener, char *errmsg, int errlen)
        if (listener->state != LI_ASSIGNED)
                return ERR_NONE; /* already bound */
 
-       err = sock_inet_bind_receiver(&listener->rx, listener->rx.proto->accept, &msg);
-       if (err != ERR_NONE) {
-               snprintf(errmsg, errlen, "%s", msg);
-               free(msg); msg = NULL;
-               return err;
+       if (!(listener->rx.flags & RX_F_BOUND)) {
+               msg = "receiving socket not bound";
+               goto tcp_return;
        }
 
        fd = listener->rx.fd;
@@ -691,6 +691,7 @@ int tcp_bind_listener(struct listener *listener, char *errmsg, int errlen)
 
  tcp_close_return:
        close(fd);
+ tcp_return:
        if (msg && errlen) {
                char pn[INET6_ADDRSTRLEN];
 
index 957deb4d91bc2627fc77dfaddc3d88fa5f1d9054..43eff39c47e8a40aa2561774280c8bcf5e6e343d 100644 (file)
@@ -180,7 +180,6 @@ int udp6_get_dst(int fd, struct sockaddr *sa, socklen_t salen, int dir)
 int udp_bind_listener(struct listener *listener, char *errmsg, int errlen)
 {
        int err = ERR_NONE;
-       void *handler = NULL;
        char *msg = NULL;
 
        /* ensure we never return garbage */
@@ -190,23 +189,11 @@ int udp_bind_listener(struct listener *listener, char *errmsg, int errlen)
        if (listener->state != LI_ASSIGNED)
                return ERR_NONE; /* already bound */
 
-       switch (listener->bind_conf->frontend->mode) {
-       case PR_MODE_SYSLOG:
-               handler = syslog_fd_handler;
-               break;
-       default:
-               err |= ERR_FATAL | ERR_ALERT;
-               msg = "UDP is not yet supported on this proxy mode";
+       if (!(listener->rx.flags & RX_F_BOUND)) {
+               msg = "receiving socket not bound";
                goto udp_return;
        }
 
-       err = sock_inet_bind_receiver(&listener->rx, handler, &msg);
-
-       if (err != ERR_NONE) {
-               snprintf(errmsg, errlen, "%s", msg);
-               free(msg); msg = NULL;
-               return err;
-       }
        listener->state = LI_LISTEN;
 
  udp_return:
index 3e29e871a02977663a5ba7716e3faeb38ef9074b..5ceb18f13d20502dc1131785047d5abc34036fcc 100644 (file)
@@ -103,11 +103,9 @@ static int uxst_bind_listener(struct listener *listener, char *errmsg, int errle
        if (listener->state != LI_ASSIGNED)
                return ERR_NONE; /* already bound */
 
-       err = sock_unix_bind_receiver(&listener->rx, listener->rx.proto->accept, &msg);
-       if (err != ERR_NONE) {
-               snprintf(errmsg, errlen, "%s", msg);
-               free(msg); msg = NULL;
-               return err;
+       if (!(listener->rx.flags & RX_F_BOUND)) {
+               msg = "receiving socket not bound";
+               goto uxst_return;
        }
 
        fd = listener->rx.fd;
@@ -130,6 +128,7 @@ static int uxst_bind_listener(struct listener *listener, char *errmsg, int errle
 
  uxst_close_return:
        close(fd);
+ uxst_return:
        if (msg && errlen) {
                const char *path = ((struct sockaddr_un *)&listener->rx.addr)->sun_path;
                snprintf(errmsg, errlen, "%s [%s]", msg, path);