Commit 8a769e6e authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Convert std.ip() implementation to struct suckaddr

parent 63d66674
......@@ -56,6 +56,7 @@ typedef double VCL_DURATION;
typedef const char * VCL_ENUM;
typedef const char * VCL_HEADER;
typedef long VCL_INT;
//typedef const struct suckaddr * VCL_IP;
typedef const void * VCL_IP;
typedef double VCL_REAL;
typedef const char * VCL_STRING;
......
......@@ -38,6 +38,15 @@ socklen_t VSA_Len(const void *);
unsigned VSA_Port(const void *);
int VSA_Compare(const struct suckaddr *, const struct suckaddr *);
/*
* 's' is a sockaddr of some kind, 'sal' is its length
*/
struct suckaddr *VSA_Malloc(const void *s, unsigned sal);
/*
* 'd' SHALL point to vsa_suckaddr_len aligned bytes of storage,
* 's' is a sockaddr of some kind, 'sal' is its length.
*/
struct suckaddr *VSA_Build(void *d, const void *s, unsigned sal);
#endif
......@@ -209,6 +209,7 @@ VSA_Malloc(const void *s, unsigned sal)
const struct sockaddr *sa = s;
unsigned l = 0;
AN(s);
switch(sa->sa_family) {
case PF_INET:
if (sal == sizeof sua->sa4)
......@@ -229,6 +230,33 @@ VSA_Malloc(const void *s, unsigned sal)
return (sua);
}
/* 'd' SHALL point to vsa_suckaddr_len aligned bytes of storage */
struct suckaddr *
VSA_Build(void *d, const void *s, unsigned sal)
{
struct suckaddr *sua = d;
const struct sockaddr *sa = s;
unsigned l = 0;
AN(d);
AN(s);
switch(sa->sa_family) {
case PF_INET:
if (sal == sizeof sua->sa4)
l = sal;
break;
case PF_INET6:
if (sal == sizeof sua->sa6)
l = sal;
break;
default:
break;
}
if (l != 0)
memcpy(&sua->sa, s, l);
return (sua);
}
int
VSA_Sane(const void *s)
{
......
......@@ -127,9 +127,10 @@ VCL_IP
vmod_ip(const struct vrt_ctx *ctx, VCL_STRING s, VCL_IP d)
{
struct addrinfo hints, *res0 = NULL;
const struct addrinfo *res;
const struct addrinfo *res, *best = NULL;
int error;
char *p;
void *p;
struct suckaddr *r;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
AN(d);
......@@ -144,17 +145,21 @@ vmod_ip(const struct vrt_ctx *ctx, VCL_STRING s, VCL_IP d)
for (res = res0; res != NULL; res = res->ai_next) {
if (VSA_Sane(res->ai_addr) &&
res->ai_addrlen >= VSA_Len(res->ai_addr)) {
d = res->ai_addr;
best = res;
break;
}
}
}
}
AN(d);
p = WS_Alloc(ctx->ws, VSA_Len(d));
p = WS_Alloc(ctx->ws, vsa_suckaddr_len);
AN(p);
memcpy(p, d, VSA_Len(d));
if (best != NULL)
r = VSA_Build(p, best->ai_addr, best->ai_addrlen);
else {
r = p;
memcpy(r, d, vsa_suckaddr_len);
}
if (res0 != NULL)
freeaddrinfo(res0);
return (p);
return (r);
}
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