changeset 4307:adaa774e40e6 draft ia

Add sa_cpy. While here allow NULL in sa_cmp.
author Roy Marples <roy@marples.name>
date Mon, 27 Aug 2018 19:10:18 +0100
parents 3bfea819f902
children
files src/sa.c src/sa.h
diffstat 2 files changed, 35 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/sa.c	Mon Aug 20 11:37:17 2018 +0100
+++ b/src/sa.c	Mon Aug 27 19:10:18 2018 +0100
@@ -371,8 +371,12 @@
 {
 	socklen_t offset, len;
 
-	assert(sa1 != NULL);
-	assert(sa2 != NULL);
+	if (sa == NULL && sa == NULL)
+		return 0;
+	if (sa1 == NULL && sa2 != NULL)
+		return -1;
+	if (sa1 != NULL && sa2 == NULL)
+		return 1;
 
 	/* Treat AF_UNSPEC as the unspecified address. */
 	if ((sa1->sa_family == AF_UNSPEC || sa2->sa_family == AF_UNSPEC) &&
@@ -456,3 +460,31 @@
 	    sizeof(sin6->sin6_addr.s6_addr));
 }
 #endif
+
+void
+sa_cpy(struct sockaddr *src, const struct sockaddr *dst)
+{
+#ifdef HAVE_SA_LEN
+	if (src->sa_len == 0)
+		memset(src, 0, sizeof(*src));
+	else
+		memcpy(src, dst, src->sa_len);
+#else
+	size_t sa_len;
+
+	switch (dst->sa_family) {
+	case AF_INET:
+		sa_len = sizeof(struct sockaddr_in);
+		break;
+	case AF_INET6:
+		sa_len = sizeof(struct sockaddr_in6);
+		break;
+	default:
+		sa_len = 0;
+	}
+	if (sa_len == 0)
+		memset(src, 0, sizeof(*src));
+	else
+		memcpy(src, dst, sa_len);
+#endif
+}
--- a/src/sa.h	Mon Aug 20 11:37:17 2018 +0100
+++ b/src/sa.h	Mon Aug 27 19:10:18 2018 +0100
@@ -64,5 +64,6 @@
 int sa_cmp(const struct sockaddr *, const struct sockaddr *);
 void sa_in_init(struct sockaddr *, const struct in_addr *);
 void sa_in6_init(struct sockaddr *, const struct in6_addr *);
+void sa_cpy(struct sockaddr *, const struct sockaddr *);
 
 #endif