diff --git a/doc/sphinx/reference/socket.rst b/doc/sphinx/reference/socket.rst index 9ad7f28849959233df2b3b048b6e982dd3b4d47f..6d7ce57a5747f9e36e90123c0690ab2f37284065 100644 --- a/doc/sphinx/reference/socket.rst +++ b/doc/sphinx/reference/socket.rst @@ -336,7 +336,6 @@ the function invocations will look like ``sock:function_name(...)``. * SO_ACCEPTCONN * SO_BINDTODEVICE * SO_BROADCAST - * SO_BSDCOMPAT * SO_DEBUG * SO_DOMAIN * SO_ERROR diff --git a/src/lua/bsdsocket.cc b/src/lua/bsdsocket.cc index 75c9fa4b7b56af7050263dd95040e2595c62bae3..db5a6866e390ab1a1838952e57d05ad352b02010 100644 --- a/src/lua/bsdsocket.cc +++ b/src/lua/bsdsocket.cc @@ -186,9 +186,6 @@ static const struct { char name[32]; int value, type, rw; } so_opts[] = { #ifdef SO_BROADCAST {"SO_BROADCAST", SO_BROADCAST, 1, 1, }, #endif -#ifdef SO_BSDCOMPAT - {"SO_BSDCOMPAT", SO_BSDCOMPAT, 1, 1, }, -#endif #ifdef SO_DEBUG {"SO_DEBUG", SO_DEBUG, 1, 1, }, #endif @@ -254,15 +251,9 @@ static const struct { char name[32]; int value, type, rw; } so_opts[] = { #endif #ifdef SO_PROTOCOL {"SO_PROTOCOL", SO_PROTOCOL, 1, 0, }, -#else -#define SO_PROTOCOL 38 #endif -#ifdef SO_TYPE {"SO_TYPE", SO_TYPE, 1, 0, }, -#else -#define SO_TYPE 3 -#endif {"", 0, 0, 0, } }; @@ -721,68 +712,66 @@ lbox_bsdsocket_getaddrinfo(struct lua_State *L) return 1; } -static void -lbox_bsdsocket_update_proto_type(struct lua_State *L, int fh) -{ - if (lua_isnil(L, -1)) - return; - - int save_errno = errno; - - int value; - socklen_t len = sizeof(value); - - if (getsockopt(fh, SOL_SOCKET, SO_PROTOCOL, &value, &len) == 0) { - lua_pushliteral(L, "protocol"); - lbox_bsdsocket_push_protocol(L, value); - lua_rawset(L, -3); - } - - len = sizeof(value); - if (getsockopt(fh, SOL_SOCKET, SO_TYPE, &value, &len) == 0) { - lua_pushliteral(L, "type"); - lbox_bsdsocket_push_sotype(L, value); - lua_rawset(L, -3); - } - errno = save_errno; - -} - static int -lbox_bsdsocket_soname(struct lua_State *L) +lbox_bsdsocket_name(struct lua_State *L, + int (*getname_func) (int, struct sockaddr *, socklen_t *)) { lua_pushvalue(L, 1); int fh = lua_tointeger(L, -1); lua_pop(L, 1); - struct sockaddr_storage addr; socklen_t len = sizeof(addr); - if (getsockname(fh, (struct sockaddr *)&addr, &len) != 0) { + if (getname_func(fh, (struct sockaddr *)&addr, &len) != 0) { lua_pushnil(L); return 1; } lbox_bsdsocket_push_addr(L, (const struct sockaddr *)&addr, len); - lbox_bsdsocket_update_proto_type(L, fh); + if (lua_isnil(L, -1)) + return 1; + + int type; + len = sizeof(type); + if (getsockopt(fh, SOL_SOCKET, SO_TYPE, &type, &len) == 0) { + lua_pushliteral(L, "type"); + lbox_bsdsocket_push_sotype(L, type); + lua_rawset(L, -3); + } else { + type = -1; + } + + int protocol = 0; +#ifdef SO_PROTOCOL + len = sizeof(protocol); + if (getsockopt(fh, SOL_SOCKET, SO_PROTOCOL, &protocol, &len) == 0) { + lua_pushliteral(L, "protocol"); + lbox_bsdsocket_push_protocol(L, protocol); + lua_rawset(L, -3); + } +#else + if (addr.ss_family == AF_INET || addr.ss_family == AF_INET6) { + if (type == SOCK_STREAM) + protocol = IPPROTO_TCP; + if (type == SOCK_DGRAM) + protocol = IPPROTO_UDP; + } + lua_pushliteral(L, "protocol"); + lbox_bsdsocket_push_protocol(L, protocol); + lua_rawset(L, -3); +#endif return 1; } static int -lbox_bsdsocket_peername(struct lua_State *L) +lbox_bsdsocket_soname(struct lua_State *L) { - lua_pushvalue(L, 1); - int fh = lua_tointeger(L, -1); - lua_pop(L, 1); + return lbox_bsdsocket_name(L, getsockname); +} - struct sockaddr_storage addr; - socklen_t len = sizeof(addr); - if (getpeername(fh, (struct sockaddr *)&addr, &len) != 0) { - lua_pushnil(L); - return 1; - } - lbox_bsdsocket_push_addr(L, (const struct sockaddr *)&addr, len); - lbox_bsdsocket_update_proto_type(L, fh); - return 1; +static int +lbox_bsdsocket_peername(struct lua_State *L) +{ + return lbox_bsdsocket_name(L, getpeername); } static int diff --git a/test/box/bsdsocket.result b/test/box/bsdsocket.result index 9491d7b2a8d9acdce4ff3ebffd57b640ff51ee60..1e2f905354f43363164f67f8715e1deb50034bbc 100644 --- a/test/box/bsdsocket.result +++ b/test/box/bsdsocket.result @@ -39,22 +39,10 @@ socket('PF_INET', 'SOCK_STREAM', 'tcp121222'); s = socket('PF_INET', 'SOCK_STREAM', 'tcp') --- ... -s:wait(.01) ---- -- RW -... type(s) --- - table ... -s:errno() ---- -- 0 -... -type(s:error()) ---- -- nil -... -- Invalid arguments --# setopt delimiter ';' for k in pairs(getmetatable(s).__index) do @@ -270,10 +258,6 @@ s:error() --- - null ... -s:setsockopt('SOL_SOCKET', 'SO_BSDCOMPAT', false) ---- -- true -... s:setsockopt('SOL_SOCKET', 'SO_DEBUG', false) --- - true @@ -319,10 +303,6 @@ s:linger() - false - 1 ... -s:shutdown('R') ---- -- true -... s:close() --- - true @@ -345,14 +325,6 @@ s:listen(128) sc = socket('PF_INET', 'SOCK_STREAM', 'tcp') --- ... -sc:writable() ---- -- true -... -sc:readable() ---- -- true -... sc:sysconnect('127.0.0.1', 3457) or errno() == errno.EINPROGRESS --- - true @@ -631,10 +603,6 @@ sc:nonblock(true) --- - true ... -sc:readable() ---- -- true -... sc:sysconnect('127.0.0.1', 3458) or errno() == errno.EINPROGRESS --- - true @@ -859,11 +827,6 @@ s:bind('127.0.0.1', port) --- - true ... -socket.tcp_connect('127.0.0.1', port), errno() == errno.ECONNREFUSED ---- -- null -- true -... s:listen() --- - true @@ -1484,14 +1447,6 @@ os.remove(path) s = socket('AF_UNIX', 'SOCK_STREAM', 0) --- ... -x = s:wait() ---- -... --- waiters is map -s.waiters ---- -- {} -... -- check __serialize hook json.decode(json.encode(s)).fd == s:fd() --- diff --git a/test/box/bsdsocket.test.lua b/test/box/bsdsocket.test.lua index 6fd56f1e99b7979434ab3f1f077eae93a51ac7e9..1a431295f0d67dc9bbcfaa495acf2de5f892e867 100644 --- a/test/box/bsdsocket.test.lua +++ b/test/box/bsdsocket.test.lua @@ -13,10 +13,7 @@ type(socket) socket('PF_INET', 'SOCK_STREAM', 'tcp121222'); s = socket('PF_INET', 'SOCK_STREAM', 'tcp') -s:wait(.01) type(s) -s:errno() -type(s:error()) -- Invalid arguments --# setopt delimiter ';' for k in pairs(getmetatable(s).__index) do @@ -89,7 +86,6 @@ sevres[1].host s:setsockopt('SOL_SOCKET', 'SO_BROADCAST', false) s:getsockopt('SOL_SOCKET', 'SO_TYPE') s:error() -s:setsockopt('SOL_SOCKET', 'SO_BSDCOMPAT', false) s:setsockopt('SOL_SOCKET', 'SO_DEBUG', false) s:getsockopt('SOL_SOCKET', 'SO_DEBUG') s:setsockopt('SOL_SOCKET', 'SO_ACCEPTCONN', 1) @@ -101,7 +97,6 @@ s:linger(true, 1) s:linger() s:linger(false, 1) s:linger() -s:shutdown('R') s:close() s = socket('PF_INET', 'SOCK_STREAM', 'tcp') @@ -111,8 +106,6 @@ s:listen(128) sc = socket('PF_INET', 'SOCK_STREAM', 'tcp') -sc:writable() -sc:readable() sc:sysconnect('127.0.0.1', 3457) or errno() == errno.EINPROGRESS sc:writable(10) sc:write('Hello, world') @@ -208,7 +201,6 @@ sc = socket('PF_INET', 'SOCK_STREAM', 'tcp') sc ~= nil sc:getsockopt('SOL_SOCKET', 'SO_ERROR') sc:nonblock(true) -sc:readable() sc:sysconnect('127.0.0.1', 3458) or errno() == errno.EINPROGRESS string.match(tostring(sc), ', peer') == nil sc:writable() @@ -279,7 +271,6 @@ socket.tcp_connect('127.0.0.1', 80, 0.00000000001) port = 35490 s = socket('AF_INET', 'SOCK_STREAM', 'tcp') s:bind('127.0.0.1', port) -socket.tcp_connect('127.0.0.1', port), errno() == errno.ECONNREFUSED s:listen() sc, e = socket.tcp_connect('127.0.0.1', port), errno() sc ~= nil @@ -503,9 +494,6 @@ os.remove(path) -- Test serializers with sockets s = socket('AF_UNIX', 'SOCK_STREAM', 0) -x = s:wait() --- waiters is map -s.waiters -- check __serialize hook json.decode(json.encode(s)).fd == s:fd() yaml.decode(yaml.encode(s)).fd == s:fd()