[MINOR] make use of set_host_port() and get_host_port() to get rid of family mismatches

This also simplifies the code and makes it more auditable.
This commit is contained in:
Willy Tarreau 2011-08-27 12:29:07 +02:00
parent 542a31d6c3
commit 86ad42c5b7
7 changed files with 20 additions and 103 deletions

View File

@ -1230,15 +1230,7 @@ int cfg_parse_peers(const char *file, int linenum, char **args, int kwm)
goto out; goto out;
} }
newpeer->addr = *sk; newpeer->addr = *sk;
set_host_port(&newpeer->addr, realport);
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;
}
if (strcmp(newpeer->id, localpeer) == 0) { if (strcmp(newpeer->id, localpeer) == 0) {
/* Current is local peer, it define a frontend */ /* Current is local peer, it define a frontend */
@ -3935,15 +3927,7 @@ stats_error_parsing:
goto out; goto out;
} }
newsrv->addr = *sk; newsrv->addr = *sk;
set_host_port(&newsrv->addr, realport);
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;
}
newsrv->check_port = curproxy->defsrv.check_port; newsrv->check_port = curproxy->defsrv.check_port;
newsrv->inter = curproxy->defsrv.inter; newsrv->inter = curproxy->defsrv.inter;
@ -4446,16 +4430,9 @@ stats_error_parsing:
goto out; goto out;
} }
switch (newsrv->check_addr.ss_family) { /* try to get the port from check_addr if check_port not set */
case AF_INET: if (!newsrv->check_port)
if (!newsrv->check_port && ((struct sockaddr_in *)&newsrv->check_addr)->sin_port) newsrv->check_port = get_host_port(&newsrv->check_addr);
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;
}
if (!newsrv->check_port && !(newsrv->state & SRV_MAPPORTS)) if (!newsrv->check_port && !(newsrv->state & SRV_MAPPORTS))
newsrv->check_port = realport; /* by default */ newsrv->check_port = realport; /* by default */
@ -4464,15 +4441,9 @@ stats_error_parsing:
* the server either. We'll check if we have * the server either. We'll check if we have
* a known port on the first listener. * a known port on the first listener.
*/ */
struct listener *l; struct listener *l = curproxy->listen;
l = curproxy->listen; while (l && !(newsrv->check_port = get_host_port(&l->addr)))
if (l) { l = l->next;
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;
}
} }
if (!newsrv->check_port) { if (!newsrv->check_port) {
Alert("parsing [%s:%d] : server %s has neither service port nor check port. Check has been disabled.\n", Alert("parsing [%s:%d] : server %s has neither service port nor check port. Check has been disabled.\n",

View File

@ -1329,15 +1329,7 @@ struct task *process_chk(struct task *t)
break; break;
fdinfo[fd].port_range = s->sport_range; fdinfo[fd].port_range = s->sport_range;
set_host_port(&src, fdinfo[fd].local_port);
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;
}
ret = tcp_bind_socket(fd, flags, &src, remote); ret = tcp_bind_socket(fd, flags, &src, remote);
} while (ret != 0); /* binding NOK */ } while (ret != 0); /* binding NOK */

View File

@ -356,9 +356,7 @@ void tcp_sess_log(struct session *s)
" %s %s/%s %ld/%ld/%s%ld %s%lld" " %s %s/%s %ld/%ld/%s%ld %s%lld"
" %c%c %d/%d/%d/%d/%s%u %ld/%ld\n", " %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 ? "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) ? s->si[0].addr.c.from.ss_family == AF_UNIX ? s->listener->luid : get_host_port(&s->si[0].addr.c.from),
((struct sockaddr_in *)&s->si[0].addr.c.from)->sin_port :
((struct sockaddr_in6 *)&s->si[0].addr.c.from)->sin6_port)),
tm.tm_mday, monthname[tm.tm_mon], tm.tm_year+1900, 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, tm.tm_hour, tm.tm_min, tm.tm_sec, (int)s->logs.tv_accept.tv_usec/1000,
fe->id, be->id, svid, fe->id, be->id, svid,

View File

