diff options
| author | Greg Hudson <ghudson@mit.edu> | 2014-07-03 12:17:25 -0400 |
|---|---|---|
| committer | Greg Hudson <ghudson@mit.edu> | 2014-07-04 15:14:02 -0400 |
| commit | 1fde9a67030845d3cae0661595f5737a4db8b9dd (patch) | |
| tree | 40a98f75bff979d5c681d21ec45a0ce18a1d3d80 /src/include | |
| parent | dc04419132e73ec5e38f6680055f1e2e627d42d7 (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.h | 20 |
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 */ |
