From e92c1526bff22860782b24ba7f23b025edf21af8 Mon Sep 17 00:00:00 2001 From: Someguynamedpie Date: Wed, 27 Mar 2019 18:33:13 -0500 Subject: [PATCH 1/7] Account for abstract namespace names From lua_tostring to lua_tolstring since the names can start with null for namespaces. --- src/unixstream.c | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/unixstream.c b/src/unixstream.c index 02aced9..85cf4a8 100644 --- a/src/unixstream.c +++ b/src/unixstream.c @@ -33,8 +33,8 @@ static int meth_getstats(lua_State *L); static int meth_setstats(lua_State *L); static int meth_getsockname(lua_State *L); -static const char *unixstream_tryconnect(p_unix un, const char *path); -static const char *unixstream_trybind(p_unix un, const char *path); +static const char *unixstream_tryconnect(p_unix un, const char *path, size_t pathlen); +static const char *unixstream_trybind(p_unix un, const char *path, size_t pathlen); /* unixstream object methods */ static luaL_Reg unixstream_methods[] = { @@ -181,13 +181,12 @@ static int meth_accept(lua_State *L) { /*-------------------------------------------------------------------------*\ * Binds an object to an address \*-------------------------------------------------------------------------*/ -static const char *unixstream_trybind(p_unix un, const char *path) { +static const char *unixstream_trybind(p_unix un, const char *path, size_t pathlen) { struct sockaddr_un local; - size_t len = strlen(path); int err; - if (len >= sizeof(local.sun_path)) return "path too long"; + if (pathlen >= sizeof(local.sun_path)) return "path too long"; memset(&local, 0, sizeof(local)); - strcpy(local.sun_path, path); + memcpy(local.sun_path, path, pathlen); local.sun_family = AF_UNIX; #ifdef UNIX_HAS_SUN_LEN local.sun_len = sizeof(local.sun_family) + sizeof(local.sun_len) @@ -196,7 +195,7 @@ static const char *unixstream_trybind(p_unix un, const char *path) { #else err = socket_bind(&un->sock, (SA *) &local, - sizeof(local.sun_family) + len); + sizeof(local.sun_family) + pathlen); #endif if (err != IO_DONE) socket_destroy(&un->sock); return socket_strerror(err); @@ -204,8 +203,9 @@ static const char *unixstream_trybind(p_unix un, const char *path) { static int meth_bind(lua_State *L) { p_unix un = (p_unix) auxiliar_checkclass(L, "unixstream{master}", 1); - const char *path = luaL_checkstring(L, 2); - const char *err = unixstream_trybind(un, path); + size_t len = 0; + const char *path = luaL_checklstring(L, 2, &len); + const char *err = unixstream_trybind(un, path, len); if (err) { lua_pushnil(L); lua_pushstring(L, err); @@ -234,23 +234,22 @@ static int meth_getsockname(lua_State *L) /*-------------------------------------------------------------------------*\ * Turns a master unixstream object into a client object. \*-------------------------------------------------------------------------*/ -static const char *unixstream_tryconnect(p_unix un, const char *path) +static const char *unixstream_tryconnect(p_unix un, const char *path, size_t pathlen) { struct sockaddr_un remote; int err; - size_t len = strlen(path); - if (len >= sizeof(remote.sun_path)) return "path too long"; + if (pathlen >= sizeof(remote.sun_path)) return "path too long"; memset(&remote, 0, sizeof(remote)); - strcpy(remote.sun_path, path); + memcpy(remote.sun_path, path, pathlen); remote.sun_family = AF_UNIX; timeout_markstart(&un->tm); #ifdef UNIX_HAS_SUN_LEN remote.sun_len = sizeof(remote.sun_family) + sizeof(remote.sun_len) - + len + 1; + + pathlen + 1; err = socket_connect(&un->sock, (SA *) &remote, remote.sun_len, &un->tm); #else err = socket_connect(&un->sock, (SA *) &remote, - sizeof(remote.sun_family) + len, &un->tm); + sizeof(remote.sun_family) + pathlen, &un->tm); #endif if (err != IO_DONE) socket_destroy(&un->sock); return socket_strerror(err); @@ -259,8 +258,10 @@ static const char *unixstream_tryconnect(p_unix un, const char *path) static int meth_connect(lua_State *L) { p_unix un = (p_unix) auxiliar_checkclass(L, "unixstream{master}", 1); - const char *path = luaL_checkstring(L, 2); - const char *err = unixstream_tryconnect(un, path); + size_t len = 0; + + const char *path = luaL_checklstring(L, 2, &len); + const char *err = unixstream_tryconnect(un, path, len); if (err) { lua_pushnil(L); lua_pushstring(L, err); From 6435dec4f95556d98f078c4b8db2963ac485a45e Mon Sep 17 00:00:00 2001 From: Someguynamedpie Date: Wed, 27 Mar 2019 18:36:47 -0500 Subject: [PATCH 2/7] Update options.c SO_PASSCRED by @sathieu --- src/options.c | 147 ++++++++++++++++---------------------------------- 1 file changed, 47 insertions(+), 100 deletions(-) diff --git a/src/options.c b/src/options.c index 06ab58d..688a7e2 100644 --- a/src/options.c +++ b/src/options.c @@ -2,11 +2,14 @@ * Common option interface * LuaSocket toolkit \*=========================================================================*/ -#include "luasocket.h" +#include + +#include "lauxlib.h" + #include "auxiliar.h" #include "options.h" #include "inet.h" -#include + /*=========================================================================*\ * Internal functions prototypes @@ -34,7 +37,7 @@ int opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps) while (opt->name && strcmp(name, opt->name)) opt++; if (!opt->func) { - char msg[57]; + char msg[45]; sprintf(msg, "unsupported option `%.35s'", name); luaL_argerror(L, 2, msg); } @@ -47,14 +50,13 @@ int opt_meth_getoption(lua_State *L, p_opt opt, p_socket ps) while (opt->name && strcmp(name, opt->name)) opt++; if (!opt->func) { - char msg[57]; + char msg[45]; sprintf(msg, "unsupported option `%.35s'", name); luaL_argerror(L, 2, msg); } return opt->func(L, ps); } -// ------------------------------------------------------- /* enables reuse of local address */ int opt_set_reuseaddr(lua_State *L, p_socket ps) { @@ -66,7 +68,6 @@ int opt_get_reuseaddr(lua_State *L, p_socket ps) return opt_getboolean(L, ps, SOL_SOCKET, SO_REUSEADDR); } -// ------------------------------------------------------- /* enables reuse of local port */ int opt_set_reuseport(lua_State *L, p_socket ps) { @@ -78,8 +79,7 @@ int opt_get_reuseport(lua_State *L, p_socket ps) return opt_getboolean(L, ps, SOL_SOCKET, SO_REUSEPORT); } -// ------------------------------------------------------- -/* disables the Nagle algorithm */ +/* disables the Naggle algorithm */ int opt_set_tcp_nodelay(lua_State *L, p_socket ps) { return opt_setboolean(L, ps, IPPROTO_TCP, TCP_NODELAY); @@ -90,52 +90,6 @@ int opt_get_tcp_nodelay(lua_State *L, p_socket ps) return opt_getboolean(L, ps, IPPROTO_TCP, TCP_NODELAY); } -// ------------------------------------------------------- -#ifdef TCP_KEEPIDLE - -int opt_get_tcp_keepidle(lua_State *L, p_socket ps) -{ - return opt_getint(L, ps, IPPROTO_TCP, TCP_KEEPIDLE); -} - -int opt_set_tcp_keepidle(lua_State *L, p_socket ps) -{ - return opt_setint(L, ps, IPPROTO_TCP, TCP_KEEPIDLE); -} - -#endif - -// ------------------------------------------------------- -#ifdef TCP_KEEPCNT - -int opt_get_tcp_keepcnt(lua_State *L, p_socket ps) -{ - return opt_getint(L, ps, IPPROTO_TCP, TCP_KEEPCNT); -} - -int opt_set_tcp_keepcnt(lua_State *L, p_socket ps) -{ - return opt_setint(L, ps, IPPROTO_TCP, TCP_KEEPCNT); -} - -#endif - -// ------------------------------------------------------- -#ifdef TCP_KEEPINTVL - -int opt_get_tcp_keepintvl(lua_State *L, p_socket ps) -{ - return opt_getint(L, ps, IPPROTO_TCP, TCP_KEEPINTVL); -} - -int opt_set_tcp_keepintvl(lua_State *L, p_socket ps) -{ - return opt_setint(L, ps, IPPROTO_TCP, TCP_KEEPINTVL); -} - -#endif - -// ------------------------------------------------------- int opt_set_keepalive(lua_State *L, p_socket ps) { return opt_setboolean(L, ps, SOL_SOCKET, SO_KEEPALIVE); @@ -146,7 +100,6 @@ int opt_get_keepalive(lua_State *L, p_socket ps) return opt_getboolean(L, ps, SOL_SOCKET, SO_KEEPALIVE); } -// ------------------------------------------------------- int opt_set_dontroute(lua_State *L, p_socket ps) { return opt_setboolean(L, ps, SOL_SOCKET, SO_DONTROUTE); @@ -157,7 +110,6 @@ int opt_get_dontroute(lua_State *L, p_socket ps) return opt_getboolean(L, ps, SOL_SOCKET, SO_DONTROUTE); } -// ------------------------------------------------------- int opt_set_broadcast(lua_State *L, p_socket ps) { return opt_setboolean(L, ps, SOL_SOCKET, SO_BROADCAST); @@ -168,29 +120,6 @@ int opt_get_broadcast(lua_State *L, p_socket ps) return opt_getboolean(L, ps, SOL_SOCKET, SO_BROADCAST); } -// ------------------------------------------------------- -int opt_set_recv_buf_size(lua_State *L, p_socket ps) -{ - return opt_setint(L, ps, SOL_SOCKET, SO_RCVBUF); -} - -int opt_get_recv_buf_size(lua_State *L, p_socket ps) -{ - return opt_getint(L, ps, SOL_SOCKET, SO_RCVBUF); -} - -// ------------------------------------------------------- -int opt_get_send_buf_size(lua_State *L, p_socket ps) -{ - return opt_getint(L, ps, SOL_SOCKET, SO_SNDBUF); -} - -int opt_set_send_buf_size(lua_State *L, p_socket ps) -{ - return opt_setint(L, ps, SOL_SOCKET, SO_SNDBUF); -} - -// ------------------------------------------------------- int opt_set_ip6_unicast_hops(lua_State *L, p_socket ps) { return opt_setint(L, ps, IPPROTO_IPV6, IPV6_UNICAST_HOPS); @@ -201,7 +130,6 @@ int opt_get_ip6_unicast_hops(lua_State *L, p_socket ps) return opt_getint(L, ps, IPPROTO_IPV6, IPV6_UNICAST_HOPS); } -// ------------------------------------------------------- int opt_set_ip6_multicast_hops(lua_State *L, p_socket ps) { return opt_setint(L, ps, IPPROTO_IPV6, IPV6_MULTICAST_HOPS); @@ -212,7 +140,6 @@ int opt_get_ip6_multicast_hops(lua_State *L, p_socket ps) return opt_getint(L, ps, IPPROTO_IPV6, IPV6_MULTICAST_HOPS); } -// ------------------------------------------------------- int opt_set_ip_multicast_loop(lua_State *L, p_socket ps) { return opt_setboolean(L, ps, IPPROTO_IP, IP_MULTICAST_LOOP); @@ -223,7 +150,6 @@ int opt_get_ip_multicast_loop(lua_State *L, p_socket ps) return opt_getboolean(L, ps, IPPROTO_IP, IP_MULTICAST_LOOP); } -// ------------------------------------------------------- int opt_set_ip6_multicast_loop(lua_State *L, p_socket ps) { return opt_setboolean(L, ps, IPPROTO_IPV6, IPV6_MULTICAST_LOOP); @@ -234,7 +160,6 @@ int opt_get_ip6_multicast_loop(lua_State *L, p_socket ps) return opt_getboolean(L, ps, IPPROTO_IPV6, IPV6_MULTICAST_LOOP); } -// ------------------------------------------------------- int opt_set_linger(lua_State *L, p_socket ps) { struct linger li; /* obj, name, table */ @@ -267,13 +192,11 @@ int opt_get_linger(lua_State *L, p_socket ps) return 1; } -// ------------------------------------------------------- int opt_set_ip_multicast_ttl(lua_State *L, p_socket ps) { return opt_setint(L, ps, IPPROTO_IP, IP_MULTICAST_TTL); } -// ------------------------------------------------------- int opt_set_ip_multicast_if(lua_State *L, p_socket ps) { const char *address = luaL_checkstring(L, 3); /* obj, name, ip */ @@ -298,7 +221,6 @@ int opt_get_ip_multicast_if(lua_State *L, p_socket ps) return 1; } -// ------------------------------------------------------- int opt_set_ip_add_membership(lua_State *L, p_socket ps) { return opt_setmembership(L, ps, IPPROTO_IP, IP_ADD_MEMBERSHIP); @@ -309,7 +231,6 @@ int opt_set_ip_drop_membersip(lua_State *L, p_socket ps) return opt_setmembership(L, ps, IPPROTO_IP, IP_DROP_MEMBERSHIP); } -// ------------------------------------------------------- int opt_set_ip6_add_membership(lua_State *L, p_socket ps) { return opt_ip6_setmembership(L, ps, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP); @@ -319,7 +240,7 @@ int opt_set_ip6_drop_membersip(lua_State *L, p_socket ps) { return opt_ip6_setmembership(L, ps, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP); } -// ------------------------------------------------------- + int opt_get_ip6_v6only(lua_State *L, p_socket ps) { return opt_getboolean(L, ps, IPPROTO_IPV6, IPV6_V6ONLY); @@ -329,21 +250,34 @@ int opt_set_ip6_v6only(lua_State *L, p_socket ps) { return opt_setboolean(L, ps, IPPROTO_IPV6, IPV6_V6ONLY); } - -// ------------------------------------------------------- -int opt_get_error(lua_State *L, p_socket ps) +#ifndef _WIN32 +int opt_set_passcred(lua_State *L, p_socket ps) { - int val = 0; - socklen_t len = sizeof(val); - if (getsockopt(*ps, SOL_SOCKET, SO_ERROR, (char *) &val, &len) < 0) { - lua_pushnil(L); - lua_pushstring(L, "getsockopt failed"); - return 2; - } - lua_pushstring(L, socket_strerror(val)); - return 1; + return opt_setboolean(L, ps, SOL_SOCKET, SO_PASSCRED); } +int opt_get_passcred(lua_State *L, p_socket ps) +{ + return opt_getboolean(L, ps, SOL_SOCKET, SO_PASSCRED); +} + +int opt_get_peercred(lua_State *L, p_socket ps) +{ + struct ucred cred; + int len = sizeof(cred); + int err = opt_get(L, ps, SOL_SOCKET, SO_PEERCRED, (char *) &cred, &len); + if (err < 0) + return err; + lua_newtable(L); + lua_pushinteger(L, (long) cred.pid); + lua_setfield(L, -2, "pid"); + lua_pushinteger(L, (long) cred.uid); + lua_setfield(L, -2, "uid"); + lua_pushinteger(L, (long) cred.gid); + lua_setfield(L, -2, "gid"); + return 1; +} +#endif /*=========================================================================*\ * Auxiliar functions \*=========================================================================*/ @@ -430,6 +364,19 @@ static int opt_getboolean(lua_State *L, p_socket ps, int level, int name) return 1; } +int opt_get_error(lua_State *L, p_socket ps) +{ + int val = 0; + socklen_t len = sizeof(val); + if (getsockopt(*ps, SOL_SOCKET, SO_ERROR, (char *) &val, &len) < 0) { + lua_pushnil(L); + lua_pushstring(L, "getsockopt failed"); + return 2; + } + lua_pushstring(L, socket_strerror(val)); + return 1; +} + static int opt_setboolean(lua_State *L, p_socket ps, int level, int name) { int val = auxiliar_checkboolean(L, 3); /* obj, name, bool */ From d72ba1533e852f33dd085e5054c79c554545fd06 Mon Sep 17 00:00:00 2001 From: Someguynamedpie Date: Wed, 27 Mar 2019 18:40:50 -0500 Subject: [PATCH 3/7] Update unixstream.c SO_PEERCRED, cont'd. --- src/unixstream.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/unixstream.c b/src/unixstream.c index 85cf4a8..5044ea3 100644 --- a/src/unixstream.c +++ b/src/unixstream.c @@ -58,6 +58,9 @@ static luaL_Reg unixstream_methods[] = { {"getsockname", meth_getsockname}, {"settimeout", meth_settimeout}, {"shutdown", meth_shutdown}, +#ifndef _WIN32 + {"getoption", meth_getoption}, +#endif {NULL, NULL} }; @@ -66,6 +69,9 @@ static t_opt optset[] = { {"keepalive", opt_set_keepalive}, {"reuseaddr", opt_set_reuseaddr}, {"linger", opt_set_linger}, +#ifndef _WIN32 + {"passcred", opt_set_passcred}, +#endif {NULL, NULL} }; @@ -75,6 +81,14 @@ static luaL_Reg func[] = { {NULL, NULL} }; +#ifndef _WIN32 + +static t_opt optget[] = { + {"passcred", opt_get_passcred}, + {"peercred", opt_get_peercred}, + {NULL, NULL} +}; +#endif /*-------------------------------------------------------------------------*\ * Initializes module \*-------------------------------------------------------------------------*/ @@ -128,6 +142,11 @@ static int meth_setoption(lua_State *L) { return opt_meth_setoption(L, optset, &un->sock); } +static int meth_getoption(lua_State *L) { + p_unix un = (p_unix) auxiliar_checkgroup(L, "unixstream{any}", 1); + return opt_meth_getoption(L, optget, &un->sock); +} + /*-------------------------------------------------------------------------*\ * Select support methods \*-------------------------------------------------------------------------*/ From 5eacaa8ec0af99188b749f7cd6e775993beb0f10 Mon Sep 17 00:00:00 2001 From: Someguynamedpie Date: Wed, 27 Mar 2019 18:41:54 -0500 Subject: [PATCH 4/7] Update options.h SO_PEERCRED, cont'd. --- src/options.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/options.h b/src/options.h index 41f7337..bf181d7 100644 --- a/src/options.h +++ b/src/options.h @@ -93,6 +93,12 @@ int opt_set_ip6_drop_membersip(lua_State *L, p_socket ps); int opt_set_ip6_v6only(lua_State *L, p_socket ps); int opt_get_ip6_v6only(lua_State *L, p_socket ps); +#ifndef _WIN32 +int opt_set_passcred(lua_State *L, p_socket ps); +int opt_get_passcred(lua_State *L, p_socket ps); +int opt_get_peercred(lua_State *L, p_socket ps); +#endif + int opt_get_error(lua_State *L, p_socket ps); #ifndef _WIN32 From e2540ac22c4fcb2b3864ac0d481ddff8ed35e4ba Mon Sep 17 00:00:00 2001 From: Someguynamedpie Date: Wed, 27 Mar 2019 19:07:17 -0500 Subject: [PATCH 5/7] Update options.c --- src/options.c | 174 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 128 insertions(+), 46 deletions(-) diff --git a/src/options.c b/src/options.c index 688a7e2..f0d8f47 100644 --- a/src/options.c +++ b/src/options.c @@ -2,14 +2,11 @@ * Common option interface * LuaSocket toolkit \*=========================================================================*/ -#include - -#include "lauxlib.h" - +#include "luasocket.h" #include "auxiliar.h" #include "options.h" #include "inet.h" - +#include /*=========================================================================*\ * Internal functions prototypes @@ -37,7 +34,7 @@ int opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps) while (opt->name && strcmp(name, opt->name)) opt++; if (!opt->func) { - char msg[45]; + char msg[57]; sprintf(msg, "unsupported option `%.35s'", name); luaL_argerror(L, 2, msg); } @@ -50,13 +47,14 @@ int opt_meth_getoption(lua_State *L, p_opt opt, p_socket ps) while (opt->name && strcmp(name, opt->name)) opt++; if (!opt->func) { - char msg[45]; + char msg[57]; sprintf(msg, "unsupported option `%.35s'", name); luaL_argerror(L, 2, msg); } return opt->func(L, ps); } +// ------------------------------------------------------- /* enables reuse of local address */ int opt_set_reuseaddr(lua_State *L, p_socket ps) { @@ -68,6 +66,7 @@ int opt_get_reuseaddr(lua_State *L, p_socket ps) return opt_getboolean(L, ps, SOL_SOCKET, SO_REUSEADDR); } +// ------------------------------------------------------- /* enables reuse of local port */ int opt_set_reuseport(lua_State *L, p_socket ps) { @@ -79,7 +78,8 @@ int opt_get_reuseport(lua_State *L, p_socket ps) return opt_getboolean(L, ps, SOL_SOCKET, SO_REUSEPORT); } -/* disables the Naggle algorithm */ +// ------------------------------------------------------- +/* disables the Nagle algorithm */ int opt_set_tcp_nodelay(lua_State *L, p_socket ps) { return opt_setboolean(L, ps, IPPROTO_TCP, TCP_NODELAY); @@ -90,6 +90,52 @@ int opt_get_tcp_nodelay(lua_State *L, p_socket ps) return opt_getboolean(L, ps, IPPROTO_TCP, TCP_NODELAY); } +// ------------------------------------------------------- +#ifdef TCP_KEEPIDLE + +int opt_get_tcp_keepidle(lua_State *L, p_socket ps) +{ + return opt_getint(L, ps, IPPROTO_TCP, TCP_KEEPIDLE); +} + +int opt_set_tcp_keepidle(lua_State *L, p_socket ps) +{ + return opt_setint(L, ps, IPPROTO_TCP, TCP_KEEPIDLE); +} + +#endif + +// ------------------------------------------------------- +#ifdef TCP_KEEPCNT + +int opt_get_tcp_keepcnt(lua_State *L, p_socket ps) +{ + return opt_getint(L, ps, IPPROTO_TCP, TCP_KEEPCNT); +} + +int opt_set_tcp_keepcnt(lua_State *L, p_socket ps) +{ + return opt_setint(L, ps, IPPROTO_TCP, TCP_KEEPCNT); +} + +#endif + +// ------------------------------------------------------- +#ifdef TCP_KEEPINTVL + +int opt_get_tcp_keepintvl(lua_State *L, p_socket ps) +{ + return opt_getint(L, ps, IPPROTO_TCP, TCP_KEEPINTVL); +} + +int opt_set_tcp_keepintvl(lua_State *L, p_socket ps) +{ + return opt_setint(L, ps, IPPROTO_TCP, TCP_KEEPINTVL); +} + +#endif + +// ------------------------------------------------------- int opt_set_keepalive(lua_State *L, p_socket ps) { return opt_setboolean(L, ps, SOL_SOCKET, SO_KEEPALIVE); @@ -100,6 +146,7 @@ int opt_get_keepalive(lua_State *L, p_socket ps) return opt_getboolean(L, ps, SOL_SOCKET, SO_KEEPALIVE); } +// ------------------------------------------------------- int opt_set_dontroute(lua_State *L, p_socket ps) { return opt_setboolean(L, ps, SOL_SOCKET, SO_DONTROUTE); @@ -110,6 +157,7 @@ int opt_get_dontroute(lua_State *L, p_socket ps) return opt_getboolean(L, ps, SOL_SOCKET, SO_DONTROUTE); } +// ------------------------------------------------------- int opt_set_broadcast(lua_State *L, p_socket ps) { return opt_setboolean(L, ps, SOL_SOCKET, SO_BROADCAST); @@ -120,6 +168,29 @@ int opt_get_broadcast(lua_State *L, p_socket ps) return opt_getboolean(L, ps, SOL_SOCKET, SO_BROADCAST); } +// ------------------------------------------------------- +int opt_set_recv_buf_size(lua_State *L, p_socket ps) +{ + return opt_setint(L, ps, SOL_SOCKET, SO_RCVBUF); +} + +int opt_get_recv_buf_size(lua_State *L, p_socket ps) +{ + return opt_getint(L, ps, SOL_SOCKET, SO_RCVBUF); +} + +// ------------------------------------------------------- +int opt_get_send_buf_size(lua_State *L, p_socket ps) +{ + return opt_getint(L, ps, SOL_SOCKET, SO_SNDBUF); +} + +int opt_set_send_buf_size(lua_State *L, p_socket ps) +{ + return opt_setint(L, ps, SOL_SOCKET, SO_SNDBUF); +} + +// ------------------------------------------------------- int opt_set_ip6_unicast_hops(lua_State *L, p_socket ps) { return opt_setint(L, ps, IPPROTO_IPV6, IPV6_UNICAST_HOPS); @@ -130,6 +201,7 @@ int opt_get_ip6_unicast_hops(lua_State *L, p_socket ps) return opt_getint(L, ps, IPPROTO_IPV6, IPV6_UNICAST_HOPS); } +// ------------------------------------------------------- int opt_set_ip6_multicast_hops(lua_State *L, p_socket ps) { return opt_setint(L, ps, IPPROTO_IPV6, IPV6_MULTICAST_HOPS); @@ -140,6 +212,7 @@ int opt_get_ip6_multicast_hops(lua_State *L, p_socket ps) return opt_getint(L, ps, IPPROTO_IPV6, IPV6_MULTICAST_HOPS); } +// ------------------------------------------------------- int opt_set_ip_multicast_loop(lua_State *L, p_socket ps) { return opt_setboolean(L, ps, IPPROTO_IP, IP_MULTICAST_LOOP); @@ -150,6 +223,7 @@ int opt_get_ip_multicast_loop(lua_State *L, p_socket ps) return opt_getboolean(L, ps, IPPROTO_IP, IP_MULTICAST_LOOP); } +// ------------------------------------------------------- int opt_set_ip6_multicast_loop(lua_State *L, p_socket ps) { return opt_setboolean(L, ps, IPPROTO_IPV6, IPV6_MULTICAST_LOOP); @@ -160,6 +234,36 @@ int opt_get_ip6_multicast_loop(lua_State *L, p_socket ps) return opt_getboolean(L, ps, IPPROTO_IPV6, IPV6_MULTICAST_LOOP); } +// ------------------------------------------------------- +#ifndef _WIN32 +int opt_set_passcred(lua_State *L, p_socket ps) +{ + return opt_setboolean(L, ps, SOL_SOCKET, SO_PASSCRED); +} + +int opt_get_passcred(lua_State *L, p_socket ps) +{ + return opt_getboolean(L, ps, SOL_SOCKET, SO_PASSCRED); +} + +int opt_get_peercred(lua_State *L, p_socket ps) +{ + struct ucred cred; + int len = sizeof(cred); + int err = opt_get(L, ps, SOL_SOCKET, SO_PEERCRED, (char *) &cred, &len); + if (err < 0) + return err; + lua_newtable(L); + lua_pushinteger(L, (long) cred.pid); + lua_setfield(L, -2, "pid"); + lua_pushinteger(L, (long) cred.uid); + lua_setfield(L, -2, "uid"); + lua_pushinteger(L, (long) cred.gid); + lua_setfield(L, -2, "gid"); + return 1; +} +#endif +// ------------------------------------------------------- int opt_set_linger(lua_State *L, p_socket ps) { struct linger li; /* obj, name, table */ @@ -192,11 +296,13 @@ int opt_get_linger(lua_State *L, p_socket ps) return 1; } +// ------------------------------------------------------- int opt_set_ip_multicast_ttl(lua_State *L, p_socket ps) { return opt_setint(L, ps, IPPROTO_IP, IP_MULTICAST_TTL); } +// ------------------------------------------------------- int opt_set_ip_multicast_if(lua_State *L, p_socket ps) { const char *address = luaL_checkstring(L, 3); /* obj, name, ip */ @@ -221,6 +327,7 @@ int opt_get_ip_multicast_if(lua_State *L, p_socket ps) return 1; } +// ------------------------------------------------------- int opt_set_ip_add_membership(lua_State *L, p_socket ps) { return opt_setmembership(L, ps, IPPROTO_IP, IP_ADD_MEMBERSHIP); @@ -231,6 +338,7 @@ int opt_set_ip_drop_membersip(lua_State *L, p_socket ps) return opt_setmembership(L, ps, IPPROTO_IP, IP_DROP_MEMBERSHIP); } +// ------------------------------------------------------- int opt_set_ip6_add_membership(lua_State *L, p_socket ps) { return opt_ip6_setmembership(L, ps, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP); @@ -240,7 +348,7 @@ int opt_set_ip6_drop_membersip(lua_State *L, p_socket ps) { return opt_ip6_setmembership(L, ps, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP); } - +// ------------------------------------------------------- int opt_get_ip6_v6only(lua_State *L, p_socket ps) { return opt_getboolean(L, ps, IPPROTO_IPV6, IPV6_V6ONLY); @@ -250,34 +358,21 @@ int opt_set_ip6_v6only(lua_State *L, p_socket ps) { return opt_setboolean(L, ps, IPPROTO_IPV6, IPV6_V6ONLY); } -#ifndef _WIN32 -int opt_set_passcred(lua_State *L, p_socket ps) -{ - return opt_setboolean(L, ps, SOL_SOCKET, SO_PASSCRED); -} -int opt_get_passcred(lua_State *L, p_socket ps) +// ------------------------------------------------------- +int opt_get_error(lua_State *L, p_socket ps) { - return opt_getboolean(L, ps, SOL_SOCKET, SO_PASSCRED); -} - -int opt_get_peercred(lua_State *L, p_socket ps) -{ - struct ucred cred; - int len = sizeof(cred); - int err = opt_get(L, ps, SOL_SOCKET, SO_PEERCRED, (char *) &cred, &len); - if (err < 0) - return err; - lua_newtable(L); - lua_pushinteger(L, (long) cred.pid); - lua_setfield(L, -2, "pid"); - lua_pushinteger(L, (long) cred.uid); - lua_setfield(L, -2, "uid"); - lua_pushinteger(L, (long) cred.gid); - lua_setfield(L, -2, "gid"); + int val = 0; + socklen_t len = sizeof(val); + if (getsockopt(*ps, SOL_SOCKET, SO_ERROR, (char *) &val, &len) < 0) { + lua_pushnil(L); + lua_pushstring(L, "getsockopt failed"); + return 2; + } + lua_pushstring(L, socket_strerror(val)); return 1; } -#endif + /*=========================================================================*\ * Auxiliar functions \*=========================================================================*/ @@ -364,19 +459,6 @@ static int opt_getboolean(lua_State *L, p_socket ps, int level, int name) return 1; } -int opt_get_error(lua_State *L, p_socket ps) -{ - int val = 0; - socklen_t len = sizeof(val); - if (getsockopt(*ps, SOL_SOCKET, SO_ERROR, (char *) &val, &len) < 0) { - lua_pushnil(L); - lua_pushstring(L, "getsockopt failed"); - return 2; - } - lua_pushstring(L, socket_strerror(val)); - return 1; -} - static int opt_setboolean(lua_State *L, p_socket ps, int level, int name) { int val = auxiliar_checkboolean(L, 3); /* obj, name, bool */ From 67c1a1e9d370a029c6f245f76af9a12f21e5ad70 Mon Sep 17 00:00:00 2001 From: Someguynamedpie Date: Wed, 27 Mar 2019 19:08:15 -0500 Subject: [PATCH 6/7] Added predeclaration to setoption --- src/unixstream.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/unixstream.c b/src/unixstream.c index 5044ea3..3fa2fc2 100644 --- a/src/unixstream.c +++ b/src/unixstream.c @@ -25,6 +25,7 @@ static int meth_receive(lua_State *L); static int meth_accept(lua_State *L); static int meth_close(lua_State *L); static int meth_setoption(lua_State *L); +static int meth_getoption(lua_State *L); static int meth_settimeout(lua_State *L); static int meth_getfd(lua_State *L); static int meth_setfd(lua_State *L); From fb67179addf11fd77e14e5e5be80aa1c6a65a8ed Mon Sep 17 00:00:00 2001 From: Someguynamedpie Date: Wed, 27 Mar 2019 19:09:11 -0500 Subject: [PATCH 7/7] _GNU_SOURCE definition for SO_*CRED --- src/makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/makefile b/src/makefile index 5a9ba97..a079dd4 100755 --- a/src/makefile +++ b/src/makefile @@ -173,7 +173,7 @@ SOCKET_macosx=usocket.o SO_linux=so O_linux=o CC_linux=gcc -DEF_linux=-DLUASOCKET_$(DEBUG) +DEF_linux=-DLUASOCKET_$(DEBUG) -D_GNU_SOURCE CFLAGS_linux=$(LUAINC:%=-I%) $(DEF) -Wall -Wshadow -Wextra \ -Wimplicit -O2 -ggdb3 -fpic LDFLAGS_linux=-O -shared -fpic -o