diff --git a/src/lua/bsdsocket.lua b/src/lua/bsdsocket.lua index 1eb2dea73a3d147a4413f62e3c54277d90a71a22..7795d8d93355cc3fe47d6c8a7e00b3416d210834 100644 --- a/src/lua/bsdsocket.lua +++ b/src/lua/bsdsocket.lua @@ -852,6 +852,22 @@ local function getaddrinfo(host, port, timeout, opts) return internal.getaddrinfo(host, port, timeout, ga_opts) end +local soname_mt = { + __tostring = function(si) + if si.host == nil and si.port == nil then + return '' + end + if si.host == nil then + return sprintf('%s:%s', '0', tostring(si.port)) + end + + if si.port == nil then + return sprintf('%s:%', tostring(si.host), 0) + end + return sprintf('%s:%s', tostring(si.host), tostring(si.port)) + end +} + socket_methods.name = function(self) local aka = internal.name(self.fh) if aka == nil then @@ -859,6 +875,7 @@ socket_methods.name = function(self) return nil end self._errno = nil + setmetatable(aka, soname_mt) return aka end @@ -869,6 +886,7 @@ socket_methods.peer = function(self) return nil end self._errno = nil + setmetatable(peer, soname_mt) return peer end diff --git a/test/box/bsdsocket.result b/test/box/bsdsocket.result index c7a2cc98be12aab92a5156a3962b463a8a7894d1..2bd743400646fa1f37113ac80c07234452c8be02 100644 --- a/test/box/bsdsocket.result +++ b/test/box/bsdsocket.result @@ -642,6 +642,14 @@ json.encode(sc:name()) --- - '{"host":"0.0.0.0","family":"AF_INET","type":"SOCK_STREAM","protocol":"tcp","port":0}' ... +sc:name() +--- +- host: 0.0.0.0 + family: AF_INET + type: SOCK_STREAM + protocol: tcp + port: 0 +... sc:nonblock(true) --- - true diff --git a/test/box/bsdsocket.test.lua b/test/box/bsdsocket.test.lua index a7e6942a7a823d0490b851ef71d8e4760b78542e..8a78cea3edce78e81f6639e0c3bcc80daeefab1e 100644 --- a/test/box/bsdsocket.test.lua +++ b/test/box/bsdsocket.test.lua @@ -205,6 +205,7 @@ json.encode(socket.getaddrinfo('ya.ru', '80', sc = socket('AF_INET', 'SOCK_STREAM', 'tcp') json.encode(sc:name()) +sc:name() sc:nonblock(true) sc:close()