Commit 2a1ec4d6 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Switch from struct sockaddr to sockaddr_storage throughout.



git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@5393 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent da1021d6
......@@ -395,8 +395,8 @@ struct sess {
socklen_t sockaddrlen;
socklen_t mysockaddrlen;
struct sockaddr *sockaddr;
struct sockaddr *mysockaddr;
struct sockaddr_storage *sockaddr;
struct sockaddr_storage *mysockaddr;
struct listen_sock *mylsock;
/* formatted ascii client address */
......@@ -468,7 +468,7 @@ struct vbc {
struct vdi_simple *vdis;
int fd;
struct sockaddr *addr;
struct sockaddr_storage *addr;
socklen_t addrlen;
uint8_t recycled;
......
......@@ -167,7 +167,7 @@ VCA_Prep(struct sess *sp)
sp->addr = WS_Dup(sp->ws, addr);
sp->port = WS_Dup(sp->ws, port);
if (params->log_local_addr) {
AZ(getsockname(sp->fd, sp->mysockaddr, &sp->mysockaddrlen));
AZ(getsockname(sp->fd, (void*)sp->mysockaddr, &sp->mysockaddrlen));
TCP_name(sp->mysockaddr, sp->mysockaddrlen,
addr, sizeof addr, port, sizeof port);
VSL(SLT_SessionOpen, sp->fd, "%s %s %s %s",
......
......@@ -129,7 +129,7 @@ VBE_ReleaseConn(struct vbc *vc)
*/
static int
vbe_TryConnect(const struct sess *sp, int pf, const struct sockaddr *sa,
vbe_TryConnect(const struct sess *sp, int pf, const struct sockaddr_storage *sa,
socklen_t salen, const struct vdi_simple *vs)
{
int s, i, tmo;
......@@ -148,10 +148,7 @@ vbe_TryConnect(const struct sess *sp, int pf, const struct sockaddr *sa,
tmo = (int)(tmod * 1000.0);
if (tmo > 0)
i = TCP_connect(s, sa, salen, tmo);
else
i = connect(s, sa, salen);
i = TCP_connect(s, sa, salen, tmo);
if (i != 0) {
AZ(close(s));
......
......@@ -122,9 +122,9 @@ struct backend {
char *ipv6_addr;
char *port;
struct sockaddr *ipv4;
struct sockaddr_storage *ipv4;
socklen_t ipv4len;
struct sockaddr *ipv6;
struct sockaddr_storage *ipv6;
socklen_t ipv6len;
unsigned n_conn;
......
......@@ -151,11 +151,12 @@ VBE_DropRefConn(struct backend *b)
*/
static void
copy_sockaddr(struct sockaddr **sa, socklen_t *len, const unsigned char *src)
copy_sockaddr(struct sockaddr_storage **sa, socklen_t *len,
const unsigned char *src)
{
assert(*src > 0);
*sa = malloc(*src);
*sa = malloc(*src); /* XXX: malloc(sizeof **sa) ? */
XXXAN(*sa);
memcpy(*sa, src + 1, *src);
*len = *src;
......
......@@ -109,7 +109,7 @@ static struct lock vbp_mtx;
*/
static int
vbp_connect(int pf, const struct sockaddr *sa, socklen_t salen, int tmo)
vbp_connect(int pf, const struct sockaddr_storage *sa, socklen_t salen, int tmo)
{
int s, i;
......
......@@ -128,17 +128,17 @@ vdi_dns_comp_addrinfo6(const struct backend *bp,
/* Check if a backends socket is the same as addr */
static int
vdi_dns_comp_addrinfo(const struct director *dir,
struct sockaddr *addr,
struct sockaddr_storage *addr,
const socklen_t len)
{
struct backend *bp;
bp = vdi_get_backend_if_simple(dir);
AN(bp);
if (addr->sa_family == PF_INET && bp->ipv4) {
if (addr->ss_family == PF_INET && bp->ipv4) {
return (vdi_dns_comp_addrinfo4(bp, (struct sockaddr_in *)
addr, len));
} else if (addr->sa_family == PF_INET6 && bp->ipv6) {
} else if (addr->ss_family == PF_INET6 && bp->ipv6) {
return (vdi_dns_comp_addrinfo6(bp, (struct sockaddr_in6 *)
addr, len));
}
......@@ -298,8 +298,10 @@ vdi_dns_cache_add(const struct sess *sp,
continue;
for (i = 0; i < vs->nhosts; i++) {
struct sockaddr_storage ss_hack;
memcpy(&ss_hack, res->ai_addr, res->ai_addrlen);
if (vdi_dns_comp_addrinfo(vs->hosts[i],
res->ai_addr, res->ai_addrlen)) {
&ss_hack, res->ai_addrlen)) {
new->hosts[host] = vs->hosts[i];
CHECK_OBJ_NOTNULL(new->hosts[host],
DIRECTOR_MAGIC);
......
......@@ -169,7 +169,7 @@ ses_setup(struct sessmem *sm)
sp->sockaddrlen = sizeof(sm->sockaddr[0]);
sp->mysockaddr = (void*)(&sm->sockaddr[1]);
sp->mysockaddrlen = sizeof(sm->sockaddr[1]);
sp->sockaddr->sa_family = sp->mysockaddr->sa_family = PF_UNSPEC;
sp->sockaddr->ss_family = sp->mysockaddr->ss_family = PF_UNSPEC;
sp->t_open = NAN;
sp->t_req = NAN;
sp->t_resp = NAN;
......
......@@ -291,7 +291,7 @@ VRT_r_beresp_backend_name(const struct sess *sp)
return(sp->vbc->backend->vcl_name);
}
struct sockaddr *
struct sockaddr_storage *
VRT_r_beresp_backend_ip(const struct sess *sp)
{
......@@ -480,20 +480,20 @@ REQ_BOOL(hash_always_miss)
/*--------------------------------------------------------------------*/
struct sockaddr *
struct sockaddr_storage *
VRT_r_client_ip(const struct sess *sp)
{
return (sp->sockaddr);
}
struct sockaddr *
struct sockaddr_storage *
VRT_r_server_ip(struct sess *sp)
{
int i;
if (sp->mysockaddr->sa_family == AF_UNSPEC) {
i = getsockname(sp->fd, sp->mysockaddr, &sp->mysockaddrlen);
if (sp->mysockaddr->ss_family == AF_UNSPEC) {
i = getsockname(sp->fd, (void*)sp->mysockaddr, &sp->mysockaddrlen);
assert(TCP_Check(i));
}
......@@ -531,8 +531,8 @@ int
VRT_r_server_port(struct sess *sp)
{
if (sp->mysockaddr->sa_family == AF_UNSPEC)
AZ(getsockname(sp->fd, sp->mysockaddr, &sp->mysockaddrlen));
if (sp->mysockaddr->ss_family == AF_UNSPEC)
AZ(getsockname(sp->fd, (void*)sp->mysockaddr, &sp->mysockaddrlen));
return (TCP_port(sp->mysockaddr));
}
......
......@@ -76,10 +76,10 @@ int TCP_blocking(int sock);
int TCP_nonblocking(int sock);
int TCP_linger(int sock, int linger);
#ifdef SOL_SOCKET
int TCP_port(const struct sockaddr *addr);
void TCP_name(const struct sockaddr *addr, unsigned l, char *abuf,
int TCP_port(const struct sockaddr_storage *addr);
void TCP_name(const struct sockaddr_storage *addr, unsigned l, char *abuf,
unsigned alen, char *pbuf, unsigned plen);
int TCP_connect(int s, const struct sockaddr *name, socklen_t namelen,
int TCP_connect(int s, const struct sockaddr_storage *name, socklen_t namelen,
int msec);
void TCP_close(int *s);
void TCP_set_read_timeout(int s, double seconds);
......
......@@ -64,14 +64,14 @@ SVNID("$Id$")
/*--------------------------------------------------------------------*/
int
TCP_port(const struct sockaddr *addr)
TCP_port(const struct sockaddr_storage *addr)
{
if (addr->sa_family == AF_INET) {
if (addr->ss_family == AF_INET) {
const struct sockaddr_in *ain = (const void *)addr;
return ntohs((ain->sin_port));
}
if (addr->sa_family == AF_INET6) {
if (addr->ss_family == AF_INET6) {
const struct sockaddr_in6 *ain = (const void *)addr;
return ntohs((ain->sin6_port));
}
......@@ -82,12 +82,12 @@ TCP_port(const struct sockaddr *addr)
/*--------------------------------------------------------------------*/
void
TCP_name(const struct sockaddr *addr, unsigned l, char *abuf, unsigned alen,
char *pbuf, unsigned plen)
TCP_name(const struct sockaddr_storage *addr, unsigned l,
char *abuf, unsigned alen, char *pbuf, unsigned plen)
{
int i;
i = getnameinfo(addr, l, abuf, alen, pbuf, plen,
i = getnameinfo((const void *)addr, l, abuf, alen, pbuf, plen,
NI_NUMERICHOST | NI_NUMERICSERV);
if (i) {
/*
......@@ -113,12 +113,11 @@ void
TCP_myname(int sock, char *abuf, unsigned alen, char *pbuf, unsigned plen)
{
struct sockaddr_storage addr_s;
struct sockaddr *addr = (void*)&addr_s;
socklen_t l;
l = sizeof addr_s;
AZ(getsockname(sock, addr, &l));
TCP_name(addr, l, abuf, alen, pbuf, plen);
AZ(getsockname(sock, (void *)&addr_s, &l));
TCP_name(&addr_s, l, abuf, alen, pbuf, plen);
}
/*--------------------------------------------------------------------*/
......@@ -126,12 +125,11 @@ void
TCP_hisname(int sock, char *abuf, unsigned alen, char *pbuf, unsigned plen)
{
struct sockaddr_storage addr_s;
struct sockaddr *addr = (void*)&addr_s;
socklen_t l;
l = sizeof addr_s;
if (!getpeername(sock, addr, &l))
TCP_name(addr, l, abuf, alen, pbuf, plen);
if (!getpeername(sock, (void*)&addr_s, &l))
TCP_name(&addr_s, l, abuf, alen, pbuf, plen);
else {
strlcpy(abuf, "<none>", alen);
strlcpy(pbuf, "<none>", plen);
......@@ -209,7 +207,7 @@ TCP_nonblocking(int sock)
*/
int
TCP_connect(int s, const struct sockaddr *name, socklen_t namelen, int msec)
TCP_connect(int s, const struct sockaddr_storage *name, socklen_t namelen, int msec)
{
int i, k;
socklen_t l;
......@@ -218,13 +216,15 @@ TCP_connect(int s, const struct sockaddr *name, socklen_t namelen, int msec)
assert(s >= 0);
/* Set the socket non-blocking */
(void)TCP_nonblocking(s);
if (msec > 0)
(void)TCP_nonblocking(s);
/* Attempt the connect */
i = connect(s, name, namelen);
i = connect(s, (const void *)name, namelen);
if (i == 0 || errno != EINPROGRESS)
return (i);
assert(msec > 0);
/* Exercise our patience, polling for write */
fds[0].fd = s;
fds[0].events = POLLWRNORM;
......
......@@ -405,7 +405,7 @@ sp_variables = (
# VCL to C type conversion
vcltypes = {
'IP': "struct sockaddr *",
'IP': "struct sockaddr_storage *",
'STRING': "const char *",
'BOOL': "unsigned",
'BACKEND': "struct director *",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment