]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[MINOR] make use of set_host_port() and get_host_port() to get rid of family mismatches
authorWilly Tarreau <w@1wt.eu>
Sat, 27 Aug 2011 10:29:07 +0000 (12:29 +0200)
committerWilly Tarreau <w@1wt.eu>
Sun, 4 Sep 2011 22:54:35 +0000 (00:54 +0200)
This also simplifies the code and makes it more auditable.

src/cfgparse.c
src/checks.c
src/log.c
src/proto_http.c
src/proto_tcp.c
src/proxy.c
src/standard.c

index 1e3a92cf1316899bf7bdc171c3eec0c13130433f..48d2617144638796c0f66e0b39d5f98afb8f1ae6 100644 (file)
@@ -1230,15 +1230,7 @@ int cfg_parse_peers(const char *file, int linenum, char **args, int kwm)
                        goto out;
                }
                newpeer->addr = *sk;
-
-               switch (newpeer->addr.ss_family) {
-               case AF_INET:
-                       ((struct sockaddr_in *)&newpeer->addr)->sin_port = htons(realport);
-                       break;
-               case AF_INET6:
-                       ((struct sockaddr_in6 *)&newpeer->addr)->sin6_port = htons(realport);
-                       break;
-               }
+               set_host_port(&newpeer->addr, realport);
 
                if (strcmp(newpeer->id, localpeer) == 0) {
                        /* Current is local peer, it define a frontend */
@@ -3935,15 +3927,7 @@ stats_error_parsing:
                                goto out;
                        }
                        newsrv->addr = *sk;
-
-                       switch (newsrv->addr.ss_family) {
-                       case AF_INET:
-                               ((struct sockaddr_in *)&newsrv->addr)->sin_port = htons(realport);
-                               break;
-                       case AF_INET6:
-                               ((struct sockaddr_in6 *)&newsrv->addr)->sin6_port = htons(realport);
-                               break;
-                       }
+                       set_host_port(&newsrv->addr, realport);
 
                        newsrv->check_port      = curproxy->defsrv.check_port;
                        newsrv->inter           = curproxy->defsrv.inter;
@@ -4446,16 +4430,9 @@ stats_error_parsing:
                                goto out;
                        }
 
-                       switch (newsrv->check_addr.ss_family) {
-                               case AF_INET:
-                                       if (!newsrv->check_port && ((struct sockaddr_in *)&newsrv->check_addr)->sin_port)
-                                               newsrv->check_port = ntohs(((struct sockaddr_in *)&newsrv->check_addr)->sin_port);
-                                       break;
-                               case AF_INET6:
-                                       if (!newsrv->check_port && ((struct sockaddr_in6 *)&newsrv->check_addr)->sin6_port)
-                                               newsrv->check_port = ntohs(((struct sockaddr_in6 *)&newsrv->check_addr)->sin6_port);
-                                       break;
-                       }
+                       /* try to get the port from check_addr if check_port not set */
+                       if (!newsrv->check_port)
+                               newsrv->check_port = get_host_port(&newsrv->check_addr);
 
                        if (!newsrv->check_port && !(newsrv->state & SRV_MAPPORTS))
                                newsrv->check_port = realport; /* by default */
@@ -4464,15 +4441,9 @@ stats_error_parsing:
                                 * the server either. We'll check if we have
                                 * a known port on the first listener.
                                 */
