aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFlorian Zeitz <florob@babelmonkeys.de>2011-06-14 02:47:43 +0200
committerSam Roberts <vieuxtech@gmail.com>2012-04-11 13:33:34 -0700
commitf871a29f27ea28dea480d0e061a6d6ec1670384b (patch)
tree04166246bc1f890eae702312428fe74b285afe06 /src
parent4df1618aaba49a35d5a262970b3f4773dcd0ee25 (diff)
downloadluasocket-f871a29f27ea28dea480d0e061a6d6ec1670384b.tar.gz
luasocket-f871a29f27ea28dea480d0e061a6d6ec1670384b.tar.bz2
luasocket-f871a29f27ea28dea480d0e061a6d6ec1670384b.zip
Add support for the IPV6_V6ONLY socket option defaulting to on.
Diffstat (limited to 'src')
-rw-r--r--src/options.c5
-rw-r--r--src/options.h1
-rw-r--r--src/tcp.c6
-rw-r--r--src/udp.c6
4 files changed, 18 insertions, 0 deletions
diff --git a/src/options.c b/src/options.c
index 1f5afa8..281a00f 100644
--- a/src/options.c
+++ b/src/options.c
@@ -154,6 +154,11 @@ int opt_set_ip_drop_membersip(lua_State *L, p_socket ps)
154 return opt_setmembership(L, ps, IPPROTO_IP, IP_DROP_MEMBERSHIP); 154 return opt_setmembership(L, ps, IPPROTO_IP, IP_DROP_MEMBERSHIP);
155} 155}
156 156
157int opt_set_ip6_v6only(lua_State *L, p_socket ps)
158{
159 return opt_setboolean(L, ps, IPPROTO_IPV6, IPV6_V6ONLY);
160}
161
157/*=========================================================================*\ 162/*=========================================================================*\
158* Auxiliar functions 163* Auxiliar functions
159\*=========================================================================*/ 164\*=========================================================================*/
diff --git a/src/options.h b/src/options.h
index aa43cab..70364fc 100644
--- a/src/options.h
+++ b/src/options.h
@@ -32,6 +32,7 @@ int opt_set_ip_multicast_ttl(lua_State *L, p_socket ps);
32int opt_set_ip_multicast_loop(lua_State *L, p_socket ps); 32int opt_set_ip_multicast_loop(lua_State *L, p_socket ps);
33int opt_set_ip_add_membership(lua_State *L, p_socket ps); 33int opt_set_ip_add_membership(lua_State *L, p_socket ps);
34int opt_set_ip_drop_membersip(lua_State *L, p_socket ps); 34int opt_set_ip_drop_membersip(lua_State *L, p_socket ps);
35int opt_set_ip6_v6only(lua_State *L, p_socket ps);
35/* invokes the appropriate option handler */ 36/* invokes the appropriate option handler */
36int opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps); 37int opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps);
37 38
diff --git a/src/tcp.c b/src/tcp.c
index 155f3bf..4f5eea9 100644
--- a/src/tcp.c
+++ b/src/tcp.c
@@ -70,6 +70,7 @@ static t_opt optset[] = {
70 {"keepalive", opt_set_keepalive}, 70 {"keepalive", opt_set_keepalive},
71 {"reuseaddr", opt_set_reuseaddr}, 71 {"reuseaddr", opt_set_reuseaddr},
72 {"tcp-nodelay", opt_set_tcp_nodelay}, 72 {"tcp-nodelay", opt_set_tcp_nodelay},
73 {"ipv6-v6only", opt_set_ip6_v6only},
73 {"linger", opt_set_linger}, 74 {"linger", opt_set_linger},
74 {NULL, NULL} 75 {NULL, NULL}
75}; 76};
@@ -334,6 +335,11 @@ static int tcp_create(lua_State *L, int domain) {
334 auxiliar_setclass(L, "tcp{master}", -1); 335 auxiliar_setclass(L, "tcp{master}", -1);
335 /* initialize remaining structure fields */ 336 /* initialize remaining structure fields */
336 socket_setnonblocking(&sock); 337 socket_setnonblocking(&sock);
338 if (domain == PF_INET6) {
339 int yes = 1;
340 setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY,
341 (void *)&yes, sizeof(yes));
342 }
337 tcp->sock = sock; 343 tcp->sock = sock;
338 io_init(&tcp->io, (p_send) socket_send, (p_recv) socket_recv, 344 io_init(&tcp->io, (p_send) socket_send, (p_recv) socket_recv,
339 (p_error) socket_ioerror, &tcp->sock); 345 (p_error) socket_ioerror, &tcp->sock);
diff --git a/src/udp.c b/src/udp.c
index 94bf125..fcfbbb7 100644
--- a/src/udp.c
+++ b/src/udp.c
@@ -77,6 +77,7 @@ static t_opt optset[] = {
77 {"ip-multicast-loop", opt_set_ip_multicast_loop}, 77 {"ip-multicast-loop", opt_set_ip_multicast_loop},
78 {"ip-add-membership", opt_set_ip_add_membership}, 78 {"ip-add-membership", opt_set_ip_add_membership},
79 {"ip-drop-membership", opt_set_ip_drop_membersip}, 79 {"ip-drop-membership", opt_set_ip_drop_membersip},
80 {"ipv6-v6only", opt_set_ip6_v6only},
80 {NULL, NULL} 81 {NULL, NULL}
81}; 82};
82 83
@@ -352,6 +353,11 @@ static int udp_create(lua_State *L, int domain) {
352 auxiliar_setclass(L, "udp{unconnected}", -1); 353 auxiliar_setclass(L, "udp{unconnected}", -1);
353 /* initialize remaining structure fields */ 354 /* initialize remaining structure fields */
354 socket_setnonblocking(&sock); 355 socket_setnonblocking(&sock);
356 if (domain == PF_INET6) {
357 int yes = 1;
358 setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY,
359 (void *)&yes, sizeof(yes));
360 }
355 udp->sock = sock; 361 udp->sock = sock;
356 timeout_init(&udp->tm, -1, -1); 362 timeout_init(&udp->tm, -1, -1);
357 udp->domain = domain; 363 udp->domain = domain;