mirror of
https://gitlab.xiph.org/xiph/icecast-common.git
synced 2025-02-02 15:07:47 -05:00
Feature: Added support to query address family of a socket
This commit is contained in:
parent
cf6797b68e
commit
88e5e66a2a
45
net/sock.c
45
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 "<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>";
|
||||
}
|
||||
|
15
net/sock.h
15
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user