Allow IPv{4,6} only
This commit is contained in:
18
mud.c
18
mud.c
@@ -548,12 +548,12 @@ void mud_set_time_tolerance_sec (struct mud *mud, unsigned sec)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
int mud_setup_socket (int fd)
|
int mud_setup_socket (int fd, int v4, int v6)
|
||||||
{
|
{
|
||||||
if (mud_sso_int(fd, SOL_SOCKET, SO_REUSEADDR, 1) ||
|
if (mud_sso_int(fd, SOL_SOCKET, SO_REUSEADDR, 1) ||
|
||||||
mud_sso_int(fd, IPPROTO_IP, IP_PKTINFO, 1) ||
|
(v4 && mud_sso_int(fd, IPPROTO_IP, IP_PKTINFO, 1)) ||
|
||||||
mud_sso_int(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, 1) ||
|
(v6 && mud_sso_int(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, 1)) ||
|
||||||
mud_sso_int(fd, IPPROTO_IPV6, IPV6_V6ONLY, 0) ||
|
(v6 && mud_sso_int(fd, IPPROTO_IPV6, IPV6_V6ONLY, !v4)) ||
|
||||||
mud_set_nonblock(fd))
|
mud_set_nonblock(fd))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@@ -564,7 +564,7 @@ int mud_setup_socket (int fd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
int mud_create_socket (const char *port)
|
int mud_create_socket (const char *port, int v4, int v6)
|
||||||
{
|
{
|
||||||
struct addrinfo *p, *ai = mud_addrinfo(NULL, port, AI_PASSIVE|AI_NUMERICSERV);
|
struct addrinfo *p, *ai = mud_addrinfo(NULL, port, AI_PASSIVE|AI_NUMERICSERV);
|
||||||
|
|
||||||
@@ -574,7 +574,7 @@ int mud_create_socket (const char *port)
|
|||||||
int fd = -1;
|
int fd = -1;
|
||||||
|
|
||||||
for (p = ai; p; p = p->ai_next) {
|
for (p = ai; p; p = p->ai_next) {
|
||||||
if (p->ai_family != AF_INET6)
|
if (v6 && (p->ai_family != AF_INET6))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!p->ai_addr)
|
if (!p->ai_addr)
|
||||||
@@ -585,7 +585,7 @@ int mud_create_socket (const char *port)
|
|||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (mud_setup_socket(fd) ||
|
if (mud_setup_socket(fd, v4, v6) ||
|
||||||
bind(fd, p->ai_addr, p->ai_addrlen)) {
|
bind(fd, p->ai_addr, p->ai_addrlen)) {
|
||||||
close(fd);
|
close(fd);
|
||||||
fd = -1;
|
fd = -1;
|
||||||
@@ -611,7 +611,7 @@ int mud_create_queue (struct queue *queue)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct mud *mud_create (const char *port)
|
struct mud *mud_create (const char *port, int v4, int v6)
|
||||||
{
|
{
|
||||||
if (sodium_init() == -1)
|
if (sodium_init() == -1)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -621,7 +621,7 @@ struct mud *mud_create (const char *port)
|
|||||||
if (!mud)
|
if (!mud)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
mud->fd = mud_create_socket(port);
|
mud->fd = mud_create_socket(port, v4, v6);
|
||||||
|
|
||||||
if (mud->fd == -1) {
|
if (mud->fd == -1) {
|
||||||
mud_delete(mud);
|
mud_delete(mud);
|
||||||
|
|||||||
2
mud.h
2
mud.h
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
struct mud;
|
struct mud;
|
||||||
|
|
||||||
struct mud *mud_create (const char *);
|
struct mud *mud_create (const char *, int, int);
|
||||||
void mud_delete (struct mud *);
|
void mud_delete (struct mud *);
|
||||||
|
|
||||||
int mud_set_key (struct mud *, unsigned char *, size_t);
|
int mud_set_key (struct mud *, unsigned char *, size_t);
|
||||||
|
|||||||
Reference in New Issue
Block a user