-                               struct listener *l;
-                               l = curproxy->listen;
-                               if (l) {
-                                       int port;
-                                       port = (l->addr.ss_family == AF_INET6)
-                                               ? ntohs(((struct sockaddr_in6 *)(&l->addr))->sin6_port)
-                                               : ntohs(((struct sockaddr_in *)(&l->addr))->sin_port);
-                                       newsrv->check_port = port;
-                               }
+                               struct listener *l = curproxy->listen;
+                               while (l && !(newsrv->check_port = get_host_port(&l->addr)))
+                                       l = l->next;
                        }
                        if (!newsrv->check_port) {
                                Alert("parsing [%s:%d] : server %s has neither service port nor check port. Check has been disabled.\n",
index b98c49b85727a6520272f1fc94bed1e925ef9e7c..6a102dfd4cdb39803748eeca83634fe62f8807a2 100644 (file)
@@ -1329,15 +1329,7 @@ struct task *process_chk(struct task *t)
                                                                break;
 
                                                        fdinfo[fd].port_range = s->sport_range;
-
-                                                       switch (src.ss_family) {
-                                                       case AF_INET:
-                                                               ((struct sockaddr_in *)&src)->sin_port = htons(fdinfo[fd].local_port);
-                                                               break;
-                                                       case AF_INET6:
-                                                               ((struct sockaddr_in6 *)&src)->sin6_port = htons(fdinfo[fd].local_port);
-                                                               break;
-                                                       }
+                                                       set_host_port(&src, fdinfo[fd].local_port);
 
                                                        ret = tcp_bind_socket(fd, flags, &src, remote);
                                                } while (ret != 0); /* binding NOK */
index 02b6b20eb924ed84d009073a4b8afaef5be707e5..16ace2fe45267409c7471e7ff93a119ff0cfe6cb 100644 (file)
--- a/src/log.c
+++ b/src/log.c
@@ -356,9 +356,7 @@ void tcp_sess_log(struct session *s)
                 " %s %s/%s %ld/%ld/%s%ld %s%lld"
                 " %c%c %d/%d/%d/%d/%s%u %ld/%ld\n",
                 s->si[0].addr.c.from.ss_family == AF_UNIX ? "unix" : pn,
-                s->si[0].addr.c.from.ss_family == AF_UNIX ? s->listener->luid : (ntohs((s->si[0].addr.c.from.ss_family == AF_INET) ?
-                                                           ((struct sockaddr_in *)&s->si[0].addr.c.from)->sin_port :
-                                                           ((struct sockaddr_in6 *)&s->si[0].addr.c.from)->sin6_port)),
+                s->si[0].addr.c.from.ss_family == AF_UNIX ? s->listener->luid : get_host_port(&s->si[0].addr.c.from),
                 tm.tm_mday, monthname[tm.tm_mon], tm.tm_year+1900,
                 tm.tm_hour, tm.tm_min, tm.tm_sec, (int)s->logs.tv_accept.tv_usec/1000,
                 fe->id, be->id, svid,
index acf2ea3adee7adca4f9ce2216f6e9a5ea2e868ff..32f9f263581cf3cbed9d2976a9ba2c526c10caa8 100644 (file)
@@ -915,9 +915,7 @@ void http_sess_clflog(struct session *s)
        w = snprintf(h, sizeof(tmpline) - (h - tmpline),
                     " %d %03d",
                     s->req->prod->addr.c.from.ss_family == AF_UNIX ? s->listener->luid :
-                        ntohs((s->req->prod->addr.c.from.ss_family == AF_INET) ?
-                              ((struct sockaddr_in *)&s->req->prod->addr.c.from)->sin_port :
-                              ((struct sockaddr_in6 *)&s->req->prod->addr.c.from)->sin6_port),
+                        get_host_port(&s->req->prod->addr.c.from),
                     (int)s->logs.accept_date.tv_usec/1000);
        if (w < 0 || w >= sizeof(tmpline) - (h - tmpline))
                goto trunc;
@@ -1192,9 +1190,7 @@ void http_sess_log(struct session *s)
                 " %s %s %c%c%c%c %d/%d/%d/%d/%s%u %ld/%ld%s\n",
                 (s->req->prod->addr.c.from.ss_family == AF_UNIX) ? "unix" : pn,
                 (s->req->prod->addr.c.from.ss_family == AF_UNIX) ? s->listener->luid :
-                    ntohs((s->req->prod->addr.c.from.ss_family == AF_INET) ?
-                          ((struct sockaddr_in *)&s->req->prod->addr.c.from)->sin_port :
-                          ((struct sockaddr_in6 *)&s->req->prod->addr.c.from)->sin6_port),
+                    get_host_port(&s->req->prod->addr.c.from),
                 tm.tm_mday, monthname[tm.tm_mon], tm.tm_year+1900,
                 tm.tm_hour, tm.tm_min, tm.tm_sec, (int)s->logs.accept_date.tv_usec/1000,
                 fe->id, be->id, svid,
index 3b6d39d3868c2d5fbfc89322ebd110297be58bf3..8a04f16aa4727bc58a348b796fc7e4273258514d 100644 (file)
@@ -316,14 +316,7 @@ int tcp_connect_server(struct stream_interface *si)
                                        break;
 
                                fdinfo[fd].port_range = srv->sport_range;
-                               switch (src.ss_family) {
-                               case AF_INET:
-                                       ((struct sockaddr_in *)&src)->sin_port = htons(fdinfo[fd].local_port);
-                                       break;
-                               case AF_INET6:
-                                       ((struct sockaddr_in6 *)&src)->sin6_port = htons(fdinfo[fd].local_port);
-                                       break;
-                               }
+                               set_host_port(&src, fdinfo[fd].local_port);
 
                                ret = tcp_bind_socket(fd, flags, &src, &si->addr.s.from);
                        } while (ret != 0); /* binding NOK */
