aboutsummaryrefslogtreecommitdiff
path: root/src/socket.lua
diff options
context:
space:
mode:
authorDiego Nehab <diego.nehab@gmail.com>2012-04-23 01:40:31 +0800
committerDiego Nehab <diego.nehab@gmail.com>2012-04-23 01:40:31 +0800
commit1acf8188cd732de4fd5fcdc016eeab501c86a773 (patch)
tree5d773638ae76b0d4d09c32b6f8a2dddc59449f25 /src/socket.lua
parent966642f76abeea579ddcf8da8651244fcf5cbd5a (diff)
downloadluasocket-1acf8188cd732de4fd5fcdc016eeab501c86a773.tar.gz
luasocket-1acf8188cd732de4fd5fcdc016eeab501c86a773.tar.bz2
luasocket-1acf8188cd732de4fd5fcdc016eeab501c86a773.zip
socket.bind also tries all addresses returned by getaddrinfo.
Diffstat (limited to 'src/socket.lua')
-rw-r--r--src/socket.lua36
1 files changed, 23 insertions, 13 deletions
diff --git a/src/socket.lua b/src/socket.lua
index 9035443..8c5f231 100644
--- a/src/socket.lua
+++ b/src/socket.lua
@@ -19,8 +19,8 @@ function connect(address, port, laddress, lport)
19 if address == "*" then address = "0.0.0.0" end 19 if address == "*" then address = "0.0.0.0" end
20 local addrinfo, err = socket.dns.getaddrinfo(address); 20 local addrinfo, err = socket.dns.getaddrinfo(address);
21 if not addrinfo then return nil, err end 21 if not addrinfo then return nil, err end
22 local err = "no info on address"
23 local sock, res 22 local sock, res
23 err = "no info on address"
24 for i, alt in base.ipairs(addrinfo) do 24 for i, alt in base.ipairs(addrinfo) do
25 if alt.family == "inet" then 25 if alt.family == "inet" then
26 sock, err = socket.tcp() 26 sock, err = socket.tcp()
@@ -49,19 +49,29 @@ function bind(host, port, backlog)
49 if host == "*" then host = "0.0.0.0" end 49 if host == "*" then host = "0.0.0.0" end
50 local addrinfo, err = socket.dns.getaddrinfo(host); 50 local addrinfo, err = socket.dns.getaddrinfo(host);
51 if not addrinfo then return nil, err end 51 if not addrinfo then return nil, err end
52 local sock, err; 52 local sock, res
53 if addrinfo[1].family == "inet" then 53 err = "no info on address"
54 sock, err = socket.tcp() 54 for i, alt in base.ipairs(addrinfo) do
55 else 55 if alt.family == "inet" then
56 sock, err = socket.tcp6() 56 sock, err = socket.tcp()
57 else
58 sock, err = socket.tcp6()
59 end
60 if not sock then return nil, err end
61 sock:setoption("reuseaddr", true)
62 res, err = sock:bind(alt.addr, port)
63 if not res then
64 sock:close()
65 else
66 res, err = sock:listen(backlog)
67 if not res then
68 sock:close()
69 else
70 return sock
71 end
72 end
57 end 73 end
58 if not sock then return nil, err end 74 return nil, err
59 sock:setoption("reuseaddr", true)
60 local res, err = sock:bind(host, port)
61 if not res then return nil, err end
62 res, err = sock:listen(backlog)
63 if not res then return nil, err end
64 return sock
65end 75end
66 76
67try = newtry() 77try = newtry()