diff options
author | Florian Zeitz <florob@babelmonkeys.de> | 2011-06-14 02:47:43 +0200 |
---|---|---|
committer | Sam Roberts <vieuxtech@gmail.com> | 2012-04-11 13:33:34 -0700 |
commit | f871a29f27ea28dea480d0e061a6d6ec1670384b (patch) | |
tree | 04166246bc1f890eae702312428fe74b285afe06 /src | |
parent | 4df1618aaba49a35d5a262970b3f4773dcd0ee25 (diff) | |
download | luasocket-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.c | 5 | ||||
-rw-r--r-- | src/options.h | 1 | ||||
-rw-r--r-- | src/tcp.c | 6 | ||||
-rw-r--r-- | src/udp.c | 6 |
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 | ||
157 | int 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); | |||
32 | int opt_set_ip_multicast_loop(lua_State *L, p_socket ps); | 32 | int opt_set_ip_multicast_loop(lua_State *L, p_socket ps); |
33 | int opt_set_ip_add_membership(lua_State *L, p_socket ps); | 33 | int opt_set_ip_add_membership(lua_State *L, p_socket ps); |
34 | int opt_set_ip_drop_membersip(lua_State *L, p_socket ps); | 34 | int opt_set_ip_drop_membersip(lua_State *L, p_socket ps); |
35 | int opt_set_ip6_v6only(lua_State *L, p_socket ps); | ||
35 | /* invokes the appropriate option handler */ | 36 | /* invokes the appropriate option handler */ |
36 | int opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps); | 37 | int opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps); |
37 | 38 | ||
@@ -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); |
@@ -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; |