[master] 8a769e6 Convert std.ip() implementation to struct suckaddr
Poul-Henning Kamp
phk at varnish-cache.org
Sun Oct 27 22:58:57 CET 2013
commit 8a769e6eff70e463eeaac8392beeee8144f2032e
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Sun Oct 27 21:58:43 2013 +0000
Convert std.ip() implementation to struct suckaddr
diff --git a/include/vrt.h b/include/vrt.h
index 0d52fc6..cebe8e5 100644
--- a/include/vrt.h
+++ b/include/vrt.h
@@ -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;
diff --git a/include/vsa.h b/include/vsa.h
index 1e430d6..9bad737 100644
--- a/include/vsa.h
+++ b/include/vsa.h
@@ -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
diff --git a/lib/libvarnish/vsa.c b/lib/libvarnish/vsa.c
index 8bdc73f..4dd32b6 100644
--- a/lib/libvarnish/vsa.c
+++ b/lib/libvarnish/vsa.c
@@ -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)
{
diff --git a/lib/libvmod_std/vmod_std_conversions.c b/lib/libvmod_std/vmod_std_conversions.c
index 68af3ad..42325d8 100644
--- a/lib/libvmod_std/vmod_std_conversions.c
+++ b/lib/libvmod_std/vmod_std_conversions.c
@@ -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);
}
More information about the varnish-commit
mailing list