mirror of
https://gitlab.xiph.org/xiph/icecast-common.git
synced 2025-02-02 15:07:47 -05:00
Feature: Allow testing for IPv4-mapped IPv6 mode
This commit is contained in:
parent
88e5e66a2a
commit
08443ca69e
54
net/sock.c
54
net/sock.c
@ -961,6 +961,60 @@ sock_t sock_accept(sock_t serversock, char *ip, size_t len)
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool sock_is_ipv4_mapped_supported(void)
|
||||
{
|
||||
#ifdef AF_INET6
|
||||
struct sockaddr_storage ssock_addr;
|
||||
struct sockaddr_in6 *ssock_addr_in6 = (struct sockaddr_in6 *)&ssock_addr;
|
||||
socklen_t ssock_addr_len = sizeof(ssock_addr);
|
||||
sock_t ssock = SOCK_ERROR;
|
||||
sock_t csock;
|
||||
char ip[MAX_ADDR_LEN+1];
|
||||
|
||||
ssock = sock_get_server_socket(0, "::");
|
||||
|
||||
if (ssock == SOCK_ERROR)
|
||||
return false;
|
||||
|
||||
if (listen(ssock, 1) != 0) {
|
||||
sock_close(ssock);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (getsockname(ssock, (struct sockaddr*)&ssock_addr, &ssock_addr_len) != 0) {
|
||||
sock_close(ssock);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (ssock_addr_len < sizeof(struct sockaddr_in6) || ssock_addr_in6->sin6_family != AF_INET6) {
|
||||
sock_close(ssock);
|
||||
return false;
|
||||
}
|
||||
|
||||
csock = sock_connect("127.0.0.1", ntohs(ssock_addr_in6->sin6_port));
|
||||
if (csock == SOCK_ERROR) {
|
||||
sock_close(ssock);
|
||||
return false;
|
||||
} else {
|
||||
sock_close(csock);
|
||||
}
|
||||
|
||||
csock = sock_accept(ssock, ip, sizeof(ip));
|
||||
if (csock == SOCK_ERROR) {
|
||||
sock_close(ssock);
|
||||
return false;
|
||||
} else {
|
||||
sock_close(csock);
|
||||
}
|
||||
|
||||
sock_close(ssock);
|
||||
|
||||
return strcmp(ip, "::ffff:127.0.0.1") == 0 ? true : false;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
sock_family_t sock_get_family(sock_t sock)
|
||||
{
|
||||
struct sockaddr addr;
|
||||
|
@ -28,6 +28,7 @@
|
||||
#define __SOCK_H
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
@ -111,6 +112,7 @@ typedef enum {
|
||||
# define sock_listen _mangle(sock_listen)
|
||||
# define sock_set_send_buffer _mangle(sock_set_send_buffer)
|
||||
# define sock_accept _mangle(sock_accept)
|
||||
# define sock_is_ipv4_mapped_supported _mangle(sock_is_ipv4_mapped_supported)
|
||||
# define sock_get_family _mangle(sock_get_family)
|
||||
# define sock_family_to_string _mangle(sock_family_to_string)
|
||||
#endif
|
||||
@ -155,6 +157,8 @@ 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);
|
||||
|
||||
bool sock_is_ipv4_mapped_supported(void);
|
||||
|
||||
/* Socket information */
|
||||
sock_family_t sock_get_family(sock_t sock);
|
||||
const char * sock_family_to_string(sock_family_t family);
|
||||
|
Loading…
x
Reference in New Issue
Block a user