1
0
Fork 0

Feature: Added support to query address family of a socket

This commit is contained in:
Philipp Schafft 2022-03-05 08:42:49 +00:00
parent cf6797b68e
commit 88e5e66a2a
2 changed files with 60 additions and 0 deletions

View File

@ -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 "<error>"; 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 "<unknown>";
}

View File

@ -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