aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDiego Nehab <diego@tecgraf.puc-rio.br>2004-05-28 07:24:43 +0000
committerDiego Nehab <diego@tecgraf.puc-rio.br>2004-05-28 07:24:43 +0000
commitc98dc991998c724a3f6a1fdd90b5d1d8a80e3af3 (patch)
tree8d8b8aa856d8a3e822121d0915a63b8244f471bb /src
parent9297b074d53a00e1149250e0bbfa0871dcc5558f (diff)
downloadluasocket-c98dc991998c724a3f6a1fdd90b5d1d8a80e3af3.tar.gz
luasocket-c98dc991998c724a3f6a1fdd90b5d1d8a80e3af3.tar.bz2
luasocket-c98dc991998c724a3f6a1fdd90b5d1d8a80e3af3.zip
Bug feioso no UDP e possivelmente no TCP também.
Diffstat (limited to 'src')
-rw-r--r--src/udp.c12
-rw-r--r--src/usocket.c8
-rw-r--r--src/wsocket.c21
3 files changed, 18 insertions, 23 deletions
diff --git a/src/udp.c b/src/udp.c
index a2dff34..19cefe6 100644
--- a/src/udp.c
+++ b/src/udp.c
@@ -109,7 +109,8 @@ static int meth_send(lua_State *L)
109 int err; 109 int err;
110 const char *data = luaL_checklstring(L, 2, &count); 110 const char *data = luaL_checklstring(L, 2, &count);
111 tm_markstart(tm); 111 tm_markstart(tm);
112 err = sock_send(&udp->sock, data, count, &sent, tm_get(tm)); 112 do err = sock_send(&udp->sock, data, count, &sent, tm_getretry(tm));
113 while (err == IO_RETRY);
113 if (err == IO_DONE) lua_pushnumber(L, sent); 114 if (err == IO_DONE) lua_pushnumber(L, sent);
114 else lua_pushnil(L); 115 else lua_pushnil(L);
115 /* a 'closed' error on an unconnected means the target address was not 116 /* a 'closed' error on an unconnected means the target address was not
@@ -137,8 +138,9 @@ static int meth_sendto(lua_State *L)
137 addr.sin_family = AF_INET; 138 addr.sin_family = AF_INET;
138 addr.sin_port = htons(port); 139 addr.sin_port = htons(port);
139 tm_markstart(tm); 140 tm_markstart(tm);
140 err = sock_sendto(&udp->sock, data, count, &sent, 141 do err = sock_sendto(&udp->sock, data, count, &sent,
141 (SA *) &addr, sizeof(addr), tm_get(tm)); 142 (SA *) &addr, sizeof(addr), tm_get(tm));
143 while (err == IO_RETRY);
142 if (err == IO_DONE) lua_pushnumber(L, sent); 144 if (err == IO_DONE) lua_pushnumber(L, sent);
143 else lua_pushnil(L); 145 else lua_pushnil(L);
144 /* a 'closed' error on an unconnected means the target address was not 146 /* a 'closed' error on an unconnected means the target address was not
@@ -159,7 +161,8 @@ static int meth_receive(lua_State *L)
159 p_tm tm = &udp->tm; 161 p_tm tm = &udp->tm;
160 count = MIN(count, sizeof(buffer)); 162 count = MIN(count, sizeof(buffer));
161 tm_markstart(tm); 163 tm_markstart(tm);
162 err = sock_recv(&udp->sock, buffer, count, &got, tm_get(tm)); 164 do err = sock_recv(&udp->sock, buffer, count, &got, tm_get(tm));
165 while (err == IO_RETRY);
163 if (err == IO_DONE) lua_pushlstring(L, buffer, got); 166 if (err == IO_DONE) lua_pushlstring(L, buffer, got);
164 else lua_pushnil(L); 167 else lua_pushnil(L);
165 io_pusherror(L, err); 168 io_pusherror(L, err);
@@ -180,8 +183,9 @@ static int meth_receivefrom(lua_State *L)
180 p_tm tm = &udp->tm; 183 p_tm tm = &udp->tm;
181 tm_markstart(tm); 184 tm_markstart(tm);
182 count = MIN(count, sizeof(buffer)); 185 count = MIN(count, sizeof(buffer));
183 err = sock_recvfrom(&udp->sock, buffer, count, &got, 186 do err = sock_recvfrom(&udp->sock, buffer, count, &got,
184 (SA *) &addr, &addr_len, tm_get(tm)); 187 (SA *) &addr, &addr_len, tm_get(tm));
188 while (err == IO_RETRY);
185 if (err == IO_DONE) { 189 if (err == IO_DONE) {
186 lua_pushlstring(L, buffer, got); 190 lua_pushlstring(L, buffer, got);
187 lua_pushstring(L, inet_ntoa(addr.sin_addr)); 191 lua_pushstring(L, inet_ntoa(addr.sin_addr));
diff --git a/src/usocket.c b/src/usocket.c
index eb1a49a..9e6efd3 100644
--- a/src/usocket.c
+++ b/src/usocket.c
@@ -211,7 +211,7 @@ int sock_send(p_sock ps, const char *data, size_t count, size_t *sent,
211 /* here there was no data before timeout */ 211 /* here there was no data before timeout */
212 else return IO_TIMEOUT; 212 else return IO_TIMEOUT;
213 /* here we didn't send anything, but now we can */ 213 /* here we didn't send anything, but now we can */
214 } else return IO_DONE; 214 } else return IO_RETRY;
215 /* here we successfully sent something */ 215 /* here we successfully sent something */
216 } else { 216 } else {
217 *sent = put; 217 *sent = put;
@@ -239,7 +239,7 @@ int sock_sendto(p_sock ps, const char *data, size_t count, size_t *sent,
239 if (sock_select(sock+1, NULL, &fds, NULL, timeout) <= 0) { 239 if (sock_select(sock+1, NULL, &fds, NULL, timeout) <= 0) {
240 if (errno == EINTR) return IO_RETRY; 240 if (errno == EINTR) return IO_RETRY;
241 else return IO_TIMEOUT; 241 else return IO_TIMEOUT;
242 } else return IO_DONE; 242 } else return IO_RETRY;
243 } else { 243 } else {
244 *sent = put; 244 *sent = put;
245 return IO_DONE; 245 return IO_DONE;
@@ -266,7 +266,7 @@ int sock_recv(p_sock ps, char *data, size_t count, size_t *got, int timeout)
266 ret = sock_select(sock+1, &fds, NULL, NULL, timeout); 266 ret = sock_select(sock+1, &fds, NULL, NULL, timeout);
267 if (ret < 0 && errno == EINTR) return IO_RETRY; 267 if (ret < 0 && errno == EINTR) return IO_RETRY;
268 if (ret == 0) return IO_TIMEOUT; 268 if (ret == 0) return IO_TIMEOUT;
269 else return IO_DONE; 269 return IO_RETRY;
270 } else { 270 } else {
271 *got = taken; 271 *got = taken;
272 return IO_DONE; 272 return IO_DONE;
@@ -294,7 +294,7 @@ int sock_recvfrom(p_sock ps, char *data, size_t count, size_t *got,
294 ret = sock_select(sock+1, &fds, NULL, NULL, timeout); 294 ret = sock_select(sock+1, &fds, NULL, NULL, timeout);
295 if (ret < 0 && errno == EINTR) return IO_RETRY; 295 if (ret < 0 && errno == EINTR) return IO_RETRY;
296 if (ret == 0) return IO_TIMEOUT; 296 if (ret == 0) return IO_TIMEOUT;
297 else return IO_DONE; 297 return IO_RETRY;
298 } else { 298 } else {
299 *got = taken; 299 *got = taken;
300 return IO_DONE; 300 return IO_DONE;
diff --git a/src/wsocket.c b/src/wsocket.c
index af3f8d8..023f470 100644
--- a/src/wsocket.c
+++ b/src/wsocket.c
@@ -207,9 +207,9 @@ int sock_send(p_sock ps, const char *data, size_t count, size_t *sent,
207 FD_ZERO(&fds); 207 FD_ZERO(&fds);
208 FD_SET(sock, &fds); 208 FD_SET(sock, &fds);
209 ret = sock_select(0, NULL, &fds, NULL, timeout); 209 ret = sock_select(0, NULL, &fds, NULL, timeout);
210 /* tell the caller to call us again because there is more data */ 210 /* tell the caller to call us again because now we can send */
211 if (ret > 0) return IO_DONE; 211 if (ret > 0) return IO_RETRY;
212 /* tell the caller there was no data before timeout */ 212 /* tell the caller we can't send anything before timint out */
213 else return IO_TIMEOUT; 213 else return IO_TIMEOUT;
214 /* here we know the connection has been closed */ 214 /* here we know the connection has been closed */
215 } else return IO_CLOSED; 215 } else return IO_CLOSED;
@@ -229,27 +229,18 @@ int sock_sendto(p_sock ps, const char *data, size_t count, size_t *sent,
229 t_sock sock = *ps; 229 t_sock sock = *ps;
230 int put; 230 int put;
231 int ret; 231 int ret;
232 /* avoid making system calls on closed sockets */
233 if (sock == SOCK_INVALID) return IO_CLOSED; 232 if (sock == SOCK_INVALID) return IO_CLOSED;
234 /* try to send something */
235 put = sendto(sock, data, (int) count, 0, addr, addr_len); 233 put = sendto(sock, data, (int) count, 0, addr, addr_len);
236 /* deal with failure */
237 if (put <= 0) { 234 if (put <= 0) {
238 /* in any case, nothing has been sent */
239 *sent = 0; 235 *sent = 0;
240 /* run select to avoid busy wait */
241 if (WSAGetLastError() == WSAEWOULDBLOCK) { 236 if (WSAGetLastError() == WSAEWOULDBLOCK) {
242 fd_set fds; 237 fd_set fds;
243 FD_ZERO(&fds); 238 FD_ZERO(&fds);
244 FD_SET(sock, &fds); 239 FD_SET(sock, &fds);
245 ret = sock_select(0, NULL, &fds, NULL, timeout); 240 ret = sock_select(0, NULL, &fds, NULL, timeout);
246 /* tell the caller to call us again because there is more data */ 241 if (ret > 0) return IO_RETRY;
247 if (ret > 0) return IO_DONE;
248 /* tell the caller there was no data before timeout */
249 else return IO_TIMEOUT; 242 else return IO_TIMEOUT;
250 /* here we know the connection has been closed */
251 } else return IO_CLOSED; 243 } else return IO_CLOSED;
252 /* here we successfully sent something */
253 } else { 244 } else {
254 *sent = put; 245 *sent = put;
255 return IO_DONE; 246 return IO_DONE;
@@ -273,7 +264,7 @@ int sock_recv(p_sock ps, char *data, size_t count, size_t *got, int timeout)
273 FD_ZERO(&fds); 264 FD_ZERO(&fds);
274 FD_SET(sock, &fds); 265 FD_SET(sock, &fds);
275 ret = sock_select(0, &fds, NULL, NULL, timeout); 266 ret = sock_select(0, &fds, NULL, NULL, timeout);
276 if (ret > 0) return IO_DONE; 267 if (ret > 0) return IO_RETRY;
277 else return IO_TIMEOUT; 268 else return IO_TIMEOUT;
278 } else { 269 } else {
279 *got = taken; 270 *got = taken;
@@ -299,7 +290,7 @@ int sock_recvfrom(p_sock ps, char *data, size_t count, size_t *got,
299 FD_ZERO(&fds); 290 FD_ZERO(&fds);
300 FD_SET(sock, &fds); 291 FD_SET(sock, &fds);
301 ret = sock_select(0, &fds, NULL, NULL, timeout); 292 ret = sock_select(0, &fds, NULL, NULL, timeout);
302 if (ret > 0) return IO_DONE; 293 if (ret > 0) return IO_RETRY;
303 else return IO_TIMEOUT; 294 else return IO_TIMEOUT;
304 } else { 295 } else {
305 *got = taken; 296 *got = taken;