diff --git a/src/box/lua/net_box.lua b/src/box/lua/net_box.lua index e23c4b8a27191b966062ad5728851a949cb308e3..48721f9f08dacfceb25515dad55430111c3cfc8f 100644 --- a/src/box/lua/net_box.lua +++ b/src/box/lua/net_box.lua @@ -646,14 +646,14 @@ local remote_methods = { self.s = socket.tcp_connect(self.host, self.port) if self.s == nil then - self:_fatal(errno.strerror(errno())) + self:_fatal(errno.strerror()) else -- on_connect self:_switch_state('handshake') local greetingbuf = self.s:read(GREETING_SIZE) if greetingbuf == nil then - self:_fatal(errno.strerror(errno())) + self:_fatal(errno.strerror()) elseif #greetingbuf ~= GREETING_SIZE then self:_fatal("Can't read handshake") else @@ -860,7 +860,7 @@ local remote_methods = { self.rbuf:reserve(advance) end elseif errno_is_transient[errno()] ~= true then - self:_fatal(errno.strerror(errno())) + self:_fatal(errno.strerror()) end end end @@ -885,7 +885,7 @@ local remote_methods = { while self.s:writable(1) == 0 and self.state ~= 'closed' do end else - self:_fatal(errno.strerror(errno())) + self:_fatal(errno.strerror()) break end end diff --git a/src/lua/errno.c b/src/lua/errno.c index db1cd74e0598a1704732ccd5334b7c5aadaac2ff..45bc945f43c63ab90442b2a6fd580a119486829d 100644 --- a/src/lua/errno.c +++ b/src/lua/errno.c @@ -295,20 +295,4 @@ tarantool_lua_errno_init(struct lua_State *L) } lua_pop(L, -1); - if (luaL_dostring(L, errno_lua)) - panic("Error loading Lua source (internal)/errno.lua: %s", - lua_tostring(L, -1)); -} - -int -errno_get(void) -{ - return errno; -} - -int -errno_set(int new_errno) -{ - errno = new_errno; - return errno; } diff --git a/src/lua/errno.lua b/src/lua/errno.lua index bda3096052a16adb617cc4bae292e9cbf8245390..db800ce302f64ba90d09c2806e886b090ec0ab0d 100644 --- a/src/lua/errno.lua +++ b/src/lua/errno.lua @@ -1,32 +1,21 @@ --- errno.lua (internal file) - -do - -local ffi = require 'ffi' +local ffi = require('ffi') +local errno_list = require('errno') ffi.cdef[[ char *strerror(int errnum); - int errno_get(); - int errno_set(int new_errno); ]] -local exports = require('errno') -exports.strerror = function(errno) +local function strerror(errno) if errno == nil then - errno = ffi.C.errno_get() + errno = ffi.errno() end return ffi.string(ffi.C.strerror(tonumber(errno))) end -setmetatable(exports, { - __newindex = function() error("Can't create new errno constants") end, - __call = function(self, new_errno) - local res - if new_errno then - return ffi.C.errno_set(new_errno) - end - return ffi.C.errno_get() - end +return setmetatable({ + strerror = strerror +}, { + __index = errno_list, + __newindex = function() error("Can't create new errno constants") end, + __call = function(self, ...) return ffi.errno(...) end }) - -end diff --git a/src/lua/init.c b/src/lua/init.c index dc8d5921a69c11cd1b5b544b22ed1077fd814c47..7ce799b42c2213088fc2b48a0891a1c87c2835a7 100644 --- a/src/lua/init.c +++ b/src/lua/init.c @@ -78,6 +78,7 @@ extern char strict_lua[], digest_lua[], init_lua[], buffer_lua[], + errno_lua[], fiber_lua[], log_lua[], uri_lua[], @@ -105,6 +106,7 @@ static const char *lua_modules[] = { /* Make it first to affect load of all other modules */ "strict", strict_lua, "tarantool", init_lua, + "errno", errno_lua, "fiber", fiber_lua, "buffer", buffer_lua, "msgpackffi", msgpackffi_lua, diff --git a/src/lua/socket.lua b/src/lua/socket.lua index 99452a72b7740e316ad9b551680ecf742ca28720..d6e354d170f5d6438071055784125f650cbe995f 100644 --- a/src/lua/socket.lua +++ b/src/lua/socket.lua @@ -454,7 +454,8 @@ socket_methods.getsockopt = function(self, level, name) else local p = ffi.C.getprotobyname(level) if p == nil then - self._errno = boxerrno(boxerrno.EINVAL) + boxerrno(boxerrno.EINVAL) + self._errno = boxerrno.EINVAL return nil end level = p.p_proto diff --git a/test/app/errno.result b/test/app/errno.result new file mode 100644 index 0000000000000000000000000000000000000000..3063fc9b55f67213e0a58918880b3ae87fcbbcc3 --- /dev/null +++ b/test/app/errno.result @@ -0,0 +1,16 @@ +TAP version 13 +1..1 + # primary + 1..10 + ok - type of table + ok - errno.EINVAL is available + ok - errno.EBADF is available + ok - errno set to 0 + ok - setting errno.EBADF + ok - checking errno.EBADF + ok - setting errno.EINVAL + ok - checking errno.EINVAL + ok - checking strerror without argument + ok - checking strerror with argument + # primary: end +ok - primary diff --git a/test/app/errno.test.lua b/test/app/errno.test.lua new file mode 100755 index 0000000000000000000000000000000000000000..5fd8eaca4a33424e1ca91b0e3a971f05caef693a --- /dev/null +++ b/test/app/errno.test.lua @@ -0,0 +1,21 @@ +#!/usr/bin/env tarantool + +local tap = require('tap') +local errno = require('errno') + +local test = tap.test("errno") + +test:plan(1) +test:test("primary", function(test) + test:plan(10) + test:is(type(errno), "table", "type of table") + test:ok(errno.EINVAL ~= nil, "errno.EINVAL is available") + test:ok(errno.EBADF ~= nil , "errno.EBADF is available" ) + test:ok(errno(0) ~= nil, "errno set to 0") + test:is(errno(errno.EBADF), 0, "setting errno.EBADF") + test:is(errno(), errno.EBADF, "checking errno.EBADF") + test:is(errno(errno.EINVAL), errno.EBADF, "setting errno.EINVAL") + test:is(errno(), errno.EINVAL, "checking errno.EINVAL") + test:is(errno.strerror(), "Invalid argument", "checking strerror without argument") + test:is(errno.strerror(errno.EBADF), "Bad file descriptor", "checking strerror with argument") +end) diff --git a/test/box/errno.result b/test/box/errno.result deleted file mode 100644 index d869d2797bb7784e284805da8b3f0caa76f2e471..0000000000000000000000000000000000000000 --- a/test/box/errno.result +++ /dev/null @@ -1,32 +0,0 @@ -errno = require('errno') ---- -... -type(errno) ---- -- table -... -errno.EINVAL > 0 ---- -- true -... -errno.EBADF > 0 ---- -- true -... -errno(errno.EINVAL) == errno.EINVAL, errno() == errno.EINVAL ---- -- true -- true -... -errno(errno.EBADF) ~= errno.EINVAL, errno() == errno.EBADF ---- -- true -- true -... -errno.strerror(errno.EINVAL) ---- -- Invalid argument -... -errno = nil ---- -... diff --git a/test/box/errno.test.lua b/test/box/errno.test.lua deleted file mode 100644 index fd01789af9c955b7baa4b7fda89d99a9aa86b3f2..0000000000000000000000000000000000000000 --- a/test/box/errno.test.lua +++ /dev/null @@ -1,8 +0,0 @@ -errno = require('errno') -type(errno) -errno.EINVAL > 0 -errno.EBADF > 0 -errno(errno.EINVAL) == errno.EINVAL, errno() == errno.EINVAL -errno(errno.EBADF) ~= errno.EINVAL, errno() == errno.EBADF -errno.strerror(errno.EINVAL) -errno = nil