From c98dc991998c724a3f6a1fdd90b5d1d8a80e3af3 Mon Sep 17 00:00:00 2001 From: Diego Nehab Date: Fri, 28 May 2004 07:24:43 +0000 Subject: [PATCH] =?UTF-8?q?Bug=20feioso=20no=20UDP=20e=20possivelmente=20n?= =?UTF-8?q?o=20TCP=20tamb=C3=A9m.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- etc/b64.lua | 4 ++-- etc/check-links.lua | 4 ++++ etc/dict.lua | 4 +++- etc/qp.lua | 4 +++- samples/cddb.lua | 3 +++ samples/daytimeclnt.lua | 1 + samples/echoclnt.lua | 15 ++++++--------- samples/echosrvr.lua | 21 ++++++++++----------- src/udp.c | 12 ++++++++---- src/usocket.c | 8 ++++---- src/wsocket.c | 21 ++++++--------------- test/mimetest.lua | 6 +++++- test/testclnt.lua | 2 ++ test/testsrvr.lua | 4 ++-- 14 files changed, 59 insertions(+), 50 deletions(-) diff --git a/etc/b64.lua b/etc/b64.lua index 1993b01..b86b870 100644 --- a/etc/b64.lua +++ b/etc/b64.lua @@ -10,5 +10,5 @@ else local wrap = mime.wrap() convert = ltn12.filter.chain(base64, wrap) end -source = ltn12.source.chain(source, convert) -repeat until not ltn12.pump(source, sink) +sink = ltn12.sink.chain(convert, sink) +ltn12.pump.all(source, sink) diff --git a/etc/check-links.lua b/etc/check-links.lua index 03ca6de..c200dfb 100644 --- a/etc/check-links.lua +++ b/etc/check-links.lua @@ -4,6 +4,10 @@ -- Author: Diego Nehab -- RCS ID: $Id$ ----------------------------------------------------------------------------- + +require"luasocket" +require"http" + socket.http.TIMEOUT = 10 cache = {} diff --git a/etc/dict.lua b/etc/dict.lua index d11ac93..31359d9 100644 --- a/etc/dict.lua +++ b/etc/dict.lua @@ -4,6 +4,8 @@ -- Author: Diego Nehab -- RCS ID: $Id$ ----------------------------------------------------------------------------- +require"luasocket" + function get_status(sock, valid) local line, err = sock:receive() local code, par @@ -12,7 +14,7 @@ function get_status(sock, valid) code = tonumber(code) if code ~= valid then return code end if code == 150 then - par = tonumber(socket.skip(2, string.find(line, "^%d%d%d (%d*)")) + par = tonumber(socket.skip(2, string.find(line, "^%d%d%d (%d*)"))) end return nil, par end diff --git a/etc/qp.lua b/etc/qp.lua index 08545db..5a00c4d 100644 --- a/etc/qp.lua +++ b/etc/qp.lua @@ -1,3 +1,5 @@ +require("ltn12") +require("mime") local convert arg = arg or {} local mode = arg and arg[1] or "-et" @@ -13,4 +15,4 @@ elseif mode == "-eb" then else convert = mime.decode("quoted-printable") end local source = ltn12.source.chain(ltn12.source.file(io.stdin), convert) local sink = ltn12.sink.file(io.stdout) -ltn12.pump(source, sink) +ltn12.pump.all(source, sink) diff --git a/samples/cddb.lua b/samples/cddb.lua index 0ed7c71..09309e8 100644 --- a/samples/cddb.lua +++ b/samples/cddb.lua @@ -1,3 +1,6 @@ +require"luasocket" +require"http" + if not arg or not arg[1] or not arg[2] then print("luasocket cddb.lua []") os.exit(1) diff --git a/samples/daytimeclnt.lua b/samples/daytimeclnt.lua index 63f4017..ee7f652 100644 --- a/samples/daytimeclnt.lua +++ b/samples/daytimeclnt.lua @@ -4,6 +4,7 @@ -- Author: Diego Nehab -- RCS ID: $Id$ ----------------------------------------------------------------------------- +require"luasocket" host = host or "127.0.0.1" port = port or 13 if arg then diff --git a/samples/echoclnt.lua b/samples/echoclnt.lua index 56bd123..a3d75f3 100644 --- a/samples/echoclnt.lua +++ b/samples/echoclnt.lua @@ -4,6 +4,7 @@ -- Author: Diego Nehab -- RCS ID: $Id$ ----------------------------------------------------------------------------- +require"luasocket" host = host or "localhost" port = port or 7 if arg then @@ -11,17 +12,13 @@ if arg then port = arg[2] or port end host = socket.dns.toip(host) -udp, err = socket.udp() -assert(udp, err) -ret, err = udp:setpeername(host, port) -assert(ret, err) -print("Using host '" ..host.. "' and port " .. port .. "...") +udp = socket.try(socket.udp()) +socket.try(udp:setpeername(host, port)) +print("Using remote host '" ..host.. "' and port " .. port .. "...") while 1 do line = io.read() if not line then os.exit() end - ret, err = udp:send(line) - if not ret then print(err) os.exit() end - dgram, err = udp:receive() - if not dgram then print(err) os.exit() end + socket.try(udp:send(line)) + dgram = socket.try(udp:receive()) print(dgram) end diff --git a/samples/echosrvr.lua b/samples/echosrvr.lua index a7ed03c..9d99506 100644 --- a/samples/echosrvr.lua +++ b/samples/echosrvr.lua @@ -4,6 +4,7 @@ -- Author: Diego Nehab -- RCS ID: $Id$ ----------------------------------------------------------------------------- +require"luasocket" host = host or "127.0.0.1" port = port or 7 if arg then @@ -11,19 +12,17 @@ if arg then port = arg[2] or port end print("Binding to host '" ..host.. "' and port " ..port.. "...") -udp, err = socket.udp() -assert(udp, err) -ret, err = udp:setsockname(host, port) -assert(ret, err) -udp:settimeout(5) -ip, port = udp:getsockname() -assert(ip, port) +udp = socket.try(socket.udp()) +socket.try(udp:setsockname(host, port)) +socket.try(udp:settimeout(5)) +ip, port = socket.try(udp:getsockname()) print("Waiting packets on " .. ip .. ":" .. port .. "...") while 1 do dgram, ip, port = udp:receivefrom() - if not dgram then print(ip) - else - print("Echoing from " .. ip .. ":" .. port) + if dgram then + print("Echoing '" .. dgram .. "' to " .. ip .. ":" .. port) udp:sendto(dgram, ip, port) - end + else + print(ip) + end end 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) int err; const char *data = luaL_checklstring(L, 2, &count); tm_markstart(tm); - err = sock_send(&udp->sock, data, count, &sent, tm_get(tm)); + do err = sock_send(&udp->sock, data, count, &sent, tm_getretry(tm)); + while (err == IO_RETRY); if (err == IO_DONE) lua_pushnumber(L, sent); else lua_pushnil(L); /* a 'closed' error on an unconnected means the target address was not @@ -137,8 +138,9 @@ static int meth_sendto(lua_State *L) addr.sin_family = AF_INET; addr.sin_port = htons(port); tm_markstart(tm); - err = sock_sendto(&udp->sock, data, count, &sent, + do err = sock_sendto(&udp->sock, data, count, &sent, (SA *) &addr, sizeof(addr), tm_get(tm)); + while (err == IO_RETRY); if (err == IO_DONE) lua_pushnumber(L, sent); else lua_pushnil(L); /* a 'closed' error on an unconnected means the target address was not @@ -159,7 +161,8 @@ static int meth_receive(lua_State *L) p_tm tm = &udp->tm; count = MIN(count, sizeof(buffer)); tm_markstart(tm); - err = sock_recv(&udp->sock, buffer, count, &got, tm_get(tm)); + do err = sock_recv(&udp->sock, buffer, count, &got, tm_get(tm)); + while (err == IO_RETRY); if (err == IO_DONE) lua_pushlstring(L, buffer, got); else lua_pushnil(L); io_pusherror(L, err); @@ -180,8 +183,9 @@ static int meth_receivefrom(lua_State *L) p_tm tm = &udp->tm; tm_markstart(tm); count = MIN(count, sizeof(buffer)); - err = sock_recvfrom(&udp->sock, buffer, count, &got, + do err = sock_recvfrom(&udp->sock, buffer, count, &got, (SA *) &addr, &addr_len, tm_get(tm)); + while (err == IO_RETRY); if (err == IO_DONE) { lua_pushlstring(L, buffer, got); 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, /* here there was no data before timeout */ else return IO_TIMEOUT; /* here we didn't send anything, but now we can */ - } else return IO_DONE; + } else return IO_RETRY; /* here we successfully sent something */ } else { *sent = put; @@ -239,7 +239,7 @@ int sock_sendto(p_sock ps, const char *data, size_t count, size_t *sent, if (sock_select(sock+1, NULL, &fds, NULL, timeout) <= 0) { if (errno == EINTR) return IO_RETRY; else return IO_TIMEOUT; - } else return IO_DONE; + } else return IO_RETRY; } else { *sent = put; return IO_DONE; @@ -266,7 +266,7 @@ int sock_recv(p_sock ps, char *data, size_t count, size_t *got, int timeout) ret = sock_select(sock+1, &fds, NULL, NULL, timeout); if (ret < 0 && errno == EINTR) return IO_RETRY; if (ret == 0) return IO_TIMEOUT; - else return IO_DONE; + return IO_RETRY; } else { *got = taken; return IO_DONE; @@ -294,7 +294,7 @@ int sock_recvfrom(p_sock ps, char *data, size_t count, size_t *got, ret = sock_select(sock+1, &fds, NULL, NULL, timeout); if (ret < 0 && errno == EINTR) return IO_RETRY; if (ret == 0) return IO_TIMEOUT; - else return IO_DONE; + return IO_RETRY; } else { *got = taken; 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, FD_ZERO(&fds); FD_SET(sock, &fds); ret = sock_select(0, NULL, &fds, NULL, timeout); - /* tell the caller to call us again because there is more data */ - if (ret > 0) return IO_DONE; - /* tell the caller there was no data before timeout */ + /* tell the caller to call us again because now we can send */ + if (ret > 0) return IO_RETRY; + /* tell the caller we can't send anything before timint out */ else return IO_TIMEOUT; /* here we know the connection has been closed */ } else return IO_CLOSED; @@ -229,27 +229,18 @@ int sock_sendto(p_sock ps, const char *data, size_t count, size_t *sent, t_sock sock = *ps; int put; int ret; - /* avoid making system calls on closed sockets */ if (sock == SOCK_INVALID) return IO_CLOSED; - /* try to send something */ put = sendto(sock, data, (int) count, 0, addr, addr_len); - /* deal with failure */ if (put <= 0) { - /* in any case, nothing has been sent */ *sent = 0; - /* run select to avoid busy wait */ if (WSAGetLastError() == WSAEWOULDBLOCK) { fd_set fds; FD_ZERO(&fds); FD_SET(sock, &fds); ret = sock_select(0, NULL, &fds, NULL, timeout); - /* tell the caller to call us again because there is more data */ - if (ret > 0) return IO_DONE; - /* tell the caller there was no data before timeout */ + if (ret > 0) return IO_RETRY; else return IO_TIMEOUT; - /* here we know the connection has been closed */ } else return IO_CLOSED; - /* here we successfully sent something */ } else { *sent = put; return IO_DONE; @@ -273,7 +264,7 @@ int sock_recv(p_sock ps, char *data, size_t count, size_t *got, int timeout) FD_ZERO(&fds); FD_SET(sock, &fds); ret = sock_select(0, &fds, NULL, NULL, timeout); - if (ret > 0) return IO_DONE; + if (ret > 0) return IO_RETRY; else return IO_TIMEOUT; } else { *got = taken; @@ -299,7 +290,7 @@ int sock_recvfrom(p_sock ps, char *data, size_t count, size_t *got, FD_ZERO(&fds); FD_SET(sock, &fds); ret = sock_select(0, &fds, NULL, NULL, timeout); - if (ret > 0) return IO_DONE; + if (ret > 0) return IO_RETRY; else return IO_TIMEOUT; } else { *got = taken; diff --git a/test/mimetest.lua b/test/mimetest.lua index 3e57557..dea43d6 100644 --- a/test/mimetest.lua +++ b/test/mimetest.lua @@ -1,3 +1,7 @@ +require "luasocket" +require "ltn12" +require "mime" + dofile("testsupport.lua") local qptest = "qptest.bin" @@ -92,7 +96,7 @@ local function transform(input, output, filter) source = ltn12.source.chain(source, filter) end --what = not what - ltn12.pump(source, sink) + ltn12.pump.all(source, sink) end local function encode_qptest(mode) diff --git a/test/testclnt.lua b/test/testclnt.lua index ecf419b..556e54d 100644 --- a/test/testclnt.lua +++ b/test/testclnt.lua @@ -1,3 +1,5 @@ +require "luasocket" + host = host or "localhost" port = port or "8080" diff --git a/test/testsrvr.lua b/test/testsrvr.lua index 5c05239..d172a9e 100644 --- a/test/testsrvr.lua +++ b/test/testsrvr.lua @@ -1,3 +1,5 @@ +require "luasocket" + host = host or "localhost" port = port or "8080" @@ -22,8 +24,6 @@ while 1 do print("server: closing connection...") break end -print(command); - (loadstring(command))() end end