aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDiego Nehab <diego@tecgraf.puc-rio.br>2001-06-04 20:44:39 +0000
committerDiego Nehab <diego@tecgraf.puc-rio.br>2001-06-04 20:44:39 +0000
commit791c9f3168fc1bf86eb1c6b70393a5391de56439 (patch)
tree73719c5d20a99bea17459adf2212795d02d085d7 /src
parentf1ae9db45e692d9b143fc0eefb36b9ad2fe32f69 (diff)
downloadluasocket-791c9f3168fc1bf86eb1c6b70393a5391de56439.tar.gz
luasocket-791c9f3168fc1bf86eb1c6b70393a5391de56439.tar.bz2
luasocket-791c9f3168fc1bf86eb1c6b70393a5391de56439.zip
Select was also crashing on non-table parameters.
Changed time to _time and sleep to _sleep to avoid name clashes.
Diffstat (limited to 'src')
-rw-r--r--src/luasocket.c40
1 files changed, 26 insertions, 14 deletions
diff --git a/src/luasocket.c b/src/luasocket.c
index f144fce..9abfa09 100644
--- a/src/luasocket.c
+++ b/src/luasocket.c
@@ -316,12 +316,14 @@ static int global_udpsocket(lua_State *L)
316 int top = lua_gettop(L); 316 int top = lua_gettop(L);
317 p_sock sock = push_udptable(L, tags); 317 p_sock sock = push_udptable(L, tags);
318 if (!sock) return 2; 318 if (!sock) return 2;
319 if (top >= 1 && lua_istable(L, 1)) { 319 if (top >= 1 ) {
320 lua_pushnil(L); 320 if (lua_istable(L, 1)) {
321 while (lua_next(L, 1)) { 321 lua_pushnil(L);
322 if (!set_option(L, sock)) lua_error(L, "invalid socket option"); 322 while (lua_next(L, 1)) {
323 lua_pop(L, 1); 323 if (!set_option(L, sock)) lua_error(L, "error setting option");
324 } 324 lua_pop(L, 1);
325 }
326 } else luaL_argerror(L, 1, "invalid options");
325 } 327 }
326 return 1; 328 return 1;
327} 329}
@@ -590,7 +592,7 @@ int global_select(lua_State *L)
590 /* writable sockets table to be returned */ 592 /* writable sockets table to be returned */
591 lua_newtable(L); canwrite = lua_gettop(L); 593 lua_newtable(L); canwrite = lua_gettop(L);
592 /* get sockets we will test for readability into fd_set */ 594 /* get sockets we will test for readability into fd_set */
593 if (!lua_isnil(L, 1)) { 595 if (lua_istable(L, 1)) {
594 lua_pushnil(L); 596 lua_pushnil(L);
595 while (lua_next(L, 1)) { 597 while (lua_next(L, 1)) {
596 if (lua_tag(L, -1) == tags->table) { /* skip strange fields */ 598 if (lua_tag(L, -1) == tags->table) { /* skip strange fields */
@@ -620,7 +622,7 @@ int global_select(lua_State *L)
620 } 622 }
621 } 623 }
622 /* get sockets we will test for writability into fd_set */ 624 /* get sockets we will test for writability into fd_set */
623 if (!lua_isnil(L, 2)) { 625 if (lua_istable(L, 2)) {
624 lua_pushnil(L); 626 lua_pushnil(L);
625 while (lua_next(L, 2)) { 627 while (lua_next(L, 2)) {
626 if (lua_tag(L, -1) == tags->table) { /* skip strange fields */ 628 if (lua_tag(L, -1) == tags->table) { /* skip strange fields */
@@ -1070,23 +1072,31 @@ static int set_option(lua_State *L, p_sock sock)
1070 static const char *const optionnames[] = { 1072 static const char *const optionnames[] = {
1071 "SO_KEEPALIVE", "SO_DONTROUTE", "SO_BROADCAST", "SO_LINGER", NULL 1073 "SO_KEEPALIVE", "SO_DONTROUTE", "SO_BROADCAST", "SO_LINGER", NULL
1072 }; 1074 };
1073 const char *option = lua_tostring(L, -2); 1075 const char *option;
1074 int err; 1076 int err;
1077 if (!lua_isstring(L, -2)) return 0;
1078 option = lua_tostring(L, -2);
1075 switch (luaL_findstring(option, optionnames)) { 1079 switch (luaL_findstring(option, optionnames)) {
1076 case 0: { 1080 case 0: {
1077 int bool = (int) lua_tonumber(L, -1); 1081 int bool;
1082 if (!lua_isnumber(L, -1)) return 0;
1083 bool = (int) lua_tonumber(L, -1);
1078 err = setsockopt(sock->sock, SOL_SOCKET, SO_KEEPALIVE, &bool, 1084 err = setsockopt(sock->sock, SOL_SOCKET, SO_KEEPALIVE, &bool,
1079 sizeof(bool)); 1085 sizeof(bool));
1080 return err >= 0; 1086 return err >= 0;
1081 } 1087 }
1082 case 1: { 1088 case 1: {
1083 int bool = (int) lua_tonumber(L, -1); 1089 int bool;
1090 if (!lua_isnumber(L, -1)) return 0;
1091 bool = (int) lua_tonumber(L, -1);
1084 err = setsockopt(sock->sock, SOL_SOCKET, SO_DONTROUTE, &bool, 1092 err = setsockopt(sock->sock, SOL_SOCKET, SO_DONTROUTE, &bool,
1085 sizeof(bool)); 1093 sizeof(bool));
1086 return err >= 0; 1094 return err >= 0;
1087 } 1095 }
1088 case 2: { 1096 case 2: {
1089 int bool = (int) lua_tonumber(L, -1); 1097 int bool;
1098 if (!lua_isnumber(L, -1)) return 0;
1099 bool = (int) lua_tonumber(L, -1);
1090 err = setsockopt(sock->sock, SOL_SOCKET, SO_BROADCAST, &bool, 1100 err = setsockopt(sock->sock, SOL_SOCKET, SO_BROADCAST, &bool,
1091 sizeof(bool)); 1101 sizeof(bool));
1092 return err >= 0; 1102 return err >= 0;
@@ -1096,10 +1106,12 @@ static int set_option(lua_State *L, p_sock sock)
1096 if (!lua_istable(L, -1)) return 0; 1106 if (!lua_istable(L, -1)) return 0;
1097 lua_pushstring(L, "l_onoff"); 1107 lua_pushstring(L, "l_onoff");
1098 lua_gettable(L, -2); 1108 lua_gettable(L, -2);
1109 if (!lua_isnumber(L, -1)) return 0;
1099 linger.l_onoff = lua_tonumber(L, -1); 1110 linger.l_onoff = lua_tonumber(L, -1);
1100 lua_pop(L, 1); 1111 lua_pop(L, 1);
1101 lua_pushstring(L, "l_linger"); 1112 lua_pushstring(L, "l_linger");
1102 lua_gettable(L, -2); 1113 lua_gettable(L, -2);
1114 if (!lua_isnumber(L, -1)) return 0;
1103 linger.l_linger = lua_tonumber(L, -1); 1115 linger.l_linger = lua_tonumber(L, -1);
1104 lua_pop(L, 1); 1116 lua_pop(L, 1);
1105 err = setsockopt(sock->sock, SOL_SOCKET, SO_LINGER, &linger, 1117 err = setsockopt(sock->sock, SOL_SOCKET, SO_LINGER, &linger,
@@ -1678,8 +1690,8 @@ void lua_socketlibopen(lua_State *L)
1678#endif 1690#endif
1679#ifdef _DEBUG 1691#ifdef _DEBUG
1680 /* test support functions */ 1692 /* test support functions */
1681 lua_pushcfunction(L, global_sleep); lua_setglobal(L, "sleep"); 1693 lua_pushcfunction(L, global_sleep); lua_setglobal(L, "_sleep");
1682 lua_pushcfunction(L, global_time); lua_setglobal(L, "time"); 1694 lua_pushcfunction(L, global_time); lua_setglobal(L, "_time");
1683#endif 1695#endif
1684#ifndef LUASOCKET_NOGLOBALS 1696#ifndef LUASOCKET_NOGLOBALS
1685 { 1697 {