aboutsummaryrefslogtreecommitdiff
path: root/src/tcp.c
diff options
context:
space:
mode:
authorDiego Nehab <diego@impa.br>2012-08-23 19:31:15 -0300
committerDiego Nehab <diego@impa.br>2012-08-23 19:31:15 -0300
commit6368caeb5ab5f628b8021c8ebf4d6df436162aaf (patch)
tree2a2005f2e27ee81e8ced7e4fc84098728e106af0 /src/tcp.c
parent03ba06f70c9ad5cdc9b49d816490fc28d6dbbdc5 (diff)
downloadluasocket-6368caeb5ab5f628b8021c8ebf4d6df436162aaf.tar.gz
luasocket-6368caeb5ab5f628b8021c8ebf4d6df436162aaf.tar.bz2
luasocket-6368caeb5ab5f628b8021c8ebf4d6df436162aaf.zip
Fix udp:setpeername("*")
There seems to be a curious difference between MacOS and Linux and I am not sure if this is documented. When you break a "connection" on Mac OS, you only eliminate the peer association, but the local address remains bound. On Linux, breaking a "connection" eliminates the binding to the local address. Have you guys ever come accross this? Another irritating difference is that connect() returns the error EAFNOSUPPORT on Mac OS. I am going to ignore all errors when the reason for calling connect() is simply to break the "connection".
Diffstat (limited to 'src/tcp.c')
-rw-r--r--src/tcp.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/tcp.c b/src/tcp.c
index 2085937..5c85ae0 100644
--- a/src/tcp.c
+++ b/src/tcp.c
@@ -222,6 +222,7 @@ static int meth_bind(lua_State *L)
222 bindhints.ai_socktype = SOCK_STREAM; 222 bindhints.ai_socktype = SOCK_STREAM;
223 bindhints.ai_family = tcp->family; 223 bindhints.ai_family = tcp->family;
224 bindhints.ai_flags = AI_PASSIVE; 224 bindhints.ai_flags = AI_PASSIVE;
225 address = strcmp(address, "*")? address: NULL;
225 err = inet_trybind(&tcp->sock, address, port, &bindhints); 226 err = inet_trybind(&tcp->sock, address, port, &bindhints);
226 if (err) { 227 if (err) {
227 lua_pushnil(L); 228 lua_pushnil(L);
@@ -247,8 +248,7 @@ static int meth_connect(lua_State *L)
247 /* make sure we try to connect only to the same family */ 248 /* make sure we try to connect only to the same family */
248 connecthints.ai_family = tcp->family; 249 connecthints.ai_family = tcp->family;
249 timeout_markstart(&tcp->tm); 250 timeout_markstart(&tcp->tm);
250 err = inet_tryconnect(&tcp->sock, address, port, 251 err = inet_tryconnect(&tcp->sock, address, port, &tcp->tm, &connecthints);
251 &tcp->tm, &connecthints);
252 /* have to set the class even if it failed due to non-blocking connects */ 252 /* have to set the class even if it failed due to non-blocking connects */
253 auxiliar_setclass(L, "tcp{client}", 1); 253 auxiliar_setclass(L, "tcp{client}", 1);
254 if (err) { 254 if (err) {