Compare commits

...

8 Commits

Author SHA1 Message Date
mbartlett21
ef139fe081
Merge b0470f4a0eab396ef116c77dcae0cb75ebe17fce into 0f37af645c5f3a0377f1650b529ed23b2e26749f 2023-10-31 23:02:49 -06:00
Caleb Maclennan
0f37af645c
Merge pull request #415 from leso-kn/feature/actions-windows 2023-10-30 22:04:00 +03:00
leso-kn
9c6195ea62
ci: Enable windows build 2023-10-27 19:31:18 +02:00
leso-kn
708e50f8e6
refactor(core): Replace check for SO_BINDTODEVICE support with platform independent version 2023-10-27 11:34:39 +02:00
leso-kn
0bc8c56043
fix(core): Disable SO_BINDTODEVICE on windows
Co-authored-by: Sewbacca <sebastian.kalus@kolabnow.com>
2023-10-27 09:59:26 +03:00
Leso_KN
f741a88b80
feat(tcp): Add 'bindtodevice' option (#408) 2023-10-23 21:27:01 +03:00
mbartlett21
b0470f4a0e
Receive line with ending 2020-01-17 12:17:32 +10:00
mbartlett21
c27c23074c
TCP Receive without *
The TCP Receive code now uses a switch statement and allows dropping the * at the start of the string, like Lua's io library
2020-01-17 12:08:54 +10:00
5 changed files with 60 additions and 10 deletions

View File

@ -13,22 +13,27 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
luaVersion: [ "5.4", "5.3", "5.2", "5.1", "luajit", "luajit-openresty" ] luaVersion: [ "5.4", "5.3", "5.2", "5.1", "luajit", "luajit-openresty" ]
platform: [ "ubuntu-20.04", "macos-11" ] # "windows-2022" not supported by gh-actions-lua platform: [ "ubuntu-20.04", "macos-11", "windows-2022" ]
runs-on: ${{ matrix.platform }} runs-on: ${{ matrix.platform }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Setup msvc
uses: ilammy/msvc-dev-cmd@v1
if: ${{ !startsWith(matrix.luaVersion, 'luajit') }}
- name: Setup lua - name: Setup lua
uses: leafo/gh-actions-lua@v9 uses: leso-kn/gh-actions-lua@v11-staging
with: with:
luaVersion: ${{ matrix.luaVersion }} luaVersion: ${{ matrix.luaVersion }}
- name: Setup luarocks - name: Setup luarocks
uses: leafo/gh-actions-luarocks@v4 uses: hishamhm/gh-actions-luarocks@master
- name: Make and install - name: Make and install
run: | run: |
export DEBUG=DEBUG
luarocks make -- luasocket-scm-3.rockspec luarocks make -- luasocket-scm-3.rockspec
env:
DEBUG: DEBUG
- name: Run regression tests - name: Run regression tests
shell: bash
run: | run: |
cd test cd test
lua hello.lua lua hello.lua

View File

@ -9,7 +9,7 @@
* Internal function prototypes * Internal function prototypes
\*=========================================================================*/ \*=========================================================================*/
static int recvraw(p_buffer buf, size_t wanted, luaL_Buffer *b); static int recvraw(p_buffer buf, size_t wanted, luaL_Buffer *b);
static int recvline(p_buffer buf, luaL_Buffer *b); static int recvline(p_buffer buf, luaL_Buffer *b, int chop);
static int recvall(p_buffer buf, luaL_Buffer *b); static int recvall(p_buffer buf, luaL_Buffer *b);
static int buffer_get(p_buffer buf, const char **data, size_t *count); static int buffer_get(p_buffer buf, const char **data, size_t *count);
static void buffer_skip(p_buffer buf, size_t count); static void buffer_skip(p_buffer buf, size_t count);
@ -117,10 +117,21 @@ int buffer_meth_receive(lua_State *L, p_buffer buf) {
luaL_addlstring(&b, part, size); luaL_addlstring(&b, part, size);
/* receive new patterns */ /* receive new patterns */
if (!lua_isnumber(L, 2)) { if (!lua_isnumber(L, 2)) {
const char *p= luaL_optstring(L, 2, "*l"); const char *p = luaL_optstring(L, 2, "l");
if (p[0] == '*' && p[1] == 'l') err = recvline(buf, &b); if (*p == '*') p++; /* skip optional '*' (for compatibility) */
else if (p[0] == '*' && p[1] == 'a') err = recvall(buf, &b); switch (*p) {
else luaL_argcheck(L, 0, 2, "invalid receive pattern"); case 'l': /* line */
err = recvline(buf, &b, 1);
break;
case 'L': /* line with \n */
err = recvline(buf, &b, 0);
break;
case 'a': /* all */
err = recvall(buf, &b);
break;
default:
luaL_argcheck(L, 0, 2, "invalid receive pattern");
}
/* get a fixed number of bytes (minus what was already partially /* get a fixed number of bytes (minus what was already partially
* received) */ * received) */
} else { } else {
@ -222,7 +233,7 @@ static int recvall(p_buffer buf, luaL_Buffer *b) {
* Reads a line terminated by a CR LF pair or just by a LF. The CR and LF * Reads a line terminated by a CR LF pair or just by a LF. The CR and LF
* are not returned by the function and are discarded from the buffer * are not returned by the function and are discarded from the buffer
\*-------------------------------------------------------------------------*/ \*-------------------------------------------------------------------------*/
static int recvline(p_buffer buf, luaL_Buffer *b) { static int recvline(p_buffer buf, luaL_Buffer *b, int chop) {
int err = IO_DONE; int err = IO_DONE;
while (err == IO_DONE) { while (err == IO_DONE) {
size_t count, pos; const char *data; size_t count, pos; const char *data;
@ -234,6 +245,8 @@ static int recvline(p_buffer buf, luaL_Buffer *b) {
pos++; pos++;
} }
if (pos < count) { /* found '\n' */ if (pos < count) { /* found '\n' */
if (!chop)
luaL_addchar(b, '\n');
buffer_skip(buf, pos+1); /* skip '\n' too */ buffer_skip(buf, pos+1); /* skip '\n' too */
break; /* we are done */ break; /* we are done */
} else /* reached the end of the buffer */ } else /* reached the end of the buffer */

View File

@ -54,6 +54,33 @@ int opt_meth_getoption(lua_State *L, p_opt opt, p_socket ps)
return opt->func(L, ps); return opt->func(L, ps);
} }
/*------------------------------------------------------*/
/* binds socket to network interface */
int opt_set_bindtodevice(lua_State *L, p_socket ps)
{
#ifndef SO_BINDTODEVICE
return luaL_error(L, "SO_BINDTODEVICE is not supported on this operating system");
#else
const char *dev = luaL_checkstring(L, 3);
return opt_set(L, ps, SOL_SOCKET, SO_BINDTODEVICE, (char*)dev, strlen(dev)+1);
#endif
}
int opt_get_bindtodevice(lua_State *L, p_socket ps)
{
#ifndef SO_BINDTODEVICE
return luaL_error(L, "SO_BINDTODEVICE is not supported on this operating system");
#else
char dev[IFNAMSIZ];
int len = sizeof(dev);
int err = opt_get(L, ps, SOL_SOCKET, SO_BINDTODEVICE, &dev, &len);
if (err)
return err;
lua_pushstring(L, dev);
return 1;
#endif
}
/*------------------------------------------------------*/ /*------------------------------------------------------*/
/* enables reuse of local address */ /* enables reuse of local address */
int opt_set_reuseaddr(lua_State *L, p_socket ps) int opt_set_reuseaddr(lua_State *L, p_socket ps)

View File

@ -53,6 +53,9 @@ int opt_get_tcp_keepintvl(lua_State *L, p_socket ps);
int opt_set_tcp_defer_accept(lua_State *L, p_socket ps); int opt_set_tcp_defer_accept(lua_State *L, p_socket ps);
#endif #endif
int opt_set_bindtodevice(lua_State *L, p_socket ps);
int opt_get_bindtodevice(lua_State *L, p_socket ps);
int opt_set_keepalive(lua_State *L, p_socket ps); int opt_set_keepalive(lua_State *L, p_socket ps);
int opt_get_keepalive(lua_State *L, p_socket ps); int opt_get_keepalive(lua_State *L, p_socket ps);

View File

@ -71,6 +71,7 @@ static luaL_Reg tcp_methods[] = {
/* socket option handlers */ /* socket option handlers */
static t_opt optget[] = { static t_opt optget[] = {
{"bindtodevice", opt_get_bindtodevice},
{"keepalive", opt_get_keepalive}, {"keepalive", opt_get_keepalive},
{"reuseaddr", opt_get_reuseaddr}, {"reuseaddr", opt_get_reuseaddr},
{"reuseport", opt_get_reuseport}, {"reuseport", opt_get_reuseport},
@ -92,6 +93,7 @@ static t_opt optget[] = {
}; };
static t_opt optset[] = { static t_opt optset[] = {
{"bindtodevice", opt_set_bindtodevice},
{"keepalive", opt_set_keepalive}, {"keepalive", opt_set_keepalive},
{"reuseaddr", opt_set_reuseaddr}, {"reuseaddr", opt_set_reuseaddr},
{"reuseport", opt_set_reuseport}, {"reuseport", opt_set_reuseport},