Allow IPv{4,6} only

This commit is contained in:
angt
2016-04-25 16:27:06 +00:00
parent 04c8495fe6
commit f0ad4bbdd3
2 changed files with 10 additions and 10 deletions

18
mud.c
View File

@@ -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
View File

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