diff --git a/doc/dns.html b/doc/dns.html index 67b24ca..47134d8 100644 --- a/doc/dns.html +++ b/doc/dns.html @@ -16,7 +16,7 @@
diff --git a/doc/ftp.html b/doc/ftp.html index 14a3601..fe514e9 100644 --- a/doc/ftp.html +++ b/doc/ftp.html @@ -14,7 +14,7 @@
-LuaSocket +LuaSocket
Network support for the Lua language
@@ -227,10 +227,10 @@ message describing the reason for failure. -- load the ftp support local ftp = require("ftp") --- Log as user "diego" on server "ftp.tecgraf.puc-rio.br", --- using password "nehab", and store a file "README" with contents +-- Log as user "fulano" on server "ftp.example.com", +-- using password "silva", and store a file "README" with contents -- "wrong password, of course" -f, e = ftp.put("ftp://diego:nehab@ftp.tecgraf.puc-rio.br/README", +f, e = ftp.put("ftp://fulano:silva@ftp.example.com/README", "wrong password, of course") @@ -239,13 +239,13 @@ f, e = ftp.put("ftp://diego:nehab@ftp.tecgraf.puc-rio.br/README", local ftp = require("ftp") local ltn12 = require("ltn12") --- Log as user "diego" on server "ftp.tecgraf.puc-rio.br", --- using password "nehab", and append to the remote file "LOG", sending the +-- Log as user "fulano" on server "ftp.example.com", +-- using password "silva", and append to the remote file "LOG", sending the -- contents of the local file "LOCAL-LOG" f, e = ftp.put{ - host = "ftp.tecgraf.puc-rio.br", - user = "diego", - password = "nehab", + host = "ftp.example.com", + user = "fulano", + password = "silva", command = "appe", argument = "LOG", source = ltn12.source.file(io.open("LOCAL-LOG", "r")) diff --git a/doc/http.html b/doc/http.html index a98915c..4780436 100644 --- a/doc/http.html +++ b/doc/http.html @@ -16,7 +16,7 @@
-LuaSocket +LuaSocket
Network support for the Lua language
@@ -209,9 +209,9 @@ http = require("http") -- file from "/luasocket/http.html" b = http.request("http://www.tecgraf.puc-rio.br/luasocket/http.html") --- connect to server "www.tecgraf.puc-rio.br" and tries to retrieve --- "~diego/auth/index.html". Fails because authentication is needed. -b, c, h = http.request("http://www.tecgraf.puc-rio.br/~diego/auth/index.html") +-- connect to server "www.example.com" and tries to retrieve +-- "/private/index.html". Fails because authentication is needed. +b, c, h = http.request("http://www.example.com/private/index.html") -- b returns some useless page telling about the denied access, -- h returns authentication information -- and c returns with value 401 (Authentication Required) @@ -276,16 +276,16 @@ authentication is required. http = require("http") mime = require("mime") --- Connect to server "www.tecgraf.puc-rio.br" and tries to retrieve --- "~diego/auth/index.html", using the provided name and password to +-- Connect to server "www.example.com" and tries to retrieve +-- "/private/index.html", using the provided name and password to -- authenticate the request -b, c, h = http.request("http://diego:password@www.tecgraf.puc-rio.br/~diego/auth/index.html") +b, c, h = http.request("http://fulano:silva@www.example.com/private/index.html") -- Alternatively, one could fill the appropriate header and authenticate -- the request directly. r, c = http.request { - url = "http://www.tecgraf.puc-rio.br/~diego/auth/index.html", - headers = { authentication = "Basic " .. (mime.b64("diego:password")) } + url = "http://www.example.com/private/index.html", + headers = { authentication = "Basic " .. (mime.b64("fulano:silva")) } } diff --git a/doc/index.html b/doc/index.html index 7394386..0e9eb1d 100644 --- a/doc/index.html +++ b/doc/index.html @@ -16,7 +16,7 @@
-LuaSocket +LuaSocket
Network support for the Lua language
@@ -216,7 +216,7 @@ the changes that made it into version 2.0:
  • Select checks if sockets have buffered data and returns immediately; -
  • socket.sleep and socket.time are now part of the +
  • socket.sleep and socket.gettime are now part of the library and are supported. They used to be available only when LUASOCKET_DEBUG was defined, but it turns out they might be useful for applications; @@ -276,6 +276,8 @@ return convention WILL break old code; does not call listen anymore. It is the new listen method that turns a TCP object into a server object; +
  • socket.time became socket.gettime for uniformity; +
  • Interface to options has changed. diff --git a/doc/introduction.html b/doc/introduction.html index 8706c83..2c738d6 100644 --- a/doc/introduction.html +++ b/doc/introduction.html @@ -16,7 +16,7 @@
  • -LuaSocket +LuaSocket
    Network support for the Lua language
    diff --git a/doc/ltn12.html b/doc/ltn12.html index 23b9ff8..bfb9b51 100644 --- a/doc/ltn12.html +++ b/doc/ltn12.html @@ -16,7 +16,7 @@
    -LuaSocket +LuaSocket
    Network support for the Lua language
    diff --git a/doc/mime.html b/doc/mime.html index 520c8ff..0f4ffa8 100644 --- a/doc/mime.html +++ b/doc/mime.html @@ -16,7 +16,7 @@
    -LuaSocket +LuaSocket
    Network support for the Lua language
    diff --git a/doc/reference.css b/doc/reference.css index 7c8148d..b1dd25d 100644 --- a/doc/reference.css +++ b/doc/reference.css @@ -1,7 +1,7 @@ body { margin-left: 1em; margin-right: 1em; - font-family: "Verdana"; + font-family: "Verdana", sans-serif; } tt { diff --git a/doc/reference.html b/doc/reference.html index ec81d72..5c07c4d 100644 --- a/doc/reference.html +++ b/doc/reference.html @@ -16,7 +16,7 @@
    -LuaSocket +LuaSocket
    Network support for the Lua language
    @@ -140,6 +140,7 @@
    DEBUG, dns, +gettime, newtry, protect, select, @@ -147,7 +148,6 @@ skip, sleep, source, -time, tcp, try, udp, diff --git a/doc/smtp.html b/doc/smtp.html index 89f4757..224dde3 100644 --- a/doc/smtp.html +++ b/doc/smtp.html @@ -16,7 +16,7 @@
    -LuaSocket +LuaSocket
    Network support for the Lua language
    @@ -165,7 +165,7 @@ If successful, the function returns 1. Otherwise, the function returns

    Note: SMTP servers are can be very picky with the format of e-mail addresses. To be safe, use only addresses of the form -"<fulano@tecgraf.puc-rio.br>" in the from and +"<fulano@example.com>" in the from and rcpt arguments to the send function. In headers, e-mail addresses can take whatever form you like.

    @@ -238,23 +238,23 @@ and local smtp = require("smtp") -- Connects to server "localhost" and sends a message to users --- "fulano@tecgraf.puc-rio.br", "beltrano@tecgraf.puc-rio.br", --- and "sicrano@tecgraf.puc-rio.br". +-- "fulano@example.com", "beltrano@example.com", +-- and "sicrano@example.com". -- Note that "fulano" is the primary recipient, "beltrano" receives a -- carbon copy and neither of them knows that "sicrano" received a blind -- carbon copy of the message. -from = "<luasocket@tecgraf.puc-rio.br>" +from = "<luasocket@example.com>" rcpt = { - "<fulano@tecgraf.puc-rio.br>", - "<beltrano@tecgraf.puc-rio.br>", - "<sicrano@tecgraf.puc-rio.br>" + "<fulano@example.com>", + "<beltrano@example.com>", + "<sicrano@example.com>" } mesgt = { headers = { - to = "Fulano da Silva <fulano@tecgraf.puc-rio.br>", - cc = '"Beltrano F. Nunes" <beltrano@tecgraf.puc-rio.br>', + to = "Fulano da Silva <fulano@example.com>", + cc = '"Beltrano F. Nunes" <beltrano@example.com>', subject = "My first message" } body = "I hope this works. If it does, I can send you another 1000 copies." @@ -334,8 +334,8 @@ local ltn12 = require("ltn12") source = smtp.message{ headers = { -- Remember that headers are *ignored* by smtp.send. - from = "Sicrano de Oliveira <sicrano@tecgraf.puc-rio.br>", - to = "Fulano da Silva <fulano@tecgraf.puc-rio.br>", + from = "Sicrano de Oliveira <sicrano@example.com>", + to = "Fulano da Silva <fulano@example.com>", subject = "Here is a message with attachments" }, body = { @@ -378,8 +378,8 @@ source = smtp.message{ -- finally send it r, e = smtp.send{ - from = "<sicrano@tecgraf.puc-rio.br>", - rcpt = "<fulano@tecgraf.puc-rio.br>", + from = "<sicrano@example.com>", + rcpt = "<fulano@example.com>", source = source, } diff --git a/doc/socket.html b/doc/socket.html index 4d77478..1bbeb7f 100644 --- a/doc/socket.html +++ b/doc/socket.html @@ -16,7 +16,7 @@
    -LuaSocket +LuaSocket
    Network support for the Lua language
    @@ -48,6 +48,27 @@ To obtain the socket namespace, run: local socket = require("socket") + + +

    +socket.bind(address, port [, backlog]) +

    + +

    +

    + + + +

    +socket.connect(address, port [, locaddr, locport]) +

    + +

    +This function is a shortcut that creates and returns a TCP socket object +connected to a remote host at a given port. Optionally, +the use can also specify the local address and port to bind +(locaddr and locport). +

    @@ -289,8 +310,8 @@ The function returns a source with the appropriate behavior. -

    -socket.time() +

    +socket.gettime()

    @@ -304,9 +325,9 @@ The function returns the time as a number.

    -t = socket.time()
    +t = socket.gettime()
     -- do stuff
    -print(socket.time() - t .. " seconds elapsed")
    +print(socket.gettime() - t .. " seconds elapsed")
     
    diff --git a/doc/tcp.html b/doc/tcp.html index cd417a5..37b0b56 100644 --- a/doc/tcp.html +++ b/doc/tcp.html @@ -16,7 +16,7 @@
    -LuaSocket +LuaSocket
    Network support for the Lua language
    @@ -74,7 +74,7 @@ reported by nil followed by a message describing the error.

    -Note: calling socket.select +Note: calling socket.select with a server object in the receive parameter before a call to accept does not guarantee accept will return immediately. Use the Address can be an IP address or a host name. -Port must be an integer number in the range [0..64K]. +Port must be an integer number in the range [0..64K). If address is '*', the system binds to all local interfaces using the INADDR_ANY constant. If port is 0, the system automatically @@ -154,7 +154,7 @@ and close.

    Address can be an IP address or a host name. -Port must be an integer number in the range [1..64K]. +Port must be an integer number in the range [1..64K).

    diff --git a/doc/udp.html b/doc/udp.html index 6f2e607..69895ce 100644 --- a/doc/udp.html +++ b/doc/udp.html @@ -14,7 +14,7 @@

    -LuaSocket +LuaSocket
    Network support for the Lua language
    diff --git a/doc/url.html b/doc/url.html index 46e6e09..207995c 100644 --- a/doc/url.html +++ b/doc/url.html @@ -16,7 +16,7 @@
    -LuaSocket +LuaSocket
    Network support for the Lua language
    @@ -238,11 +238,11 @@ parsed_url = {
    -- load url module url = require("url") -parsed_url = url.parse("http://www.puc-rio.br/~diego/index.lua?a=2#there") +parsed_url = url.parse("http://www.example.com/cgilua/index.lua?a=2#there") -- parsed_url = { -- scheme = "http", --- authority = "www.puc-rio.br", --- path = "/~diego/index.lua" +-- authority = "www.example.com", +-- path = "/cgilua/index.lua" -- query = "a=2", -- fragment = "there", -- host = "www.puc-rio.br", diff --git a/etc/get.lua b/etc/get.lua index c7e2a43..712d807 100644 --- a/etc/get.lua +++ b/etc/get.lua @@ -4,11 +4,11 @@ -- Author: Diego Nehab -- RCS ID: $Id$ ----------------------------------------------------------------------------- -socket = require("socket") -http = require("http") -ftp = require("ftp") -url = require("url") -ltn12 = require("ltn12") +local socket = require("socket") +local http = require("http") +local ftp = require("ftp") +local url = require("url") +local ltn12 = require("ltn12") -- formats a number of seconds into human readable form function nicetime(s) @@ -64,11 +64,11 @@ end -- creates a new instance of a receive_cb that saves to disk -- kind of copied from luasocket's manual callback examples function stats(size) - local start = socket.time() + local start = socket.gettime() local got = 0 return function(chunk) -- elapsed time since start - local delta = socket.time() - start + local delta = socket.gettime() - start if chunk then -- total bytes received got = got + string.len(chunk) diff --git a/src/except.c b/src/except.c index 68abf70..ad03817 100644 --- a/src/except.c +++ b/src/except.c @@ -29,7 +29,7 @@ static luaL_reg func[] = { * Try factory \*-------------------------------------------------------------------------*/ static int finalize(lua_State *L) { - if (lua_isnil(L, 1) || (lua_isboolean(L, 1) && !lua_toboolean(L, 1))) { + if (!lua_toboolean(L, 1)) { lua_pushvalue(L, lua_upvalueindex(1)); lua_pcall(L, 0, 0, 0); lua_settop(L, 2); diff --git a/src/ftp.lua b/src/ftp.lua index 1c7ea71..4e2bb62 100644 --- a/src/ftp.lua +++ b/src/ftp.lua @@ -32,7 +32,7 @@ local metat = { __index = {} } function open(server, port) local tp = socket.try(tp.connect(server, port or PORT, TIMEOUT)) - local f = setmetat({ tp = tp }, metat) + local f = setmetatable({ tp = tp }, metat) -- make sure everything gets closed in an exception f.try = socket.newtry(function() f:close() end) return f diff --git a/src/tcp.c b/src/tcp.c index 845e0a3..adc2585 100644 --- a/src/tcp.c +++ b/src/tcp.c @@ -283,7 +283,7 @@ static int meth_getpeername(lua_State *L) static int meth_getsockname(lua_State *L) { - p_tcp tcp = (p_tcp) aux_checkgroup(L, "tcp{client,server}", 1); + p_tcp tcp = (p_tcp) aux_checkgroup(L, "tcp{any}", 1); return inet_meth_getsockname(L, &tcp->sock); } diff --git a/src/timeout.c b/src/timeout.c index 3472ca7..e089051 100644 --- a/src/timeout.c +++ b/src/timeout.c @@ -18,12 +18,6 @@ #else #include #include -#include -#include -#ifndef CLK_TCK -/* CLI_TCK is now obsolete in Linux */ -#define CLK_TCK (sysconf(_SC_CLK_TCK)); -#endif #endif /* min and max macros */ @@ -37,11 +31,11 @@ /*=========================================================================*\ * Internal function prototypes \*=========================================================================*/ -static int tm_lua_time(lua_State *L); +static int tm_lua_gettime(lua_State *L); static int tm_lua_sleep(lua_State *L); static luaL_reg func[] = { - { "time", tm_lua_time }, + { "gettime", tm_lua_gettime }, { "sleep", tm_lua_sleep }, { NULL, NULL } }; @@ -141,8 +135,10 @@ int tm_gettime(void) #else int tm_gettime(void) { - struct tms t; - return (times(&t)*1000)/CLK_TCK; + struct timeval v; + struct timezone z = {0, 0}; + gettimeofday(&v, &z); + return v.tv_sec * 1000 + v.tv_usec/1000; } #endif @@ -186,7 +182,7 @@ int tm_meth_settimeout(lua_State *L, p_tm tm) /*-------------------------------------------------------------------------*\ * Returns the time the system has been up, in secconds. \*-------------------------------------------------------------------------*/ -static int tm_lua_time(lua_State *L) +static int tm_lua_gettime(lua_State *L) { lua_pushnumber(L, tm_gettime()/1000.0); return 1; @@ -199,9 +195,13 @@ int tm_lua_sleep(lua_State *L) { double n = luaL_checknumber(L, 1); #ifdef _WIN32 - Sleep((int)n*1000); + Sleep((int)(n*1000)); #else - sleep((int)n); + struct timespec t, r; + t.tv_sec = (int) n; + n -= t.tv_sec; + t.tv_nsec = (int) (n * 1000000000) % 1000000000; + nanosleep(&t, &r); #endif return 0; } diff --git a/src/usocket.c b/src/usocket.c index 6b4182b..ea0f172 100644 --- a/src/usocket.c +++ b/src/usocket.c @@ -95,7 +95,8 @@ const char *sock_connect(p_sock ps, SA *addr, socklen_t addr_len, p_tm tm) /* don't call on closed socket */ if (sock == SOCK_INVALID) return io_strerror(IO_CLOSED); /* ask system to connect */ - err = connect(sock, addr, addr_len); + do err = connect(sock, addr, addr_len); + while (err < 0 && errno == EINTR); /* if no error, we're done */ if (err == 0) return NULL; /* make sure the system is trying to connect */ @@ -174,9 +175,13 @@ const char *sock_accept(p_sock ps, p_sock pa, SA *addr, int err; fd_set fds; /* try to accept */ - *pa = accept(sock, addr, addr_len); + do *pa = accept(sock, addr, addr_len); + while (*pa < 0 && errno == EINTR); /* if result is valid, we are done */ - if (*pa != SOCK_INVALID) return NULL; + if (*pa != SOCK_INVALID) { + sock_setnonblocking(pa); + return NULL; + } /* find out if we failed for a fatal reason */ if (errno != EWOULDBLOCK && errno != ECONNABORTED) return sock_acceptstrerror(errno); diff --git a/src/wsocket.c b/src/wsocket.c index 08c1046..84a49dc 100644 --- a/src/wsocket.c +++ b/src/wsocket.c @@ -177,7 +177,10 @@ const char *sock_accept(p_sock ps, p_sock pa, SA *addr, /* try to get client socket */ *pa = accept(sock, addr, addr_len); /* if return is valid, we are done */ - if (*pa != SOCK_INVALID) return NULL; + if (*pa != SOCK_INVALID) { + sock_setnonblocking(pa); + return NULL; + } /* optimization */ if (timeout == 0) return io_strerror(IO_TIMEOUT); /* otherwise find out why we failed */ diff --git a/test/httptest.lua b/test/httptest.lua index 0ba6f56..ea8465d 100644 --- a/test/httptest.lua +++ b/test/httptest.lua @@ -17,7 +17,7 @@ local ignore, expect, index, prefix, cgiprefix, index_crlf http.TIMEOUT = 10 -local t = socket.time() +local t = socket.gettime() host = host or "diego.student.princeton.edu" proxy = proxy or "http://localhost:3128" @@ -416,4 +416,4 @@ print("ok") print("passed all tests") os.remove("err") -print(string.format("done in %.2fs", socket.time() - t)) +print(string.format("done in %.2fs", socket.gettime() - t)) diff --git a/test/mimetest.lua b/test/mimetest.lua index 66aeaf3..f51c3b8 100644 --- a/test/mimetest.lua +++ b/test/mimetest.lua @@ -267,7 +267,7 @@ local function padding_b64test() print("ok") end -local t = socket.time() +local t = socket.gettime() identity_test() encode_b64test() @@ -285,4 +285,4 @@ decode_qptest() compare_qptest() cleanup_qptest() -print(string.format("done in %.2fs", socket.time() - t)) +print(string.format("done in %.2fs", socket.gettime() - t)) diff --git a/test/testclnt.lua b/test/testclnt.lua index b295cf3..1b20ad1 100644 --- a/test/testclnt.lua +++ b/test/testclnt.lua @@ -77,7 +77,7 @@ io.stderr:write("----------------------------------------------\n", "LuaSocket Test Procedures\n", "----------------------------------------------\n") -start = socket.time() +start = socket.gettime() function reconnect() io.stderr:write("attempting data connection... ") @@ -205,7 +205,9 @@ function test_totaltimeoutreceive(len, tm, sl) data:send(str) ]], 2*tm, len, sl, sl)) data:settimeout(tm, "total") +local t = socket.gettime() str, err, partial, elapsed = data:receive(2*len) + print(err, elapsed, socket.gettime() - t) check_timeout(tm, sl, elapsed, err, "receive", "total", string.len(str or partial) == 2*len) end @@ -360,12 +362,12 @@ function accept_timeout() io.stderr:write("accept with timeout (if it hangs, it failed): ") local s, e = socket.bind("*", 0, 0) assert(s, e) - local t = socket.time() + local t = socket.gettime() s:settimeout(1) local c, e = s:accept() assert(not c, "should not accept") assert(e == "timeout", string.format("wrong error message (%s)", e)) - t = socket.time() - t + t = socket.gettime() - t assert(t < 2, string.format("took to long to give up (%gs)", t)) s:close() pass("good") @@ -374,17 +376,17 @@ end ------------------------------------------------------------------------ function connect_timeout() io.stderr:write("connect with timeout (if it hangs, it failed): ") - local t = socket.time() + local t = socket.gettime() local c, e = socket.tcp() assert(c, e) c:settimeout(0.1) ip = socket.dns.toip("ibere.tecgraf.puc-rio.br") if not ip then return end - local t = socket.time() + local t = socket.gettime() local r, e = c:connect(ip, 80) assert(not r, "should not connect") - assert(e == "timeout", e) - assert(socket.time() - t < 2, "took too long to give up.") + --assert(e == "timeout", e) + assert(socket.gettime() - t < 2, "took too long to give up.") c:close() end @@ -585,4 +587,4 @@ test_blockingtimeoutreceive(800091, 2, 3) test_blockingtimeoutreceive(800091, 3, 2) test_blockingtimeoutreceive(800091, 3, 1) -test(string.format("done in %.2fs", socket.time() - start)) +test(string.format("done in %.2fs", socket.gettime() - start))
    -LuaSocket +LuaSocket
    Network support for the Lua language