mirror of
https://github.com/lunarmodules/luasocket.git
synced 2025-07-16 13:59:55 +02:00
Compare commits
9 Commits
e72369d8c1
...
hjelmeland
Author | SHA1 | Date | |
---|---|---|---|
5c4fc93d5f | |||
43a97b7f00 | |||
64c9d531df | |||
0f37af645c | |||
9c6195ea62 | |||
708e50f8e6 | |||
0bc8c56043 | |||
f741a88b80 | |||
ccef3bc4e2 |
17
.github/workflows/build.yml
vendored
17
.github/workflows/build.yml
vendored
@ -8,27 +8,32 @@ on:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Test build on ${{ matrix.platform }}
|
||||
name: Test ${{ matrix.luaVersion }} on ${{ matrix.platform }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
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-22.04", "macos-11", "windows-2022" ]
|
||||
runs-on: ${{ matrix.platform }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
- name: Setup ’msvc’
|
||||
if: ${{ startsWith(matrix.platform, 'windows') && !startsWith(matrix.luaVersion, 'luajit') }}
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
- name: Setup ‘lua’
|
||||
uses: leafo/gh-actions-lua@v9
|
||||
uses: leso-kn/gh-actions-lua@v11-staging
|
||||
with:
|
||||
luaVersion: ${{ matrix.luaVersion }}
|
||||
- name: Setup ‘luarocks’
|
||||
uses: leafo/gh-actions-luarocks@v4
|
||||
uses: hishamhm/gh-actions-luarocks@master
|
||||
- name: Make and install
|
||||
run: |
|
||||
export DEBUG=DEBUG
|
||||
luarocks make -- luasocket-scm-3.rockspec
|
||||
env:
|
||||
DEBUG: DEBUG
|
||||
- name: Run regression tests
|
||||
shell: bash
|
||||
run: |
|
||||
cd test
|
||||
lua hello.lua
|
||||
|
6
.github/workflows/luacheck.yml
vendored
6
.github/workflows/luacheck.yml
vendored
@ -5,9 +5,9 @@ on: [push, pull_request]
|
||||
jobs:
|
||||
|
||||
luacheck:
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
- name: Luacheck
|
||||
uses: lunarmodules/luacheck@v0
|
||||
uses: lunarmodules/luacheck@v1
|
||||
|
25
src/buffer.c
25
src/buffer.c
@ -9,7 +9,7 @@
|
||||
* Internal function prototypes
|
||||
\*=========================================================================*/
|
||||
static int recvraw(p_buffer buf, size_t wanted, luaL_Buffer *b);
|
||||
static int recvline(p_buffer buf, luaL_Buffer *b, int chop);
|
||||
static int recvline(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 void buffer_skip(p_buffer buf, size_t count);
|
||||
@ -117,21 +117,10 @@ int buffer_meth_receive(lua_State *L, p_buffer buf) {
|
||||
luaL_addlstring(&b, part, size);
|
||||
/* receive new patterns */
|
||||
if (!lua_isnumber(L, 2)) {
|
||||
const char *p = luaL_optstring(L, 2, "l");
|
||||
if (*p == '*') p++; /* skip optional '*' (for compatibility) */
|
||||
switch (*p) {
|
||||
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");
|
||||
}
|
||||
const char *p= luaL_optstring(L, 2, "*l");
|
||||
if (p[0] == '*' && p[1] == 'l') err = recvline(buf, &b);
|
||||
else if (p[0] == '*' && p[1] == 'a') err = recvall(buf, &b);
|
||||
else luaL_argcheck(L, 0, 2, "invalid receive pattern");
|
||||
/* get a fixed number of bytes (minus what was already partially
|
||||
* received) */
|
||||
} else {
|
||||
@ -233,7 +222,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
|
||||
* are not returned by the function and are discarded from the buffer
|
||||
\*-------------------------------------------------------------------------*/
|
||||
static int recvline(p_buffer buf, luaL_Buffer *b, int chop) {
|
||||
static int recvline(p_buffer buf, luaL_Buffer *b) {
|
||||
int err = IO_DONE;
|
||||
while (err == IO_DONE) {
|
||||
size_t count, pos; const char *data;
|
||||
@ -245,8 +234,6 @@ static int recvline(p_buffer buf, luaL_Buffer *b, int chop) {
|
||||
pos++;
|
||||
}
|
||||
if (pos < count) { /* found '\n' */
|
||||
if (!chop)
|
||||
luaL_addchar(b, '\n');
|
||||
buffer_skip(buf, pos+1); /* skip '\n' too */
|
||||
break; /* we are done */
|
||||
} else /* reached the end of the buffer */
|
||||
|
@ -54,6 +54,33 @@ int opt_meth_getoption(lua_State *L, p_opt opt, p_socket 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 */
|
||||
int opt_set_reuseaddr(lua_State *L, p_socket ps)
|
||||
|
@ -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);
|
||||
#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_get_keepalive(lua_State *L, p_socket ps);
|
||||
|
||||
|
@ -12,7 +12,7 @@
|
||||
#define PIE_CONNREFUSED "connection refused"
|
||||
#define PIE_CONNABORTED "closed"
|
||||
#define PIE_CONNRESET "closed"
|
||||
#define PIE_TIMEDOUT "timeout"
|
||||
#define PIE_TIMEDOUT "connection timeout"
|
||||
#define PIE_AGAIN "temporary failure in name resolution"
|
||||
#define PIE_BADFLAGS "invalid value for ai_flags"
|
||||
#define PIE_BADHINTS "invalid value for hints"
|
||||
|
@ -71,6 +71,7 @@ static luaL_Reg tcp_methods[] = {
|
||||
|
||||
/* socket option handlers */
|
||||
static t_opt optget[] = {
|
||||
{"bindtodevice", opt_get_bindtodevice},
|
||||
{"keepalive", opt_get_keepalive},
|
||||
{"reuseaddr", opt_get_reuseaddr},
|
||||
{"reuseport", opt_get_reuseport},
|
||||
@ -92,6 +93,7 @@ static t_opt optget[] = {
|
||||
};
|
||||
|
||||
static t_opt optset[] = {
|
||||
{"bindtodevice", opt_set_bindtodevice},
|
||||
{"keepalive", opt_set_keepalive},
|
||||
{"reuseaddr", opt_set_reuseaddr},
|
||||
{"reuseport", opt_set_reuseport},
|
||||
|
Reference in New Issue
Block a user