aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeso_KN <info@lesosoftware.com>2023-10-23 20:27:01 +0200
committerGitHub <noreply@github.com>2023-10-23 21:27:01 +0300
commitf741a88b80ffcf4de65b91ff82fc9f7865cbad0e (patch)
treeb037761c61edd06602410b2fd6705b1ef3682041
parent9100f7e3abf3511009fa21de1e0b304cac5489d3 (diff)
downloadluasocket-f741a88b80ffcf4de65b91ff82fc9f7865cbad0e.tar.gz
luasocket-f741a88b80ffcf4de65b91ff82fc9f7865cbad0e.tar.bz2
luasocket-f741a88b80ffcf4de65b91ff82fc9f7865cbad0e.zip
feat(tcp): Add 'bindtodevice' option (#408)
-rw-r--r--src/options.c27
-rw-r--r--src/options.h3
-rw-r--r--src/tcp.c2
3 files changed, 32 insertions, 0 deletions
diff --git a/src/options.c b/src/options.c
index 657947c..3856797 100644
--- a/src/options.c
+++ b/src/options.c
@@ -55,6 +55,33 @@ int opt_meth_getoption(lua_State *L, p_opt opt, p_socket ps)
55} 55}
56 56
57/*------------------------------------------------------*/ 57/*------------------------------------------------------*/
58/* binds socket to network interface */
59int opt_set_bindtodevice(lua_State *L, p_socket ps)
60{
61#ifdef __APPLE__
62 return luaL_error(L, "SO_BINDTODEVICE is not supported on this operating system");
63#else
64 const char *dev = luaL_checkstring(L, 3);
65 return opt_set(L, ps, SOL_SOCKET, SO_BINDTODEVICE, (char*)dev, strlen(dev)+1);
66#endif
67}
68
69int opt_get_bindtodevice(lua_State *L, p_socket ps)
70{
71#ifdef __APPLE__
72 return luaL_error(L, "SO_BINDTODEVICE is not supported on this operating system");
73#else
74 char dev[IFNAMSIZ];
75 int len = sizeof(dev);
76 int err = opt_get(L, ps, SOL_SOCKET, SO_BINDTODEVICE, &dev, &len);
77 if (err)
78 return err;
79 lua_pushstring(L, dev);
80 return 1;
81#endif
82}
83
84/*------------------------------------------------------*/
58/* enables reuse of local address */ 85/* enables reuse of local address */
59int opt_set_reuseaddr(lua_State *L, p_socket ps) 86int opt_set_reuseaddr(lua_State *L, p_socket ps)
60{ 87{
diff --git a/src/options.h b/src/options.h
index 456eeb5..26d6f02 100644
--- a/src/options.h
+++ b/src/options.h
@@ -53,6 +53,9 @@ int opt_get_tcp_keepintvl(lua_State *L, p_socket ps);
53int opt_set_tcp_defer_accept(lua_State *L, p_socket ps); 53int opt_set_tcp_defer_accept(lua_State *L, p_socket ps);
54#endif 54#endif
55 55
56int opt_set_bindtodevice(lua_State *L, p_socket ps);
57int opt_get_bindtodevice(lua_State *L, p_socket ps);
58
56int opt_set_keepalive(lua_State *L, p_socket ps); 59int opt_set_keepalive(lua_State *L, p_socket ps);
57int opt_get_keepalive(lua_State *L, p_socket ps); 60int opt_get_keepalive(lua_State *L, p_socket ps);
58 61
diff --git a/src/tcp.c b/src/tcp.c
index e84db84..f001206 100644
--- a/src/tcp.c
+++ b/src/tcp.c
@@ -71,6 +71,7 @@ static luaL_Reg tcp_methods[] = {
71 71
72/* socket option handlers */ 72/* socket option handlers */
73static t_opt optget[] = { 73static t_opt optget[] = {
74 {"bindtodevice", opt_get_bindtodevice},
74 {"keepalive", opt_get_keepalive}, 75 {"keepalive", opt_get_keepalive},
75 {"reuseaddr", opt_get_reuseaddr}, 76 {"reuseaddr", opt_get_reuseaddr},
76 {"reuseport", opt_get_reuseport}, 77 {"reuseport", opt_get_reuseport},
@@ -92,6 +93,7 @@ static t_opt optget[] = {
92}; 93};
93 94
94static t_opt optset[] = { 95static t_opt optset[] = {
96 {"bindtodevice", opt_set_bindtodevice},
95 {"keepalive", opt_set_keepalive}, 97 {"keepalive", opt_set_keepalive},
96 {"reuseaddr", opt_set_reuseaddr}, 98 {"reuseaddr", opt_set_reuseaddr},
97 {"reuseport", opt_set_reuseport}, 99 {"reuseport", opt_set_reuseport},