changeset 4516:a519e4e62efd draft

sa: Add sa_len() to calculate sockaddr length for non BSD
author Roy Marples <roy@marples.name>
date Sun, 05 May 2019 12:45:29 +0100
parents 768ba28719eb
children ae3b0ea6c309
files src/sa.c src/sa.h
diffstat 2 files changed, 29 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/sa.c	Sat May 04 19:38:44 2019 +0100
+++ b/src/sa.c	Sun May 05 12:45:29 2019 +0100
@@ -93,6 +93,30 @@
 	}
 }
 
+#ifndef HAVE_SA_LEN
+static int
+sa_len(const struct sockaddr *sa)
+{
+
+	switch (sa->sa_family) {
+#ifdef AF_LINK
+	case AF_LINK:
+		return sizeof(struct sockaddr_dl);
+#endif
+#ifdef AF_PACKET
+	case AF_PACKET:
+		return sizeof(struct sockaddr_ll);
+#endif
+	case AF_INET:
+		return sizeof(struct sockaddr_in);
+	case AF_INET6:
+		return sizeof(struct sockaddr_in6);
+	default:
+		return sizeof(struct sockaddr);
+	}
+}
+#endif
+
 bool
 sa_is_unspecified(const struct sockaddr *sa)
 {
--- a/src/sa.h	Sat May 04 19:38:44 2019 +0100
+++ b/src/sa.h	Sun May 05 12:45:29 2019 +0100
@@ -55,6 +55,11 @@
 
 socklen_t sa_addroffset(const struct sockaddr *sa);
 socklen_t sa_addrlen(const struct sockaddr *sa);
+#ifdef HAVE_SA_LEN
+#define	sa_len(sa)	((sa)->sa_len)
+#else
+socklen_t sa_len(const struct sockaddr *sa);
+#endif
 bool sa_is_unspecified(const struct sockaddr *);
 bool sa_is_allones(const struct sockaddr *);
 bool sa_is_loopback(const struct sockaddr *);