mirror of
https://gitlab.xiph.org/xiph/icecast-common.git
synced 2024-09-22 04:15:55 -04: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;
|
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_ERROR (sock_t)-1
|
||||||
#define SOCK_TIMEOUT -2
|
#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 */
|
/* sock connect macro */
|
||||||
#define sock_connect(h, p) sock_connect_wto(h, p, 0)
|
#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_listen _mangle(sock_listen)
|
||||||
# define sock_set_send_buffer _mangle(sock_set_send_buffer)
|
# define sock_set_send_buffer _mangle(sock_set_send_buffer)
|
||||||
# define sock_accept _mangle(sock_accept)
|
# 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
|
#endif
|
||||||
|
|
||||||
/* Misc socket functions */
|
/* 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);
|
int sock_listen(sock_t serversock, int backlog);
|
||||||
sock_t sock_accept(sock_t serversock, char *ip, size_t len);
|
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
|
#ifdef _WIN32
|
||||||
int inet_aton(const char *s, struct in_addr *a);
|
int inet_aton(const char *s, struct in_addr *a);
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user