moonbridge
diff moonbridge_io.c @ 99:c9ffbdac1337
New function moonbridge_io.tcpconnect_nb(...) for nonblocking connects
author | jbe |
---|---|
date | Wed Apr 08 04:22:03 2015 +0200 (2015-04-08) |
parents | acaa85256c4b |
children | df1ab25c6513 |
line diff
1.1 --- a/moonbridge_io.c Wed Apr 08 04:00:41 2015 +0200 1.2 +++ b/moonbridge_io.c Wed Apr 08 04:22:03 2015 +0200 1.3 @@ -484,7 +484,7 @@ 1.4 return 0; 1.5 } 1.6 1.7 -int moonbr_io_tcpconnect(lua_State *L) { 1.8 +static int moonbr_io_tcpconnect_impl(lua_State *L, int nonblocking) { 1.9 const char *host, *port; 1.10 struct addrinfo hints = { 0, }; 1.11 struct addrinfo *res, *addrinfo; 1.12 @@ -516,22 +516,42 @@ 1.13 } 1.14 addrinfo = res; 1.15 moonbr_io_tcpconnect_found: 1.16 - sock = socket(addrinfo->ai_family, addrinfo->ai_socktype, addrinfo->ai_protocol); 1.17 + sock = socket( 1.18 + addrinfo->ai_family, 1.19 + addrinfo->ai_socktype | SOCK_CLOEXEC | (nonblocking ? SOCK_NONBLOCK : 0), 1.20 + addrinfo->ai_protocol 1.21 + ); 1.22 if (sock < 0) { 1.23 moonbr_io_errmsg(); 1.24 lua_pushnil(L); 1.25 lua_pushstring(L, errmsg); 1.26 } 1.27 if (connect(sock, addrinfo->ai_addr, addrinfo->ai_addrlen)) { 1.28 - moonbr_io_errmsg(); 1.29 - lua_pushnil(L); 1.30 - lua_pushstring(L, errmsg); 1.31 - return 2; 1.32 + if (!nonblocking && errno == EINTR) { 1.33 + moonbr_io_errmsg(); 1.34 + close(sock); 1.35 + lua_pushnil(L); 1.36 + lua_pushstring(L, errmsg); 1.37 + return 2; 1.38 + } else if (!(nonblocking && (errno == EINPROGRESS || errno == EINTR))) { 1.39 + moonbr_io_errmsg(); 1.40 + lua_pushnil(L); 1.41 + lua_pushstring(L, errmsg); 1.42 + return 2; 1.43 + } 1.44 } 1.45 moonbr_io_pushhandle(L, sock, 1); 1.46 return 1; 1.47 } 1.48 1.49 +static int moonbr_io_tcpconnect(lua_State *L) { 1.50 + return moonbr_io_tcpconnect_impl(L, 0); 1.51 +} 1.52 + 1.53 +static int moonbr_io_tcpconnect_nb(lua_State *L) { 1.54 + return moonbr_io_tcpconnect_impl(L, 1); 1.55 +} 1.56 + 1.57 static const struct luaL_Reg moonbr_io_handle_methods[] = { 1.58 {"read", moonbr_io_read}, 1.59 {"read_nb", moonbr_io_read_nb}, 1.60 @@ -556,6 +576,7 @@ 1.61 1.62 static const struct luaL_Reg moonbr_io_module_funcs[] = { 1.63 {"tcpconnect", moonbr_io_tcpconnect}, 1.64 + {"tcpconnect_nb", moonbr_io_tcpconnect_nb}, 1.65 {NULL, NULL} 1.66 }; 1.67