struct worker *wrk;
- unsigned sockaddrlen;
- struct sockaddr_storage sockaddr[1];
- unsigned mysockaddrlen;
- struct sockaddr_storage mysockaddr[1];
+ socklen_t sockaddrlen;
+ socklen_t mysockaddrlen;
+ struct sockaddr *sockaddr;
+ struct sockaddr *mysockaddr;
/* formatted ascii client address */
char addr[TCP_ADDRBUFSIZE];
VCA_Prep(struct sess *sp)
{
- TCP_name((struct sockaddr *)sp->sockaddr, sp->sockaddrlen,
+ TCP_name(sp->sockaddr, sp->sockaddrlen,
sp->addr, sizeof sp->addr, sp->port, sizeof sp->port);
VSL(SLT_SessionOpen, sp->fd, "%s %s", sp->addr, sp->port);
sp->acct.first = sp->t_open.tv_sec;
struct http http;
unsigned workspace;
TAILQ_ENTRY(sessmem) list;
+ struct sockaddr_storage sockaddr[2];
};
static TAILQ_HEAD(,sessmem) ses_free_mem[2] = {
SES_New(struct sockaddr *addr, unsigned len)
{
struct sessmem *sm;
+ struct sess *sp;
volatile unsigned u;
/*
return (NULL);
CHECK_OBJ_NOTNULL(sm, SESSMEM_MAGIC);
VSL_stats->n_sess++;
- memset(&sm->sess, 0, sizeof sm->sess);
- sm->sess.magic = SESS_MAGIC;
- sm->sess.mem = sm;
- sm->sess.http = &sm->http;
-
- assert(len < sizeof(sm->sess.sockaddr));
+ sp = &sm->sess;
+ memset(sp, 0, sizeof *sp);
+ sp->magic = SESS_MAGIC;
+ sp->mem = sm;
+ sp->http = &sm->http;
+ sp->sockaddr = (void*)(&sm->sockaddr[0]);
+ 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;
+
+ assert(len <= sp->sockaddrlen);
if (addr != NULL) {
- memcpy(sm->sess.sockaddr, addr, len);
- sm->sess.sockaddrlen = len;
+ memcpy(sp->sockaddr, addr, len);
+ sp->sockaddrlen = len;
}
http_Setup(&sm->http, (void *)(sm + 1), sm->workspace);
- return (&sm->sess);
+ return (sp);
}
void
VRT_r_client_ip(struct sess *sp)
{
- return ((struct sockaddr *)sp->sockaddr);
+ return (sp->sockaddr);
}
struct sockaddr *
VRT_r_server_ip(struct sess *sp)
{
- socklen_t l;
- if (sp->mysockaddrlen == 0) {
- l = sizeof sp->mysockaddr;
- AZ(getsockname(sp->fd,
- (struct sockaddr*)sp->mysockaddr, &l));
- sp->mysockaddrlen = l;
- }
+ if (sp->mysockaddr->sa_family == AF_UNSPEC)
+ AZ(getsockname(sp->fd, sp->mysockaddr, &sp->mysockaddrlen));
- return ((struct sockaddr*)sp->mysockaddr);
+ return (sp->mysockaddr);
}
/*--------------------------------------------------------------------*/
for (a1 = ap->priv; a1 != NULL; a1 = a1->ai_next) {
/* only match the right family */
- if (a1->ai_family != sp->sockaddr->ss_family)
+ if (a1->ai_family != sp->sockaddr->sa_family)
continue;
if (a1->ai_family == AF_INET) {
(void)what;
addrlen = sizeof addr;
- i = accept(ev->fd, (struct sockaddr *)&addr, &addrlen);
+ i = accept(ev->fd, (void *)&addr, &addrlen);
if (i < 0)
return (0);
void
TCP_myname(int sock, char *abuf, unsigned alen, char *pbuf, unsigned plen)
{
- struct sockaddr addr[2]; /* XXX: IPv6 hack */
+ struct sockaddr_storage addr_s;
+ struct sockaddr *addr = (void*)&addr_s;
socklen_t l;
l = sizeof addr;