aboutsummaryrefslogtreecommitdiff
path: root/src/options.c
diff options
context:
space:
mode:
authorDiego Nehab <diego@tecgraf.puc-rio.br>2009-05-27 09:31:38 +0000
committerDiego Nehab <diego@tecgraf.puc-rio.br>2009-05-27 09:31:38 +0000
commitbce60be30fe8e9c1b0eb33128c23c93d7bca5303 (patch)
tree3927343c777fcb7764a0f2f89754a0ceab141c21 /src/options.c
parentd1a72435d5bd3528f3c334cd4d1da16dcead47bf (diff)
downloadluasocket-bce60be30fe8e9c1b0eb33128c23c93d7bca5303.tar.gz
luasocket-bce60be30fe8e9c1b0eb33128c23c93d7bca5303.tar.bz2
luasocket-bce60be30fe8e9c1b0eb33128c23c93d7bca5303.zip
Decent makefiles!
Diffstat (limited to 'src/options.c')
-rw-r--r--src/options.c86
1 files changed, 74 insertions, 12 deletions
diff --git a/src/options.c b/src/options.c
index a464a4b..1d4c950 100644
--- a/src/options.c
+++ b/src/options.c
@@ -12,12 +12,12 @@
12#include "options.h" 12#include "options.h"
13#include "inet.h" 13#include "inet.h"
14 14
15
16/*=========================================================================*\ 15/*=========================================================================*\
17* Internal functions prototypes 16* Internal functions prototypes
18\*=========================================================================*/ 17\*=========================================================================*/
19static int opt_setmembership(lua_State *L, p_socket ps, int level, int name); 18static int opt_setmembership(lua_State *L, p_socket ps, int level, int name);
20static int opt_setboolean(lua_State *L, p_socket ps, int level, int name); 19static int opt_setboolean(lua_State *L, p_socket ps, int level, int name);
20static int opt_getboolean(lua_State *L, p_socket ps, int level, int name);
21static int opt_set(lua_State *L, p_socket ps, int level, int name, 21static int opt_set(lua_State *L, p_socket ps, int level, int name,
22 void *val, int len); 22 void *val, int len);
23 23
@@ -40,39 +40,63 @@ int opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps)
40 return opt->func(L, ps); 40 return opt->func(L, ps);
41} 41}
42 42
43int opt_meth_getoption(lua_State *L, p_opt opt, p_socket ps)
44{
45 const char *name = luaL_checkstring(L, 2); /* obj, name, ... */
46 while (opt->name && strcmp(name, opt->name))
47 opt++;
48 if (!opt->func) {
49 char msg[45];
50 sprintf(msg, "unsupported option `%.35s'", name);
51 luaL_argerror(L, 2, msg);
52 }
53 return opt->func(L, ps);
54}
55
43/* enables reuse of local address */ 56/* enables reuse of local address */
44int opt_reuseaddr(lua_State *L, p_socket ps) 57int opt_set_reuseaddr(lua_State *L, p_socket ps)
45{ 58{
46 return opt_setboolean(L, ps, SOL_SOCKET, SO_REUSEADDR); 59 return opt_setboolean(L, ps, SOL_SOCKET, SO_REUSEADDR);
47} 60}
48 61
62/* enables reuse of local port */
63int opt_set_reuseport(lua_State *L, p_socket ps)
64{
65 return opt_setboolean(L, ps, SOL_SOCKET, SO_REUSEPORT);
66}
67
49/* disables the Naggle algorithm */ 68/* disables the Naggle algorithm */
50int opt_tcp_nodelay(lua_State *L, p_socket ps) 69int opt_set_tcp_nodelay(lua_State *L, p_socket ps)
51{ 70{
52 return opt_setboolean(L, ps, IPPROTO_TCP, TCP_NODELAY); 71 return opt_setboolean(L, ps, IPPROTO_TCP, TCP_NODELAY);
53} 72}
54 73
55int opt_keepalive(lua_State *L, p_socket ps) 74int opt_set_keepalive(lua_State *L, p_socket ps)
56{ 75{
57 return opt_setboolean(L, ps, SOL_SOCKET, SO_KEEPALIVE); 76 return opt_setboolean(L, ps, SOL_SOCKET, SO_KEEPALIVE);
58} 77}
59 78
60int opt_dontroute(lua_State *L, p_socket ps) 79int opt_set_dontroute(lua_State *L, p_socket ps)
61{ 80{
62 return opt_setboolean(L, ps, SOL_SOCKET, SO_DONTROUTE); 81 return opt_setboolean(L, ps, SOL_SOCKET, SO_DONTROUTE);
63} 82}
64 83
65int opt_broadcast(lua_State *L, p_socket ps) 84int opt_set_broadcast(lua_State *L, p_socket ps)
66{ 85{
67 return opt_setboolean(L, ps, SOL_SOCKET, SO_BROADCAST); 86 return opt_setboolean(L, ps, SOL_SOCKET, SO_BROADCAST);
68} 87}
69 88
70int opt_ip_multicast_loop(lua_State *L, p_socket ps) 89int opt_set_ip_multicast_loop(lua_State *L, p_socket ps)
71{ 90{
72 return opt_setboolean(L, ps, IPPROTO_IP, IP_MULTICAST_LOOP); 91 return opt_setboolean(L, ps, IPPROTO_IP, IP_MULTICAST_LOOP);
73} 92}
74 93
75int opt_linger(lua_State *L, p_socket ps) 94int opt_get_ip_multicast_loop(lua_State *L, p_socket ps)
95{
96 return opt_getboolean(L, ps, IPPROTO_IP, IP_MULTICAST_LOOP);
97}
98
99int opt_set_linger(lua_State *L, p_socket ps)
76{ 100{
77 struct linger li; /* obj, name, table */ 101 struct linger li; /* obj, name, table */
78 if (!lua_istable(L, 3)) luaL_typerror(L, 3, lua_typename(L, LUA_TTABLE)); 102 if (!lua_istable(L, 3)) luaL_typerror(L, 3, lua_typename(L, LUA_TTABLE));
@@ -89,18 +113,43 @@ int opt_linger(lua_State *L, p_socket ps)
89 return opt_set(L, ps, SOL_SOCKET, SO_LINGER, (char *) &li, sizeof(li)); 113 return opt_set(L, ps, SOL_SOCKET, SO_LINGER, (char *) &li, sizeof(li));
90} 114}
91 115
92int opt_ip_multicast_ttl(lua_State *L, p_socket ps) 116int opt_set_ip_multicast_ttl(lua_State *L, p_socket ps)
93{ 117{
94 int val = (int) luaL_checknumber(L, 3); /* obj, name, int */ 118 int val = (int) luaL_checknumber(L, 3); /* obj, name, int */
95 return opt_set(L, ps, SOL_SOCKET, SO_LINGER, (char *) &val, sizeof(val)); 119 return opt_set(L, ps, IPPROTO_IP, IP_MULTICAST_TTL,
120 (char *) &val, sizeof(val));
121}
122
123int opt_set_ip_multicast_if(lua_State *L, p_socket ps)
124{
125 const char *address = luaL_checkstring(L, 3); /* obj, name, ip */
126 struct in_addr val;
127 val.s_addr = htonl(INADDR_ANY);
128 if (strcmp(address, "*") && !inet_aton(address, &val))
129 luaL_argerror(L, 3, "ip expected");
130 return opt_set(L, ps, IPPROTO_IP, IP_MULTICAST_IF,
131 (char *) &val, sizeof(val));
132}
133
134int opt_get_ip_multicast_if(lua_State *L, p_socket ps)
135{
136 struct in_addr val;
137 socklen_t len = sizeof(val);
138 if (getsockopt(*ps, IPPROTO_IP, IP_MULTICAST_IF, (char *) &val, &len) < 0) {
139 lua_pushnil(L);
140 lua_pushstring(L, "getsockopt failed");
141 return 2;
142 }
143 lua_pushstring(L, inet_ntoa(val));
144 return 1;
96} 145}
97 146
98int opt_ip_add_membership(lua_State *L, p_socket ps) 147int opt_set_ip_add_membership(lua_State *L, p_socket ps)
99{ 148{
100 return opt_setmembership(L, ps, IPPROTO_IP, IP_ADD_MEMBERSHIP); 149 return opt_setmembership(L, ps, IPPROTO_IP, IP_ADD_MEMBERSHIP);
101} 150}
102 151
103int opt_ip_drop_membersip(lua_State *L, p_socket ps) 152int opt_set_ip_drop_membersip(lua_State *L, p_socket ps)
104{ 153{
105 return opt_setmembership(L, ps, IPPROTO_IP, IP_DROP_MEMBERSHIP); 154 return opt_setmembership(L, ps, IPPROTO_IP, IP_DROP_MEMBERSHIP);
106} 155}
@@ -141,6 +190,19 @@ int opt_set(lua_State *L, p_socket ps, int level, int name, void *val, int len)
141 return 1; 190 return 1;
142} 191}
143 192
193static int opt_getboolean(lua_State *L, p_socket ps, int level, int name)
194{
195 int val = 0;
196 socklen_t len = sizeof(val);
197 if (getsockopt(*ps, level, name, (char *) &val, &len) < 0) {
198 lua_pushnil(L);
199 lua_pushstring(L, "getsockopt failed");
200 return 2;
201 }
202 lua_pushboolean(L, val);
203 return 1;
204}
205
144static int opt_setboolean(lua_State *L, p_socket ps, int level, int name) 206static int opt_setboolean(lua_State *L, p_socket ps, int level, int name)
145{ 207{
146 int val = auxiliar_checkboolean(L, 3); /* obj, name, bool */ 208 int val = auxiliar_checkboolean(L, 3); /* obj, name, bool */