From b19b9ca4cae27d1f98e4e17d874e8c58dd1bd6e9 Mon Sep 17 00:00:00 2001 From: Roman Tsisyk <roman@tsisyk.com> Date: Thu, 4 Sep 2014 12:59:13 +0400 Subject: [PATCH] Remove broken struct sockaddr definition from FFI Fixes compatibility with third-party modules. --- src/lua/bsdsocket.lua | 16 ++++++---------- test/box/bsdsocket.result | 2 +- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/lua/bsdsocket.lua b/src/lua/bsdsocket.lua index d0b0d1f79d..70448d3613 100644 --- a/src/lua/bsdsocket.lua +++ b/src/lua/bsdsocket.lua @@ -48,12 +48,6 @@ ffi.cdef[[ struct protoent *getprotobyname(const char *name); ]] -ffi.cdef([[ -struct sockaddr { - char _data[256]; /* enough to fit any address */ -}; -]]); - local function sprintf(fmt, ...) return string.format(fmt, ...) end @@ -133,7 +127,9 @@ socket_methods.error = function(self) end end -local addr = ffi.new('struct sockaddr') +-- addrbuf is equivalent to struct sockaddr_storage +local addrbuf = ffi.new('char[128]') -- enough to fit any address +local addr = ffi.cast('struct sockaddr *', addrbuf) local addr_len = ffi.new('socklen_t[1]') socket_methods.sysconnect = function(self, host, port) local fd = check_socket(self) @@ -142,7 +138,7 @@ socket_methods.sysconnect = function(self, host, port) host = tostring(host) port = tostring(port) - addr_len[0] = ffi.sizeof(addr) + addr_len[0] = ffi.sizeof(addrbuf) local res = ffi.C.bsdsocket_local_resolve(host, port, addr, addr_len) if res == 0 then res = ffi.C.connect(fd, addr, addr_len[0]); @@ -274,7 +270,7 @@ socket_methods.bind = function(self, host, port) host = tostring(host) port = tostring(port) - addr_len[0] = ffi.sizeof(addr) + addr_len[0] = ffi.sizeof(addrbuf) local res = ffi.C.bsdsocket_local_resolve(host, port, addr, addr_len) if res == 0 then res = ffi.C.bind(fd, addr, addr_len[0]); @@ -760,7 +756,7 @@ socket_methods.sendto = function(self, host, port, octets, flags) port = tostring(port) octets = tostring(octets) - addr_len[0] = ffi.sizeof(addr) + addr_len[0] = ffi.sizeof(addrbuf) local res = ffi.C.bsdsocket_local_resolve(host, port, addr, addr_len) if res == 0 then res = ffi.C.sendto(fd, octets, string.len(octets), iflags, diff --git a/test/box/bsdsocket.result b/test/box/bsdsocket.result index 8242bbbf89..01203a99fd 100644 --- a/test/box/bsdsocket.result +++ b/test/box/bsdsocket.result @@ -222,7 +222,7 @@ lua s:getsockopt('SOL_SOCKET', 'SO_DEBUG') ... lua s:setsockopt('SOL_SOCKET', 'SO_ACCEPTCONN', 1) --- -error: '[string "-- bsdsocket.lua (internal file)..."]:345: Socket option SO_ACCEPTCONN is read only' +error: '[string "-- bsdsocket.lua (internal file)..."]:341: Socket option SO_ACCEPTCONN is read only' ... lua s:getsockopt('SOL_SOCKET', 'SO_RCVBUF') > 32 --- -- GitLab