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