1
0
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:
Philipp Schafft 2022-03-07 08:40:21 +00:00
parent 88e5e66a2a
commit 08443ca69e
2 changed files with 58 additions and 0 deletions

View File

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

View File

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