@ -915,9 +915,7 @@ void http_sess_clflog(struct session *s)
w = snprintf(h, sizeof(tmpline) - (h - tmpline), w = snprintf(h, sizeof(tmpline) - (h - tmpline),
" %d %03d", " %d %03d",
s->req->prod->addr.c.from.ss_family == AF_UNIX ? s->listener->luid : s->req->prod->addr.c.from.ss_family == AF_UNIX ? s->listener->luid :
ntohs((s->req->prod->addr.c.from.ss_family == AF_INET) ? get_host_port(&s->req->prod->addr.c.from),
((struct sockaddr_in *)&s->req->prod->addr.c.from)->sin_port :
((struct sockaddr_in6 *)&s->req->prod->addr.c.from)->sin6_port),
(int)s->logs.accept_date.tv_usec/1000); (int)s->logs.accept_date.tv_usec/1000);
if (w < 0 || w >= sizeof(tmpline) - (h - tmpline)) if (w < 0 || w >= sizeof(tmpline) - (h - tmpline))
goto trunc; 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 %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) ? "unix" : pn,
(s->req->prod->addr.c.from.ss_family == AF_UNIX) ? s->listener->luid : (s->req->prod->addr.c.from.ss_family == AF_UNIX) ? s->listener->luid :
ntohs((s->req->prod->addr.c.from.ss_family == AF_INET) ? get_host_port(&s->req->prod->addr.c.from),
((struct sockaddr_in *)&s->req->prod->addr.c.from)->sin_port :
((struct sockaddr_in6 *)&s->req->prod->addr.c.from)->sin6_port),
tm.tm_mday, monthname[tm.tm_mon], tm.tm_year+1900, 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, tm.tm_hour, tm.tm_min, tm.tm_sec, (int)s->logs.accept_date.tv_usec/1000,
fe->id, be->id, svid, fe->id, be->id, svid,

View File

@ -316,14 +316,7 @@ int tcp_connect_server(struct stream_interface *si)
break; break;
fdinfo[fd].port_range = srv->sport_range; fdinfo[fd].port_range = srv->sport_range;
switch (src.ss_family) { set_host_port(&src, fdinfo[fd].local_port);
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;
}
ret = tcp_bind_socket(fd, flags, &src, &si->addr.s.from); ret = tcp_bind_socket(fd, flags, &src, &si->addr.s.from);
} while (ret != 0); /* binding NOK */ } while (ret != 0); /* binding NOK */
@ -1305,11 +1298,7 @@ static int
acl_fetch_sport(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_sport(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
{ {
if (l4->si[0].addr.c.from.ss_family == AF_INET) if (!(test->i = get_host_port(&l4->si[0].addr.c.from)))
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
return 0; return 0;
test->flags = 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)) if (!(l4->flags & SN_FRT_ADDR_SET))
get_frt_addr(l4); get_frt_addr(l4);
if (l4->si[0].addr.c.to.ss_family == AF_INET) if (!(test->i = get_host_port(&l4->si[0].addr.c.to)))
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
return 0; return 0;
test->flags = 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)) if (!(l4->flags & SN_FRT_ADDR_SET))
get_frt_addr(l4); get_frt_addr(l4);
if (l4->si[0].addr.c.to.ss_family == AF_INET) if (!(data->integer = get_host_port(&l4->si[0].addr.c.to)))
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
return 0; return 0;
return 1; return 1;

View File

@ -733,15 +733,8 @@ void resume_proxies(void)
if (!resume_listener(l)) { if (!resume_listener(l)) {
int port; int port;
if (l->addr.ss_family == AF_INET6) { port = get_host_port(&l->addr);
port = ntohs(((struct sockaddr_in6 *)(&l->addr))->sin6_port); 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",
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);
Warning("Port %d busy while trying to enable %s %s.\n", Warning("Port %d busy while trying to enable %s %s.\n",
port, proxy_cap_str(p->cap), p->id); port, proxy_cap_str(p->cap), p->id);
send_log(p, LOG_WARNING, "Port %d busy while trying to enable %s %s.\n", send_log(p, LOG_WARNING, "Port %d busy while trying to enable %s %s.\n",

View File

@ -327,14 +327,7 @@ struct sockaddr_storage *str2sa(const char *str)
if (!ret) if (!ret)
goto out; goto out;
switch (ret->ss_family) { set_host_port(ret, port);
case AF_INET:
((struct sockaddr_in *)ret)->sin_port = htons(port);
break;
case AF_INET6:
((struct sockaddr_in6 *)ret)->sin6_port = htons(port);
break;
}
out: out:
free(str2); free(str2);
return ret; return ret;
@ -383,14 +376,7 @@ struct sockaddr_storage *str2sa_range(const char *str, int *low, int *high)
if (!ret) if (!ret)
goto out; goto out;
switch (ret->ss_family) { set_host_port(ret, portl);
case AF_INET:
((struct sockaddr_in *)ret)->sin_port = htons(portl);
break;
case AF_INET6:
((struct sockaddr_in6 *)ret)->sin6_port = htons(portl);
break;
}
*low = portl; *low = portl;
*high = porth; *high = porth;