@@ -1305,11 +1298,7 @@ static int
 acl_fetch_sport(struct proxy *px, struct session *l4, void *l7, int dir,
                 struct acl_expr *expr, struct acl_test *test)
 {
-       if (l4->si[0].addr.c.from.ss_family == AF_INET)
-               test->i = ntohs(((struct sockaddr_in *)&l4->si[0].addr.c.from)->sin_port);
-       else if (l4->si[0].addr.c.from.ss_family == AF_INET6)
-               test->i = ntohs(((struct sockaddr_in6 *)(&l4->si[0].addr.c.from))->sin6_port);
-       else
+       if (!(test->i = get_host_port(&l4->si[0].addr.c.from)))
                return 0;
 
        test->flags = 0;
@@ -1376,11 +1365,7 @@ acl_fetch_dport(struct proxy *px, struct session *l4, void *l7, int dir,
        if (!(l4->flags & SN_FRT_ADDR_SET))
                get_frt_addr(l4);
 
-       if (l4->si[0].addr.c.to.ss_family == AF_INET)
-               test->i = ntohs(((struct sockaddr_in *)&l4->si[0].addr.c.to)->sin_port);
-       else if (l4->si[0].addr.c.to.ss_family == AF_INET6)
-               test->i = ntohs(((struct sockaddr_in6 *)(&l4->si[0].addr.c.to))->sin6_port);
-       else
+       if (!(test->i = get_host_port(&l4->si[0].addr.c.to)))
                return 0;
 
        test->flags = 0;
@@ -1394,11 +1379,7 @@ pattern_fetch_dport(struct proxy *px, struct session *l4, void *l7, int dir,
        if (!(l4->flags & SN_FRT_ADDR_SET))
                get_frt_addr(l4);
 
-       if (l4->si[0].addr.c.to.ss_family == AF_INET)
-               data->integer = ntohs(((struct sockaddr_in *)&l4->si[0].addr.c.to)->sin_port);
-       else if (l4->si[0].addr.c.to.ss_family == AF_INET6)
-               data->integer = ntohs(((struct sockaddr_in6 *)&l4->si[0].addr.c.to)->sin6_port);
-       else
+       if (!(data->integer = get_host_port(&l4->si[0].addr.c.to)))
                return 0;
 
        return 1;
index 6df460e59066b7b37249091725b6ec5251cdcd3c..9409d55430e034e3c4d79471243cfc0b20922202 100644 (file)
@@ -733,15 +733,8 @@ void resume_proxies(void)
                                if (!resume_listener(l)) {
                                        int port;
 
-                                       if (l->addr.ss_family == AF_INET6) {
-                                               port = ntohs(((struct sockaddr_in6 *)(&l->addr))->sin6_port);
-                                               Warning("Port %d busy while trying to enable %s %s.\n",
-                                                       port, proxy_cap_str(p->cap), p->id);
-                                               send_log(p, LOG_WARNING, "Port %d busy while trying to enable %s %s.\n",
-                                                        port, proxy_cap_str(p->cap), p->id);
-                                       }
-                                       else if (l->addr.ss_family == AF_INET) {
-                                               port = ntohs(((struct sockaddr_in *)(&l->addr))->sin_port);
+                                       port = get_host_port(&l->addr);
+                                       if (port) {
                                                Warning("Port %d busy while trying to enable %s %s.\n",
                                                        port, proxy_cap_str(p->cap), p->id);
                                                send_log(p, LOG_WARNING, "Port %d busy while trying to enable %s %s.\n",
index 5c27bdbed6cfe28e59a3846a0ed3474418973961..e3717172528718a8e332ff89bab97dddfb39e363 100644 (file)
@@ -327,14 +327,7 @@ struct sockaddr_storage *str2sa(const char *str)
        if (!ret)
                goto out;
 
-       switch (ret->ss_family) {
-       case AF_INET:
-               ((struct sockaddr_in *)ret)->sin_port = htons(port);
-               break;
-       case AF_INET6:
-               ((struct sockaddr_in6 *)ret)->sin6_port = htons(port);
-               break;
-       }
+       set_host_port(ret, port);
  out:
        free(str2);
        return ret;
@@ -383,14 +376,7 @@ struct sockaddr_storage *str2sa_range(const char *str, int *low, int *high)
        if (!ret)
                goto out;
 
-       switch (ret->ss_family) {
-       case AF_INET:
-               ((struct sockaddr_in *)ret)->sin_port = htons(portl);
-               break;
-       case AF_INET6:
-               ((struct sockaddr_in6 *)ret)->sin6_port = htons(portl);
-               break;
-       }
+       set_host_port(ret, portl);
 
        *low = portl;
        *high = porth;