This also simplifies the code and makes it more auditable.
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 */
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;
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 */
* 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",
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 */
" %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,
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;
" %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,
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 */
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;
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;
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;
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",
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;
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;