From 88e5e66a2a47aeb5880c228ce6a0e9bccb9cdcba Mon Sep 17 00:00:00 2001 From: Philipp Schafft Date: Sat, 5 Mar 2022 08:42:49 +0000 Subject: [PATCH] Feature: Added support to query address family of a socket --- net/sock.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ net/sock.h | 15 +++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/net/sock.c b/net/sock.c index 1bf20c6..6e8fa8b 100644 --- a/net/sock.c +++ b/net/sock.c @@ -961,3 +961,48 @@ sock_t sock_accept(sock_t serversock, char *ip, size_t len) return ret; } +sock_family_t sock_get_family(sock_t sock) +{ + struct sockaddr addr; + socklen_t len = sizeof(addr); + + if (getsockname(sock, &addr, &len) != 0) + return SOCK_FAMILY__ERROR; + + if (len < sizeof(addr.sa_family)) + return SOCK_FAMILY__ERROR; + + switch (addr.sa_family) { +#ifdef AF_UNSPEC + case AF_UNSPEC: return SOCK_FAMILY_UNSPEC; break; +#endif +#ifdef AF_UNIX + case AF_UNIX: return SOCK_FAMILY_UNIX; break; +#endif +#ifdef AF_INET + case AF_INET: return SOCK_FAMILY_INET4; break; +#endif +#ifdef AF_INET6 + case AF_INET6: return SOCK_FAMILY_INET6; break; +#endif +#ifdef AF_DECnet + case AF_DECnet: return SOCK_FAMILY_DECnet; break; +#endif + } + + return SOCK_FAMILY__ERROR; +} + +const char * sock_family_to_string(sock_family_t family) +{ + switch (family) { + case SOCK_FAMILY__ERROR: return ""; break; + case SOCK_FAMILY_UNSPEC: return "UNSPEC"; break; + case SOCK_FAMILY_UNIX: return "UNIX"; break; + case SOCK_FAMILY_INET4: return "INET4"; break; + case SOCK_FAMILY_INET6: return "INET6"; break; + case SOCK_FAMILY_DECnet: return "DECnet"; break; + } + + return ""; +} diff --git a/net/sock.h b/net/sock.h index e0e3d4f..72648f3 100644 --- a/net/sock.h +++ b/net/sock.h @@ -70,6 +70,15 @@ struct iovec #define SOCK_ERROR (sock_t)-1 #define SOCK_TIMEOUT -2 +typedef enum { + SOCK_FAMILY__ERROR = -1, + SOCK_FAMILY_UNSPEC = 0, + SOCK_FAMILY_UNIX, + SOCK_FAMILY_INET4, + SOCK_FAMILY_INET6, + SOCK_FAMILY_DECnet +} sock_family_t; + /* sock connect macro */ #define sock_connect(h, p) sock_connect_wto(h, p, 0) @@ -102,6 +111,8 @@ struct iovec # define sock_listen _mangle(sock_listen) # define sock_set_send_buffer _mangle(sock_set_send_buffer) # define sock_accept _mangle(sock_accept) +# define sock_get_family _mangle(sock_get_family) +# define sock_family_to_string _mangle(sock_family_to_string) #endif /* Misc socket functions */ @@ -144,6 +155,10 @@ sock_t sock_get_server_socket(int port, const char *sinterface); int sock_listen(sock_t serversock, int backlog); sock_t sock_accept(sock_t serversock, char *ip, size_t len); +/* Socket information */ +sock_family_t sock_get_family(sock_t sock); +const char * sock_family_to_string(sock_family_t family); + #ifdef _WIN32 int inet_aton(const char *s, struct in_addr *a); #endif