summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
authorGreg Hudson <ghudson@mit.edu>2014-07-03 12:17:25 -0400
committerGreg Hudson <ghudson@mit.edu>2014-07-04 15:14:02 -0400
commit1fde9a67030845d3cae0661595f5737a4db8b9dd (patch)
tree40a98f75bff979d5c681d21ec45a0ce18a1d3d80 /src/include
parentdc04419132e73ec5e38f6680055f1e2e627d42d7 (diff)
Don't depend on sa_len sockaddr field
In socket-utils.h, replace the socklen macro with an inline function sa_socklen which always uses the address family, even on platforms with the sa_len sockaddr field. This removes the need to set sa_len in socket addresses we construct.
Diffstat (limited to 'src/include')
-rw-r--r--src/include/socket-utils.h20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/include/socket-utils.h b/src/include/socket-utils.h
index e3fa4293b..156663683 100644
--- a/src/include/socket-utils.h
+++ b/src/include/socket-utils.h
@@ -119,13 +119,17 @@ sa_is_inet(struct sockaddr *sa)
return sa->sa_family == AF_INET || sa->sa_family == AF_INET6;
}
-#if !defined (socklen)
-/* socklen_t socklen (struct sockaddr *) */
-# ifdef HAVE_SA_LEN
-# define socklen(X) ((X)->sa_len)
-# else
-# define socklen(X) ((X)->sa_family == AF_INET6 ? (socklen_t) sizeof (struct sockaddr_in6) : (X)->sa_family == AF_INET ? (socklen_t) sizeof (struct sockaddr_in) : (socklen_t) sizeof (struct sockaddr))
-# endif
-#endif
+/* Return the length of an IPv4 or IPv6 socket structure; abort if it is
+ * neither. */
+static inline socklen_t
+sa_socklen(struct sockaddr *sa)
+{
+ if (sa->sa_family == AF_INET6)
+ return sizeof(struct sockaddr_in6);
+ else if (sa->sa_family == AF_INET)
+ return sizeof(struct sockaddr_in);
+ else
+ abort();
+}
#endif /* SOCKET_UTILS_H */