diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-04-14 07:08:38 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-04-14 07:08:38 -0700 |
commit | b25b55d0d935a9b995e3596ec06ab6378ff931e8 (patch) | |
tree | 3004f763b5133d1c445e8a3b9466346378d91d27 | |
parent | 9a03b24eb2cc94a2e95f6a50db60ea6ed3004130 (diff) | |
download | txr-b25b55d0d935a9b995e3596ec06ab6378ff931e8.tar.gz txr-b25b55d0d935a9b995e3596ec06ab6378ff931e8.tar.bz2 txr-b25b55d0d935a9b995e3596ec06ab6378ff931e8.zip |
Consolidate repeated address unpacking code.
* socket.c (sockaddr_unpack): New static function.
(sock_accept): Use sockaddr_unpack instead of two
copies of if/else code.
-rw-r--r-- | socket.c | 30 |
1 files changed, 16 insertions, 14 deletions
@@ -140,6 +140,20 @@ static val sockaddr_un_unpack(struct sockaddr_un *src) return out; } +static val sockaddr_unpack(int family, struct sockaddr_storage *src) +{ + switch (family) { + case AF_INET: + return sockaddr_in_unpack(coerce(struct sockaddr_in *, src)); + case AF_INET6: + return sockaddr_in6_unpack(coerce(struct sockaddr_in6 *, src)); + case AF_UNIX: + return sockaddr_un_unpack(coerce(struct sockaddr_un *, src)); + default: + return nil; + } +} + #ifdef HAVE_GETADDRINFO static void addrinfo_in(struct addrinfo *dest, val src) @@ -845,13 +859,7 @@ static val sock_accept(val sock, val mode_str, val timeout_in) if (nbytes == -1) goto failed; - if (family == num_fast(AF_INET)) - peer = sockaddr_in_unpack(coerce(struct sockaddr_in *, &sa)); - else if (family == num_fast(AF_INET6)) - peer = sockaddr_in6_unpack(coerce(struct sockaddr_in6 *, &sa)); - else if (family == num_fast(AF_UNIX)) - peer = sockaddr_un_unpack(coerce(struct sockaddr_un *, &sa)); - else { + if (nilp(peer = sockaddr_unpack(c_num(family), &sa))) { free(dgram); uw_throwf(socket_error_s, lit("sock-accept: ~s isn't a supported socket family"), family, nao); @@ -885,13 +893,7 @@ static val sock_accept(val sock, val mode_str, val timeout_in) if (afd < 0) goto failed; - if (family == num_fast(AF_INET)) - peer = sockaddr_in_unpack(coerce(struct sockaddr_in *, &sa)); - else if (family == num_fast(AF_INET6)) - peer = sockaddr_in6_unpack(coerce(struct sockaddr_in6 *, &sa)); - else if (family == num_fast(AF_UNIX)) - peer = sockaddr_un_unpack(coerce(struct sockaddr_un *, &sa)); - else + if (nilp(peer = sockaddr_unpack(c_num(family), &sa))) uw_throwf(socket_error_s, lit("accept: ~s isn't a supported socket family"), family, nao); |