Commit 6662b1bb authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Pull the switch and give VCL_IP a proper type.

parent c73544e4
...@@ -56,8 +56,7 @@ typedef double VCL_DURATION; ...@@ -56,8 +56,7 @@ typedef double VCL_DURATION;
typedef const char * VCL_ENUM; typedef const char * VCL_ENUM;
typedef const char * VCL_HEADER; typedef const char * VCL_HEADER;
typedef long VCL_INT; typedef long VCL_INT;
//typedef const struct suckaddr * VCL_IP; typedef const struct suckaddr * VCL_IP;
typedef const void * VCL_IP;
typedef double VCL_REAL; typedef double VCL_REAL;
typedef const char * VCL_STRING; typedef const char * VCL_STRING;
typedef double VCL_TIME; typedef double VCL_TIME;
......
...@@ -33,9 +33,9 @@ ...@@ -33,9 +33,9 @@
struct suckaddr; struct suckaddr;
extern const int vsa_suckaddr_len; extern const int vsa_suckaddr_len;
int VSA_Sane(const void *); int VSA_Sane(const struct suckaddr *);
socklen_t VSA_Len(const void *); socklen_t VSA_Len(const struct suckaddr *);
unsigned VSA_Port(const void *); unsigned VSA_Port(const struct suckaddr *);
int VSA_Compare(const struct suckaddr *, const struct suckaddr *); int VSA_Compare(const struct suckaddr *, const struct suckaddr *);
const struct sockaddr *VSA_Get_Sockaddr(const struct suckaddr *, socklen_t *sl); const struct sockaddr *VSA_Get_Sockaddr(const struct suckaddr *, socklen_t *sl);
......
...@@ -252,9 +252,11 @@ VSA_Build(void *d, const void *s, unsigned sal) ...@@ -252,9 +252,11 @@ VSA_Build(void *d, const void *s, unsigned sal)
default: default:
break; break;
} }
if (l != 0) if (l != 0) {
memcpy(&sua->sa, s, l); memcpy(&sua->sa, s, l);
return (sua); return (sua);
}
return (NULL);
} }
const struct sockaddr * const struct sockaddr *
...@@ -276,11 +278,10 @@ VSA_Get_Sockaddr(const struct suckaddr *sua, socklen_t *sl) ...@@ -276,11 +278,10 @@ VSA_Get_Sockaddr(const struct suckaddr *sua, socklen_t *sl)
} }
int int
VSA_Sane(const void *s) VSA_Sane(const struct suckaddr *s)
{ {
const struct sockaddr *sa = s;
switch(sa->sa_family) { switch(s->sa.sa_family) {
case PF_INET: case PF_INET:
case PF_INET6: case PF_INET6:
return (1); return (1);
...@@ -290,17 +291,16 @@ VSA_Sane(const void *s) ...@@ -290,17 +291,16 @@ VSA_Sane(const void *s)
} }
socklen_t socklen_t
VSA_Len(const void *s) VSA_Len(const struct suckaddr *s)
{ {
const struct sockaddr *sa = s;
switch(sa->sa_family) { switch(s->sa.sa_family) {
case PF_INET: case PF_INET:
return (sizeof(struct sockaddr_in)); return (sizeof(s->sa4));
case PF_INET6: case PF_INET6:
return (sizeof(struct sockaddr_in6)); return (sizeof(s->sa6));
default: default:
WRONG("Illegal socket family"); return (0);
} }
} }
...@@ -313,22 +313,15 @@ VSA_Compare(const struct suckaddr *s1, const struct suckaddr *s2) ...@@ -313,22 +313,15 @@ VSA_Compare(const struct suckaddr *s1, const struct suckaddr *s2)
} }
unsigned unsigned
VSA_Port(const void *s) VSA_Port(const struct suckaddr *s)
{ {
const struct sockaddr *sa = s;
switch(sa->sa_family) { switch(s->sa.sa_family) {
case PF_INET: case PF_INET:
{ return (ntohs(s->sa4.sin_port));
const struct sockaddr_in *ain = s;
return (ntohs((ain->sin_port)));
}
case PF_INET6: case PF_INET6:
{ return (ntohs(s->sa6.sin6_port));
const struct sockaddr_in6 *ain = s;
return (ntohs((ain->sin6_port)));
}
default: default:
WRONG("Illegal socket family"); return (0);
} }
} }
...@@ -127,7 +127,7 @@ VCL_IP ...@@ -127,7 +127,7 @@ VCL_IP
vmod_ip(const struct vrt_ctx *ctx, VCL_STRING s, VCL_IP d) vmod_ip(const struct vrt_ctx *ctx, VCL_STRING s, VCL_IP d)
{ {
struct addrinfo hints, *res0 = NULL; struct addrinfo hints, *res0 = NULL;
const struct addrinfo *res, *best = NULL; const struct addrinfo *res;
int error; int error;
void *p; void *p;
struct suckaddr *r; struct suckaddr *r;
...@@ -136,6 +136,10 @@ vmod_ip(const struct vrt_ctx *ctx, VCL_STRING s, VCL_IP d) ...@@ -136,6 +136,10 @@ vmod_ip(const struct vrt_ctx *ctx, VCL_STRING s, VCL_IP d)
AN(d); AN(d);
assert(VSA_Sane(d)); assert(VSA_Sane(d));
p = WS_Alloc(ctx->ws, vsa_suckaddr_len);
AN(p);
r = NULL;
if (s != NULL) { if (s != NULL) {
memset(&hints, 0, sizeof(hints)); memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC; hints.ai_family = PF_UNSPEC;
...@@ -143,19 +147,13 @@ vmod_ip(const struct vrt_ctx *ctx, VCL_STRING s, VCL_IP d) ...@@ -143,19 +147,13 @@ vmod_ip(const struct vrt_ctx *ctx, VCL_STRING s, VCL_IP d)
error = getaddrinfo(s, "80", &hints, &res0); error = getaddrinfo(s, "80", &hints, &res0);
if (!error) { if (!error) {
for (res = res0; res != NULL; res = res->ai_next) { for (res = res0; res != NULL; res = res->ai_next) {
if (VSA_Sane(res->ai_addr) && r = VSA_Build(p, res->ai_addr, res->ai_addrlen);
res->ai_addrlen >= VSA_Len(res->ai_addr)) { if (r != NULL)
best = res;
break; break;
}
} }
} }
} }
p = WS_Alloc(ctx->ws, vsa_suckaddr_len); if (r == NULL) {
AN(p);
if (best != NULL)
r = VSA_Build(p, best->ai_addr, best->ai_addrlen);
else {
r = p; r = p;
memcpy(r, d, vsa_suckaddr_len); memcpy(r, d, vsa_suckaddr_len);
} }
......
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