[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