diff options
author | Leso_KN <info@lesosoftware.com> | 2023-10-23 20:27:01 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-23 21:27:01 +0300 |
commit | f741a88b80ffcf4de65b91ff82fc9f7865cbad0e (patch) | |
tree | b037761c61edd06602410b2fd6705b1ef3682041 | |
parent | 9100f7e3abf3511009fa21de1e0b304cac5489d3 (diff) | |
download | luasocket-f741a88b80ffcf4de65b91ff82fc9f7865cbad0e.tar.gz luasocket-f741a88b80ffcf4de65b91ff82fc9f7865cbad0e.tar.bz2 luasocket-f741a88b80ffcf4de65b91ff82fc9f7865cbad0e.zip |
feat(tcp): Add 'bindtodevice' option (#408)
-rw-r--r-- | src/options.c | 27 | ||||
-rw-r--r-- | src/options.h | 3 | ||||
-rw-r--r-- | src/tcp.c | 2 |
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 */ | ||
59 | int 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 | |||
69 | int 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 */ |
59 | int opt_set_reuseaddr(lua_State *L, p_socket ps) | 86 | int 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); | |||
53 | int opt_set_tcp_defer_accept(lua_State *L, p_socket ps); | 53 | int opt_set_tcp_defer_accept(lua_State *L, p_socket ps); |
54 | #endif | 54 | #endif |
55 | 55 | ||
56 | int opt_set_bindtodevice(lua_State *L, p_socket ps); | ||
57 | int opt_get_bindtodevice(lua_State *L, p_socket ps); | ||
58 | |||
56 | int opt_set_keepalive(lua_State *L, p_socket ps); | 59 | int opt_set_keepalive(lua_State *L, p_socket ps); |
57 | int opt_get_keepalive(lua_State *L, p_socket ps); | 60 | int opt_get_keepalive(lua_State *L, p_socket ps); |
58 | 61 | ||
@@ -71,6 +71,7 @@ static luaL_Reg tcp_methods[] = { | |||
71 | 71 | ||
72 | /* socket option handlers */ | 72 | /* socket option handlers */ |
73 | static t_opt optget[] = { | 73 | static 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 | ||
94 | static t_opt optset[] = { | 95 | static 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}, |