diff options
author | Diego Nehab <diego@tecgraf.puc-rio.br> | 2012-04-11 13:21:25 -0700 |
---|---|---|
committer | Sam Roberts <vieuxtech@gmail.com> | 2012-04-11 13:25:11 -0700 |
commit | 2778766d678b147fc079d67dee036346381b4764 (patch) | |
tree | da44507f62fb9c8cd078cf25f6dc24107e56af34 | |
parent | 3a8ba90dfb0c2eb224f317dd692ede426691e72a (diff) | |
download | luasocket-2778766d678b147fc079d67dee036346381b4764.tar.gz luasocket-2778766d678b147fc079d67dee036346381b4764.tar.bz2 luasocket-2778766d678b147fc079d67dee036346381b4764.zip |
Preliminary IPv6 support for v2.1
40 files changed, 432 insertions, 52 deletions
diff --git a/etc/b64.lua b/etc/b64.lua index d74c949..f75c423 100644 --- a/etc/b64.lua +++ b/etc/b64.lua | |||
@@ -2,7 +2,7 @@ | |||
2 | -- Little program to convert to and from Base64 | 2 | -- Little program to convert to and from Base64 |
3 | -- LuaSocket sample files | 3 | -- LuaSocket sample files |
4 | -- Author: Diego Nehab | 4 | -- Author: Diego Nehab |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: b64.lua,v 1.8 2004/06/16 04:28:21 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | local ltn12 = require("ltn12") | 7 | local ltn12 = require("ltn12") |
8 | local mime = require("mime") | 8 | local mime = require("mime") |
diff --git a/etc/dict.lua b/etc/dict.lua index 6eb3210..e375d23 100644 --- a/etc/dict.lua +++ b/etc/dict.lua | |||
@@ -2,7 +2,7 @@ | |||
2 | -- Little program to download DICT word definitions | 2 | -- Little program to download DICT word definitions |
3 | -- LuaSocket sample files | 3 | -- LuaSocket sample files |
4 | -- Author: Diego Nehab | 4 | -- Author: Diego Nehab |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: dict.lua,v 1.22 2005/11/22 08:33:29 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | 7 | ||
8 | ----------------------------------------------------------------------------- | 8 | ----------------------------------------------------------------------------- |
diff --git a/etc/eol.lua b/etc/eol.lua index d7c5db6..b90be79 100644 --- a/etc/eol.lua +++ b/etc/eol.lua | |||
@@ -2,7 +2,7 @@ | |||
2 | -- Little program to adjust end of line markers. | 2 | -- Little program to adjust end of line markers. |
3 | -- LuaSocket sample files | 3 | -- LuaSocket sample files |
4 | -- Author: Diego Nehab | 4 | -- Author: Diego Nehab |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: eol.lua,v 1.8 2005/11/22 08:33:29 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | local mime = require("mime") | 7 | local mime = require("mime") |
8 | local ltn12 = require("ltn12") | 8 | local ltn12 = require("ltn12") |
diff --git a/etc/get.lua b/etc/get.lua index 0d631c2..4c344e2 100644 --- a/etc/get.lua +++ b/etc/get.lua | |||
@@ -2,7 +2,7 @@ | |||
2 | -- Little program to download files from URLs | 2 | -- Little program to download files from URLs |
3 | -- LuaSocket sample files | 3 | -- LuaSocket sample files |
4 | -- Author: Diego Nehab | 4 | -- Author: Diego Nehab |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: get.lua,v 1.25 2007/03/12 04:08:40 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | local socket = require("socket") | 7 | local socket = require("socket") |
8 | local http = require("socket.http") | 8 | local http = require("socket.http") |
@@ -3,7 +3,7 @@ | |||
3 | -- LuaSocket toolkit. | 3 | -- LuaSocket toolkit. |
4 | -- Author: David Burgess | 4 | -- Author: David Burgess |
5 | -- Modified by Diego Nehab, but David is in charge | 5 | -- Modified by Diego Nehab, but David is in charge |
6 | -- RCS ID: $Id$ | 6 | -- RCS ID: $Id: lp.lua,v 1.14 2005/11/21 07:04:44 diego Exp $ |
7 | ----------------------------------------------------------------------------- | 7 | ----------------------------------------------------------------------------- |
8 | --[[ | 8 | --[[ |
9 | if you have any questions: RFC 1179 | 9 | if you have any questions: RFC 1179 |
@@ -2,7 +2,7 @@ | |||
2 | -- Little program to convert to and from Quoted-Printable | 2 | -- Little program to convert to and from Quoted-Printable |
3 | -- LuaSocket sample files | 3 | -- LuaSocket sample files |
4 | -- Author: Diego Nehab | 4 | -- Author: Diego Nehab |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: qp.lua,v 1.5 2004/06/17 21:46:22 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | local ltn12 = require("ltn12") | 7 | local ltn12 = require("ltn12") |
8 | local mime = require("mime") | 8 | local mime = require("mime") |
diff --git a/etc/tftp.lua b/etc/tftp.lua index 4051e74..7f51c6f 100644 --- a/etc/tftp.lua +++ b/etc/tftp.lua | |||
@@ -2,7 +2,7 @@ | |||
2 | -- TFTP support for the Lua language | 2 | -- TFTP support for the Lua language |
3 | -- LuaSocket toolkit. | 3 | -- LuaSocket toolkit. |
4 | -- Author: Diego Nehab | 4 | -- Author: Diego Nehab |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: tftp.lua,v 1.16 2005/11/22 08:33:29 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | 7 | ||
8 | ----------------------------------------------------------------------------- | 8 | ----------------------------------------------------------------------------- |
diff --git a/samples/daytimeclnt.lua b/samples/daytimeclnt.lua index 6a26ffc..90ab39e 100644 --- a/samples/daytimeclnt.lua +++ b/samples/daytimeclnt.lua | |||
@@ -2,7 +2,7 @@ | |||
2 | -- UDP sample: daytime protocol client | 2 | -- UDP sample: daytime protocol client |
3 | -- LuaSocket sample files | 3 | -- LuaSocket sample files |
4 | -- Author: Diego Nehab | 4 | -- Author: Diego Nehab |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: daytimeclnt.lua,v 1.11 2004/06/21 06:07:57 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | local socket = require"socket" | 7 | local socket = require"socket" |
8 | host = host or "127.0.0.1" | 8 | host = host or "127.0.0.1" |
diff --git a/samples/echoclnt.lua b/samples/echoclnt.lua index 764e433..038be4c 100644 --- a/samples/echoclnt.lua +++ b/samples/echoclnt.lua | |||
@@ -2,7 +2,7 @@ | |||
2 | -- UDP sample: echo protocol client | 2 | -- UDP sample: echo protocol client |
3 | -- LuaSocket sample files | 3 | -- LuaSocket sample files |
4 | -- Author: Diego Nehab | 4 | -- Author: Diego Nehab |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: echoclnt.lua,v 1.10 2005/01/02 22:44:00 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | local socket = require("socket") | 7 | local socket = require("socket") |
8 | host = host or "localhost" | 8 | host = host or "localhost" |
diff --git a/samples/echosrvr.lua b/samples/echosrvr.lua index 8d39ed9..2697ca4 100644 --- a/samples/echosrvr.lua +++ b/samples/echosrvr.lua | |||
@@ -2,7 +2,7 @@ | |||
2 | -- UDP sample: echo protocol server | 2 | -- UDP sample: echo protocol server |
3 | -- LuaSocket sample files | 3 | -- LuaSocket sample files |
4 | -- Author: Diego Nehab | 4 | -- Author: Diego Nehab |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: echosrvr.lua,v 1.12 2005/11/22 08:33:29 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | local socket = require("socket") | 7 | local socket = require("socket") |
8 | host = host or "127.0.0.1" | 8 | host = host or "127.0.0.1" |
diff --git a/samples/listener.lua b/samples/listener.lua index 4d4c3b6..9260fbb 100644 --- a/samples/listener.lua +++ b/samples/listener.lua | |||
@@ -2,7 +2,7 @@ | |||
2 | -- TCP sample: Little program to dump lines received at a given port | 2 | -- TCP sample: Little program to dump lines received at a given port |
3 | -- LuaSocket sample files | 3 | -- LuaSocket sample files |
4 | -- Author: Diego Nehab | 4 | -- Author: Diego Nehab |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: listener.lua,v 1.11 2005/01/02 22:44:00 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | local socket = require("socket") | 7 | local socket = require("socket") |
8 | host = host or "*" | 8 | host = host or "*" |
diff --git a/samples/mclisten.lua b/samples/mclisten.lua new file mode 100644 index 0000000..d40d789 --- /dev/null +++ b/samples/mclisten.lua | |||
@@ -0,0 +1,18 @@ | |||
1 | local socket = require"socket" | ||
2 | local group = "225.0.0.37" | ||
3 | local port = 12345 | ||
4 | local c = assert(socket.udp()) | ||
5 | print(assert(c:setoption("reuseport", true))) | ||
6 | print(assert(c:setsockname("*", port))) | ||
7 | --print("loop:", c:getoption("ip-multicast-loop")) | ||
8 | --print(assert(c:setoption("ip-multicast-loop", false))) | ||
9 | --print("loop:", c:getoption("ip-multicast-loop")) | ||
10 | --print("if:", c:getoption("ip-multicast-if")) | ||
11 | --print(assert(c:setoption("ip-multicast-if", "127.0.0.1"))) | ||
12 | --print("if:", c:getoption("ip-multicast-if")) | ||
13 | --print(assert(c:setoption("ip-multicast-if", "10.0.1.4"))) | ||
14 | --print("if:", c:getoption("ip-multicast-if")) | ||
15 | print(assert(c:setoption("ip-add-membership", {multiaddr = group, interface = "*"}))) | ||
16 | while 1 do | ||
17 | print(c:receivefrom()) | ||
18 | end | ||
diff --git a/samples/mcsend.lua b/samples/mcsend.lua new file mode 100644 index 0000000..7c24cdf --- /dev/null +++ b/samples/mcsend.lua | |||
@@ -0,0 +1,20 @@ | |||
1 | local socket = require"socket" | ||
2 | local group = "225.0.0.37" | ||
3 | local port = 12345 | ||
4 | local c = assert(socket.udp()) | ||
5 | --print(assert(c:setoption("reuseport", true))) | ||
6 | --print(assert(c:setsockname("*", port))) | ||
7 | --print(assert(c:setoption("ip-multicast-loop", false))) | ||
8 | --print(assert(c:setoption("ip-multicast-ttl", 4))) | ||
9 | --print(assert(c:setoption("ip-multicast-if", "10.0.1.3"))) | ||
10 | --print(assert(c:setoption("ip-add-membership", {multiaddr = group, interface = "*"}))) | ||
11 | local i = 0 | ||
12 | while 1 do | ||
13 | local message = string.format("hello all %d!", i) | ||
14 | assert(c:sendto(message, group, port)) | ||
15 | print("sent " .. message) | ||
16 | socket.sleep(1) | ||
17 | c:settimeout(0.5) | ||
18 | print(c:receivefrom()) | ||
19 | i = i + 1 | ||
20 | end | ||
diff --git a/samples/talker.lua b/samples/talker.lua index 901ed2c..607ff31 100644 --- a/samples/talker.lua +++ b/samples/talker.lua | |||
@@ -2,7 +2,7 @@ | |||
2 | -- TCP sample: Little program to send text lines to a given host/port | 2 | -- TCP sample: Little program to send text lines to a given host/port |
3 | -- LuaSocket sample files | 3 | -- LuaSocket sample files |
4 | -- Author: Diego Nehab | 4 | -- Author: Diego Nehab |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: talker.lua,v 1.9 2005/01/02 22:44:00 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | local socket = require("socket") | 7 | local socket = require("socket") |
8 | host = host or "localhost" | 8 | host = host or "localhost" |
diff --git a/samples/tinyirc.lua b/samples/tinyirc.lua index dd2c6f8..f474302 100644 --- a/samples/tinyirc.lua +++ b/samples/tinyirc.lua | |||
@@ -2,7 +2,7 @@ | |||
2 | -- Select sample: simple text line server | 2 | -- Select sample: simple text line server |
3 | -- LuaSocket sample files. | 3 | -- LuaSocket sample files. |
4 | -- Author: Diego Nehab | 4 | -- Author: Diego Nehab |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: tinyirc.lua,v 1.14 2005/11/22 08:33:29 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | local socket = require("socket") | 7 | local socket = require("socket") |
8 | host = host or "*" | 8 | host = host or "*" |
diff --git a/src/auxiliar.c b/src/auxiliar.c index fcc7e23..9514970 100644 --- a/src/auxiliar.c +++ b/src/auxiliar.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * Auxiliar routines for class hierarchy manipulation | 2 | * Auxiliar routines for class hierarchy manipulation |
3 | * LuaSocket toolkit | 3 | * LuaSocket toolkit |
4 | * | 4 | * |
5 | * RCS ID: $Id$ | 5 | * RCS ID: $Id: auxiliar.c,v 1.14 2005/10/07 04:40:59 diego Exp $ |
6 | \*=========================================================================*/ | 6 | \*=========================================================================*/ |
7 | #include <string.h> | 7 | #include <string.h> |
8 | #include <stdio.h> | 8 | #include <stdio.h> |
diff --git a/src/buffer.c b/src/buffer.c index 5be0faf..fbe00eb 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * Input/Output interface for Lua programs | 2 | * Input/Output interface for Lua programs |
3 | * LuaSocket toolkit | 3 | * LuaSocket toolkit |
4 | * | 4 | * |
5 | * RCS ID: $Id$ | 5 | * RCS ID: $Id: buffer.c,v 1.29 2009/05/27 09:31:35 diego Exp $ |
6 | \*=========================================================================*/ | 6 | \*=========================================================================*/ |
7 | #include "lua.h" | 7 | #include "lua.h" |
8 | #include "lauxlib.h" | 8 | #include "lauxlib.h" |
diff --git a/src/except.c b/src/except.c index fc4c038..5faa5be 100644 --- a/src/except.c +++ b/src/except.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * Simple exception support | 2 | * Simple exception support |
3 | * LuaSocket toolkit | 3 | * LuaSocket toolkit |
4 | * | 4 | * |
5 | * RCS ID: $Id$ | 5 | * RCS ID: $Id: except.c,v 1.8 2005/09/29 06:11:41 diego Exp $ |
6 | \*=========================================================================*/ | 6 | \*=========================================================================*/ |
7 | #include <stdio.h> | 7 | #include <stdio.h> |
8 | 8 | ||
diff --git a/src/ftp.lua b/src/ftp.lua index c90a65c..1d5ff77 100644 --- a/src/ftp.lua +++ b/src/ftp.lua | |||
@@ -2,7 +2,7 @@ | |||
2 | -- FTP support for the Lua language | 2 | -- FTP support for the Lua language |
3 | -- LuaSocket toolkit. | 3 | -- LuaSocket toolkit. |
4 | -- Author: Diego Nehab | 4 | -- Author: Diego Nehab |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: ftp.lua,v 1.45 2007/07/11 19:25:47 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | 7 | ||
8 | ----------------------------------------------------------------------------- | 8 | ----------------------------------------------------------------------------- |
diff --git a/src/headers.lua b/src/headers.lua new file mode 100644 index 0000000..f92ee7a --- /dev/null +++ b/src/headers.lua | |||
@@ -0,0 +1,100 @@ | |||
1 | ----------------------------------------------------------------------------- | ||
2 | -- Canonic header field capitalization | ||
3 | -- LuaSocket toolkit. | ||
4 | -- Author: Diego Nehab | ||
5 | -- RCS ID: $Id$ | ||
6 | ----------------------------------------------------------------------------- | ||
7 | module("socket.headers") | ||
8 | |||
9 | canonic = { | ||
10 | ["accept"] = "Accept", | ||
11 | ["accept-charset"] = "Accept-Charset", | ||
12 | ["accept-encoding"] = "Accept-Encoding", | ||
13 | ["accept-language"] = "Accept-Language", | ||
14 | ["accept-ranges"] = "Accept-Ranges", | ||
15 | ["action"] = "Action", | ||
16 | ["alternate-recipient"] = "Alternate-Recipient", | ||
17 | ["age"] = "Age", | ||
18 | ["allow"] = "Allow", | ||
19 | ["arrival-date"] = "Arrival-Date", | ||
20 | ["authorization"] = "Authorization", | ||
21 | ["bcc"] = "Bcc", | ||
22 | ["cache-control"] = "Cache-Control", | ||
23 | ["cc"] = "Cc", | ||
24 | ["comments"] = "Comments", | ||
25 | ["connection"] = "Connection", | ||
26 | ["content-description"] = "Content-Description", | ||
27 | ["content-disposition"] = "Content-Disposition", | ||
28 | ["content-encoding"] = "Content-Encoding", | ||
29 | ["content-id"] = "Content-ID", | ||
30 | ["content-language"] = "Content-Language", | ||
31 | ["content-length"] = "Content-Length", | ||
32 | ["content-location"] = "Content-Location", | ||
33 | ["content-md5"] = "Content-MD5", | ||
34 | ["content-range"] = "Content-Range", | ||
35 | ["content-transfer-encoding"] = "Content-Transfer-Encoding", | ||
36 | ["content-type"] = "Content-Type", | ||
37 | ["date"] = "Date", | ||
38 | ["diagnostic-code"] = "Diagnostic-Code", | ||
39 | ["dsn-gateway"] = "DSN-Gateway", | ||
40 | ["etag"] = "ETag", | ||
41 | ["expect"] = "Expect", | ||
42 | ["expires"] = "Expires", | ||
43 | ["final-log-id"] = "Final-Log-ID", | ||
44 | ["final-recipient"] = "Final-Recipient", | ||
45 | ["from"] = "From", | ||
46 | ["host"] = "Host", | ||
47 | ["if-match"] = "If-Match", | ||
48 | ["if-modified-since"] = "If-Modified-Since", | ||
49 | ["if-none-match"] = "If-None-Match", | ||
50 | ["if-range"] = "If-Range", | ||
51 | ["if-unmodified-since"] = "If-Unmodified-Since", | ||
52 | ["in-reply-to"] = "In-Reply-To", | ||
53 | ["keywords"] = "Keywords", | ||
54 | ["last-attempt-date"] = "Last-Attempt-Date", | ||
55 | ["last-modified"] = "Last-Modified", | ||
56 | ["location"] = "Location", | ||
57 | ["max-forwards"] = "Max-Forwards", | ||
58 | ["message-id"] = "Message-ID", | ||
59 | ["mime-version"] = "MIME-Version", | ||
60 | ["original-envelope-id"] = "Original-Envelope-ID", | ||
61 | ["original-recipient"] = "Original-Recipient", | ||
62 | ["pragma"] = "Pragma", | ||
63 | ["proxy-authenticate"] = "Proxy-Authenticate", | ||
64 | ["proxy-authorization"] = "Proxy-Authorization", | ||
65 | ["range"] = "Range", | ||
66 | ["received"] = "Received", | ||
67 | ["received-from-mta"] = "Received-From-MTA", | ||
68 | ["references"] = "References", | ||
69 | ["referer"] = "Referer", | ||
70 | ["remote-mta"] = "Remote-MTA", | ||
71 | ["reply-to"] = "Reply-To", | ||
72 | ["reporting-mta"] = "Reporting-MTA", | ||
73 | ["resent-bcc"] = "Resent-Bcc", | ||
74 | ["resent-cc"] = "Resent-Cc", | ||
75 | ["resent-date"] = "Resent-Date", | ||
76 | ["resent-from"] = "Resent-From", | ||
77 | ["resent-message-id"] = "Resent-Message-ID", | ||
78 | ["resent-reply-to"] = "Resent-Reply-To", | ||
79 | ["resent-sender"] = "Resent-Sender", | ||
80 | ["resent-to"] = "Resent-To", | ||
81 | ["retry-after"] = "Retry-After", | ||
82 | ["return-path"] = "Return-Path", | ||
83 | ["sender"] = "Sender", | ||
84 | ["server"] = "Server", | ||
85 | ["smtp-remote-recipient"] = "SMTP-Remote-Recipient", | ||
86 | ["status"] = "Status", | ||
87 | ["subject"] = "Subject", | ||
88 | ["te"] = "TE", | ||
89 | ["to"] = "To", | ||
90 | ["trailer"] = "Trailer", | ||
91 | ["transfer-encoding"] = "Transfer-Encoding", | ||
92 | ["upgrade"] = "Upgrade", | ||
93 | ["user-agent"] = "User-Agent", | ||
94 | ["vary"] = "Vary", | ||
95 | ["via"] = "Via", | ||
96 | ["warning"] = "Warning", | ||
97 | ["will-retry-until"] = "Will-Retry-Until", | ||
98 | ["www-authenticate"] = "WWW-Authenticate", | ||
99 | ["x-mailer"] = "X-Mailer", | ||
100 | } | ||
diff --git a/src/http.lua b/src/http.lua index 4c27149..029a367 100644 --- a/src/http.lua +++ b/src/http.lua | |||
@@ -2,7 +2,7 @@ | |||
2 | -- HTTP/1.1 client support for the Lua language. | 2 | -- HTTP/1.1 client support for the Lua language. |
3 | -- LuaSocket toolkit. | 3 | -- LuaSocket toolkit. |
4 | -- Author: Diego Nehab | 4 | -- Author: Diego Nehab |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: http.lua,v 1.72 2009/05/27 09:31:35 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | 7 | ||
8 | ----------------------------------------------------------------------------- | 8 | ----------------------------------------------------------------------------- |
@@ -2,7 +2,7 @@ | |||
2 | * Internet domain functions | 2 | * Internet domain functions |
3 | * LuaSocket toolkit | 3 | * LuaSocket toolkit |
4 | * | 4 | * |
5 | * RCS ID: $Id$ | 5 | * RCS ID: $Id: inet.c,v 1.28 2005/10/07 04:40:59 diego Exp $ |
6 | \*=========================================================================*/ | 6 | \*=========================================================================*/ |
7 | #include <stdio.h> | 7 | #include <stdio.h> |
8 | #include <string.h> | 8 | #include <string.h> |
@@ -16,14 +16,16 @@ | |||
16 | * Internal function prototypes. | 16 | * Internal function prototypes. |
17 | \*=========================================================================*/ | 17 | \*=========================================================================*/ |
18 | static int inet_global_toip(lua_State *L); | 18 | static int inet_global_toip(lua_State *L); |
19 | static int inet_global_toip6(lua_State *L); | ||
19 | static int inet_global_tohostname(lua_State *L); | 20 | static int inet_global_tohostname(lua_State *L); |
20 | static void inet_pushresolved(lua_State *L, struct hostent *hp); | 21 | static void inet_pushresolved(lua_State *L, struct hostent *hp); |
21 | static int inet_global_gethostname(lua_State *L); | 22 | static int inet_global_gethostname(lua_State *L); |
22 | 23 | ||
23 | /* DNS functions */ | 24 | /* DNS functions */ |
24 | static luaL_reg func[] = { | 25 | static luaL_reg func[] = { |
25 | { "toip", inet_global_toip }, | 26 | { "toip", inet_global_toip}, |
26 | { "tohostname", inet_global_tohostname }, | 27 | { "toip6", inet_global_toip6}, |
28 | { "tohostname", inet_global_tohostname}, | ||
27 | { "gethostname", inet_global_gethostname}, | 29 | { "gethostname", inet_global_gethostname}, |
28 | { NULL, NULL} | 30 | { NULL, NULL} |
29 | }; | 31 | }; |
@@ -95,6 +97,50 @@ static int inet_global_toip(lua_State *L) | |||
95 | return 2; | 97 | return 2; |
96 | } | 98 | } |
97 | 99 | ||
100 | static int inet_global_toip6(lua_State *L) | ||
101 | { | ||
102 | const char *hostname = luaL_checkstring(L, 1); | ||
103 | struct addrinfo *iterator = NULL, *resolved = NULL; | ||
104 | struct addrinfo hints; | ||
105 | int i = 1, ret = 0; | ||
106 | memset(&hints, 0, sizeof(hints)); | ||
107 | hints.ai_socktype = SOCK_STREAM; | ||
108 | hints.ai_family = PF_UNSPEC; | ||
109 | ret = getaddrinfo(hostname, NULL, &hints, &resolved); | ||
110 | if (ret != 0) { | ||
111 | lua_pushnil(L); | ||
112 | lua_pushstring(L, "getaddrinfo returned error"); | ||
113 | return 2; | ||
114 | } | ||
115 | lua_newtable(L); | ||
116 | for (iterator = resolved; iterator; iterator = iterator->ai_next) { | ||
117 | char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; | ||
118 | getnameinfo(iterator->ai_addr, iterator->ai_addrlen, hbuf, sizeof(hbuf), | ||
119 | sbuf, 0, NI_NUMERICHOST); | ||
120 | lua_pushnumber(L, i); | ||
121 | lua_newtable(L); | ||
122 | switch (iterator->ai_family) { | ||
123 | case AF_INET: | ||
124 | lua_pushliteral(L, "family"); | ||
125 | lua_pushliteral(L, "inet"); | ||
126 | lua_settable(L, -3); | ||
127 | break; | ||
128 | case AF_INET6: | ||
129 | lua_pushliteral(L, "family"); | ||
130 | lua_pushliteral(L, "inet6"); | ||
131 | lua_settable(L, -3); | ||
132 | break;; | ||
133 | } | ||
134 | lua_pushliteral(L, "addr"); | ||
135 | lua_pushstring(L, hbuf); | ||
136 | lua_settable(L, -3); | ||
137 | lua_settable(L, -3); | ||
138 | i++; | ||
139 | } | ||
140 | freeaddrinfo(resolved); | ||
141 | return 1; | ||
142 | } | ||
143 | |||
98 | 144 | ||
99 | /*-------------------------------------------------------------------------*\ | 145 | /*-------------------------------------------------------------------------*\ |
100 | * Gets the host name | 146 | * Gets the host name |
@@ -2,7 +2,7 @@ | |||
2 | * Input/Output abstraction | 2 | * Input/Output abstraction |
3 | * LuaSocket toolkit | 3 | * LuaSocket toolkit |
4 | * | 4 | * |
5 | * RCS ID: $Id$ | 5 | * RCS ID: $Id: io.c,v 1.6 2005/09/29 06:11:41 diego Exp $ |
6 | \*=========================================================================*/ | 6 | \*=========================================================================*/ |
7 | #include "io.h" | 7 | #include "io.h" |
8 | 8 | ||
diff --git a/src/ltn12.lua b/src/ltn12.lua index f10ad18..b42689a 100644 --- a/src/ltn12.lua +++ b/src/ltn12.lua | |||
@@ -2,7 +2,7 @@ | |||
2 | -- LTN12 - Filters, sources, sinks and pumps. | 2 | -- LTN12 - Filters, sources, sinks and pumps. |
3 | -- LuaSocket toolkit. | 3 | -- LuaSocket toolkit. |
4 | -- Author: Diego Nehab | 4 | -- Author: Diego Nehab |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: ltn12.lua,v 1.31 2006/04/03 04:45:42 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | 7 | ||
8 | ----------------------------------------------------------------------------- | 8 | ----------------------------------------------------------------------------- |
diff --git a/src/luasocket.h b/src/luasocket.h index d7a78bb..3949421 100644 --- a/src/luasocket.h +++ b/src/luasocket.h | |||
@@ -11,8 +11,8 @@ | |||
11 | /*-------------------------------------------------------------------------*\ | 11 | /*-------------------------------------------------------------------------*\ |
12 | * Current socket library version | 12 | * Current socket library version |
13 | \*-------------------------------------------------------------------------*/ | 13 | \*-------------------------------------------------------------------------*/ |
14 | #define LUASOCKET_VERSION "LuaSocket 2.0.3" | 14 | #define LUASOCKET_VERSION "LuaSocket 2.1.0" |
15 | #define LUASOCKET_COPYRIGHT "Copyright (C) 1999-2009 Diego Nehab" | 15 | #define LUASOCKET_COPYRIGHT "Copyright (C) 1999-2011 Diego Nehab" |
16 | #define LUASOCKET_AUTHORS "Diego Nehab" | 16 | #define LUASOCKET_AUTHORS "Diego Nehab" |
17 | 17 | ||
18 | /*-------------------------------------------------------------------------*\ | 18 | /*-------------------------------------------------------------------------*\ |
@@ -2,7 +2,7 @@ | |||
2 | * MIME support functions | 2 | * MIME support functions |
3 | * LuaSocket toolkit | 3 | * LuaSocket toolkit |
4 | * | 4 | * |
5 | * RCS ID: $Id$ | 5 | * RCS ID: $Id: mime.c,v 1.29 2009/05/27 09:31:35 diego Exp $ |
6 | \*=========================================================================*/ | 6 | \*=========================================================================*/ |
7 | #include <string.h> | 7 | #include <string.h> |
8 | 8 | ||
diff --git a/src/mime.lua b/src/mime.lua index eb75db2..169eda2 100644 --- a/src/mime.lua +++ b/src/mime.lua | |||
@@ -2,7 +2,7 @@ | |||
2 | -- MIME support for the Lua language. | 2 | -- MIME support for the Lua language. |
3 | -- Author: Diego Nehab | 3 | -- Author: Diego Nehab |
4 | -- Conforming to RFCs 2045-2049 | 4 | -- Conforming to RFCs 2045-2049 |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: mime.lua,v 1.29 2007/06/11 23:44:54 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | 7 | ||
8 | ----------------------------------------------------------------------------- | 8 | ----------------------------------------------------------------------------- |
diff --git a/src/options.c b/src/options.c index 1d4c950..1f5afa8 100644 --- a/src/options.c +++ b/src/options.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * Common option interface | 2 | * Common option interface |
3 | * LuaSocket toolkit | 3 | * LuaSocket toolkit |
4 | * | 4 | * |
5 | * RCS ID: $Id$ | 5 | * RCS ID: $Id: options.c,v 1.7 2009/05/27 09:31:35 diego Exp $ |
6 | \*=========================================================================*/ | 6 | \*=========================================================================*/ |
7 | #include <string.h> | 7 | #include <string.h> |
8 | 8 | ||
diff --git a/src/select.c b/src/select.c index 8e47d0e..0931b73 100644 --- a/src/select.c +++ b/src/select.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * Select implementation | 2 | * Select implementation |
3 | * LuaSocket toolkit | 3 | * LuaSocket toolkit |
4 | * | 4 | * |
5 | * RCS ID: $Id$ | 5 | * RCS ID: $Id: select.c,v 1.23 2009/05/27 09:31:35 diego Exp $ |
6 | \*=========================================================================*/ | 6 | \*=========================================================================*/ |
7 | #include <string.h> | 7 | #include <string.h> |
8 | 8 | ||
@@ -95,8 +95,10 @@ static t_socket getfd(lua_State *L) { | |||
95 | if (!lua_isnil(L, -1)) { | 95 | if (!lua_isnil(L, -1)) { |
96 | lua_pushvalue(L, -2); | 96 | lua_pushvalue(L, -2); |
97 | lua_call(L, 1, 1); | 97 | lua_call(L, 1, 1); |
98 | if (lua_isnumber(L, -1)) | 98 | if (lua_isnumber(L, -1)) { |
99 | fd = (t_socket) lua_tonumber(L, -1); | 99 | double numfd = lua_tonumber(L, -1); |
100 | fd = (numfd >= 0.0)? (t_socket) numfd: SOCKET_INVALID; | ||
101 | } | ||
100 | } | 102 | } |
101 | lua_pop(L, 1); | 103 | lua_pop(L, 1); |
102 | return fd; | 104 | return fd; |
@@ -134,8 +136,13 @@ static void collect_fd(lua_State *L, int tab, int itab, | |||
134 | fd = getfd(L); | 136 | fd = getfd(L); |
135 | if (fd != SOCKET_INVALID) { | 137 | if (fd != SOCKET_INVALID) { |
136 | /* make sure we don't overflow the fd_set */ | 138 | /* make sure we don't overflow the fd_set */ |
139 | #ifdef _WIN32 | ||
137 | if (n >= FD_SETSIZE) | 140 | if (n >= FD_SETSIZE) |
138 | luaL_argerror(L, tab, "too many sockets"); | 141 | luaL_argerror(L, tab, "too many sockets"); |
142 | #else | ||
143 | if (fd >= FD_SETSIZE) | ||
144 | luaL_argerror(L, tab, "descriptor too large for set size"); | ||
145 | #endif | ||
139 | FD_SET(fd, set); | 146 | FD_SET(fd, set); |
140 | n++; | 147 | n++; |
141 | /* keep track of the largest descriptor so far */ | 148 | /* keep track of the largest descriptor so far */ |
diff --git a/src/smtp.lua b/src/smtp.lua index b39f5d6..e258d62 100644 --- a/src/smtp.lua +++ b/src/smtp.lua | |||
@@ -2,7 +2,7 @@ | |||
2 | -- SMTP client support for the Lua language. | 2 | -- SMTP client support for the Lua language. |
3 | -- LuaSocket toolkit. | 3 | -- LuaSocket toolkit. |
4 | -- Author: Diego Nehab | 4 | -- Author: Diego Nehab |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: smtp.lua,v 1.47 2009/05/27 09:31:35 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | 7 | ||
8 | ----------------------------------------------------------------------------- | 8 | ----------------------------------------------------------------------------- |
diff --git a/src/socket.h b/src/socket.h index 425628d..e325952 100644 --- a/src/socket.h +++ b/src/socket.h | |||
@@ -59,6 +59,7 @@ int socket_accept(p_socket ps, p_socket pa, SA *addr, | |||
59 | socklen_t *addr_len, p_timeout tm); | 59 | socklen_t *addr_len, p_timeout tm); |
60 | 60 | ||
61 | const char *socket_hoststrerror(int err); | 61 | const char *socket_hoststrerror(int err); |
62 | const char *socket_gaistrerror(int err); | ||
62 | const char *socket_strerror(int err); | 63 | const char *socket_strerror(int err); |
63 | 64 | ||
64 | /* these are perfect to use with the io abstraction module | 65 | /* these are perfect to use with the io abstraction module |
diff --git a/src/socket.lua b/src/socket.lua index 458418e..211adcd 100644 --- a/src/socket.lua +++ b/src/socket.lua | |||
@@ -1,7 +1,7 @@ | |||
1 | ----------------------------------------------------------------------------- | 1 | ----------------------------------------------------------------------------- |
2 | -- LuaSocket helper module | 2 | -- LuaSocket helper module |
3 | -- Author: Diego Nehab | 3 | -- Author: Diego Nehab |
4 | -- RCS ID: $Id$ | 4 | -- RCS ID: $Id: socket.lua,v 1.22 2005/11/22 08:33:29 diego Exp $ |
5 | ----------------------------------------------------------------------------- | 5 | ----------------------------------------------------------------------------- |
6 | 6 | ||
7 | ----------------------------------------------------------------------------- | 7 | ----------------------------------------------------------------------------- |
@@ -2,7 +2,7 @@ | |||
2 | * TCP object | 2 | * TCP object |
3 | * LuaSocket toolkit | 3 | * LuaSocket toolkit |
4 | * | 4 | * |
5 | * RCS ID: $Id$ | 5 | * RCS ID: $Id: tcp.c,v 1.42 2009/05/27 09:31:35 diego Exp $ |
6 | \*=========================================================================*/ | 6 | \*=========================================================================*/ |
7 | #include <string.h> | 7 | #include <string.h> |
8 | 8 | ||
@@ -19,6 +19,8 @@ | |||
19 | * Internal function prototypes | 19 | * Internal function prototypes |
20 | \*=========================================================================*/ | 20 | \*=========================================================================*/ |
21 | static int global_create(lua_State *L); | 21 | static int global_create(lua_State *L); |
22 | static int global_connect6(lua_State *L); | ||
23 | static int global_bind6(lua_State *L); | ||
22 | static int meth_connect(lua_State *L); | 24 | static int meth_connect(lua_State *L); |
23 | static int meth_listen(lua_State *L); | 25 | static int meth_listen(lua_State *L); |
24 | static int meth_bind(lua_State *L); | 26 | static int meth_bind(lua_State *L); |
@@ -75,6 +77,8 @@ static t_opt optset[] = { | |||
75 | /* functions in library namespace */ | 77 | /* functions in library namespace */ |
76 | static luaL_reg func[] = { | 78 | static luaL_reg func[] = { |
77 | {"tcp", global_create}, | 79 | {"tcp", global_create}, |
80 | {"connect6", global_connect6}, | ||
81 | {"bind6", global_bind6}, | ||
78 | {NULL, NULL} | 82 | {NULL, NULL} |
79 | }; | 83 | }; |
80 | 84 | ||
@@ -208,6 +212,7 @@ static int meth_bind(lua_State *L) | |||
208 | \*-------------------------------------------------------------------------*/ | 212 | \*-------------------------------------------------------------------------*/ |
209 | static int meth_connect(lua_State *L) | 213 | static int meth_connect(lua_State *L) |
210 | { | 214 | { |
215 | |||
211 | p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, "tcp{any}", 1); | 216 | p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, "tcp{any}", 1); |
212 | const char *address = luaL_checkstring(L, 2); | 217 | const char *address = luaL_checkstring(L, 2); |
213 | unsigned short port = (unsigned short) luaL_checknumber(L, 3); | 218 | unsigned short port = (unsigned short) luaL_checknumber(L, 3); |
@@ -220,7 +225,6 @@ static int meth_connect(lua_State *L) | |||
220 | lua_pushstring(L, err); | 225 | lua_pushstring(L, err); |
221 | return 2; | 226 | return 2; |
222 | } | 227 | } |
223 | /* turn master object into a client object */ | ||
224 | lua_pushnumber(L, 1); | 228 | lua_pushnumber(L, 1); |
225 | return 1; | 229 | return 1; |
226 | } | 230 | } |
@@ -313,8 +317,7 @@ static int meth_settimeout(lua_State *L) | |||
313 | /*-------------------------------------------------------------------------*\ | 317 | /*-------------------------------------------------------------------------*\ |
314 | * Creates a master tcp object | 318 | * Creates a master tcp object |
315 | \*-------------------------------------------------------------------------*/ | 319 | \*-------------------------------------------------------------------------*/ |
316 | static int global_create(lua_State *L) | 320 | static int global_create(lua_State *L) { |
317 | { | ||
318 | t_socket sock; | 321 | t_socket sock; |
319 | const char *err = inet_trycreate(&sock, SOCK_STREAM); | 322 | const char *err = inet_trycreate(&sock, SOCK_STREAM); |
320 | /* try to allocate a system socket */ | 323 | /* try to allocate a system socket */ |
@@ -337,3 +340,173 @@ static int global_create(lua_State *L) | |||
337 | return 2; | 340 | return 2; |
338 | } | 341 | } |
339 | } | 342 | } |
343 | |||
344 | static const char *trybind6(const char *localaddr, const char *localserv, | ||
345 | struct addrinfo *bindhints, p_tcp tcp) { | ||
346 | struct addrinfo *iterator = NULL, *resolved = NULL; | ||
347 | const char *err = NULL; | ||
348 | /* translate luasocket special values to C */ | ||
349 | if (strcmp(localaddr, "*") == 0) localaddr = NULL; | ||
350 | if (!localserv) localserv = "0"; | ||
351 | /* try resolving */ | ||
352 | err = socket_gaistrerror(getaddrinfo(localaddr, localserv, | ||
353 | bindhints, &resolved)); | ||
354 | if (err) { | ||
355 | if (resolved) freeaddrinfo(resolved); | ||
356 | return err; | ||
357 | } | ||
358 | /* iterate over resolved addresses until one is good */ | ||
359 | for (iterator = resolved; iterator; iterator = iterator->ai_next) { | ||
360 | /* create a new socket each time because parameters | ||
361 | * may have changed */ | ||
362 | const char *err = socket_strerror(socket_create(&tcp->sock, | ||
363 | iterator->ai_family, iterator->ai_socktype, | ||
364 | iterator->ai_protocol)); | ||
365 | /* if failed to create socket, bail out */ | ||
366 | if (err != NULL) { | ||
367 | freeaddrinfo(resolved); | ||
368 | return err; | ||
369 | } | ||
370 | /* all sockets are set as non-blocking initially */ | ||
371 | socket_setnonblocking(&tcp->sock); | ||
372 | /* try binding to local address */ | ||
373 | err = socket_strerror(socket_bind(&tcp->sock, | ||
374 | (SA *) iterator->ai_addr, | ||
375 | iterator->ai_addrlen)); | ||
376 | /* if faiiled, we try the next one */ | ||
377 | if (err != NULL) socket_destroy(&tcp->sock); | ||
378 | /* if success, we abort loop */ | ||
379 | else break; | ||
380 | } | ||
381 | /* at this point, if err is not set, se succeeded */ | ||
382 | if (err == NULL) { | ||
383 | /* save family of chosen local address */ | ||
384 | bindhints->ai_family = iterator->ai_family; | ||
385 | } | ||
386 | /* cleanup and return error */ | ||
387 | freeaddrinfo(resolved); | ||
388 | return err; | ||
389 | } | ||
390 | |||
391 | static int global_bind6(lua_State *L) { | ||
392 | const char *localaddr = luaL_checkstring(L, 1); | ||
393 | const char *localserv = luaL_checkstring(L, 2); | ||
394 | int backlog = luaL_checkint(L, 3); | ||
395 | p_tcp tcp = (p_tcp) lua_newuserdata(L, sizeof(t_tcp)); | ||
396 | struct addrinfo bindhints; | ||
397 | const char *err = NULL; | ||
398 | /* initialize tcp structure */ | ||
399 | io_init(&tcp->io, (p_send) socket_send, (p_recv) socket_recv, | ||
400 | (p_error) socket_ioerror, &tcp->sock); | ||
401 | timeout_init(&tcp->tm, -1, -1); | ||
402 | buffer_init(&tcp->buf, &tcp->io, &tcp->tm); | ||
403 | tcp->sock = SOCKET_INVALID; | ||
404 | /* try binding to local address */ | ||
405 | memset(&bindhints, 0, sizeof(bindhints)); | ||
406 | bindhints.ai_socktype = SOCK_STREAM; | ||
407 | bindhints.ai_family = PF_UNSPEC; | ||
408 | bindhints.ai_flags = AI_PASSIVE; | ||
409 | err = trybind6(localaddr, localserv, &bindhints, tcp); | ||
410 | if (err == NULL) { | ||
411 | /* all server sockets initially with reuseaddr set */ | ||
412 | int val = 1; | ||
413 | setsockopt(tcp->sock, SOL_SOCKET, SO_REUSEADDR, | ||
414 | (char *) &val, sizeof(val)); | ||
415 | /* set the backlog and listen */ | ||
416 | err = socket_strerror(socket_listen(&tcp->sock, backlog)); | ||
417 | if (err) { | ||
418 | socket_destroy(&tcp->sock); | ||
419 | lua_pushnil(L); | ||
420 | lua_pushstring(L, err); | ||
421 | return 2; | ||
422 | } | ||
423 | auxiliar_setclass(L, "tcp{server}", -1); | ||
424 | return 1; | ||
425 | } else { | ||
426 | lua_pushnil(L); | ||
427 | lua_pushstring(L, err); | ||
428 | return 2; | ||
429 | } | ||
430 | } | ||
431 | |||
432 | static const char *tryconnect6(const char *remoteaddr, const char *remoteserv, | ||
433 | struct addrinfo *connecthints, p_tcp tcp) { | ||
434 | struct addrinfo *iterator = NULL, *resolved = NULL; | ||
435 | const char *err = NULL; | ||
436 | /* try resolving */ | ||
437 | err = socket_gaistrerror(getaddrinfo(remoteaddr, remoteserv, | ||
438 | connecthints, &resolved)); | ||
439 | if (err != NULL) { | ||
440 | if (resolved) freeaddrinfo(resolved); | ||
441 | return err; | ||
442 | } | ||
443 | /* iterate over all returned addresses trying to connect */ | ||
444 | for (iterator = resolved; iterator; iterator = iterator->ai_next) { | ||
445 | p_timeout tm = timeout_markstart(&tcp->tm); | ||
446 | /* create new socket if one wasn't created by the bind stage */ | ||
447 | if (tcp->sock == SOCKET_INVALID) { | ||
448 | const char *err = socket_strerror(socket_create(&tcp->sock, | ||
449 | iterator->ai_family, iterator->ai_socktype, | ||
450 | iterator->ai_protocol)); | ||
451 | if (err != NULL) { | ||
452 | freeaddrinfo(resolved); | ||
453 | return err; | ||
454 | } | ||
455 | /* all sockets initially non-blocking */ | ||
456 | socket_setnonblocking(&tcp->sock); | ||
457 | } | ||
458 | /* finally try connecting to remote address */ | ||
459 | err = socket_strerror(socket_connect(&tcp->sock, | ||
460 | (SA *) iterator->ai_addr, | ||
461 | iterator->ai_addrlen, tm)); | ||
462 | /* if success, break out of loop */ | ||
463 | if (err == NULL) break; | ||
464 | } | ||
465 | |||
466 | freeaddrinfo(resolved); | ||
467 | /* here, if err is set, we failed */ | ||
468 | return err; | ||
469 | } | ||
470 | |||
471 | static int global_connect6(lua_State *L) { | ||
472 | const char *remoteaddr = luaL_checkstring(L, 1); | ||
473 | const char *remoteserv = luaL_checkstring(L, 2); | ||
474 | const char *localaddr = luaL_optstring(L, 3, NULL); | ||
475 | const char *localserv = luaL_optstring(L, 4, "0"); | ||
476 | p_tcp tcp = (p_tcp) lua_newuserdata(L, sizeof(t_tcp)); | ||
477 | struct addrinfo bindhints, connecthints; | ||
478 | const char *err = NULL; | ||
479 | /* initialize tcp structure */ | ||
480 | io_init(&tcp->io, (p_send) socket_send, (p_recv) socket_recv, | ||
481 | (p_error) socket_ioerror, &tcp->sock); | ||
482 | timeout_init(&tcp->tm, -1, -1); | ||
483 | buffer_init(&tcp->buf, &tcp->io, &tcp->tm); | ||
484 | tcp->sock = SOCKET_INVALID; | ||
485 | /* allow user to pick local address and port */ | ||
486 | memset(&bindhints, 0, sizeof(bindhints)); | ||
487 | bindhints.ai_socktype = SOCK_STREAM; | ||
488 | bindhints.ai_family = PF_UNSPEC; | ||
489 | bindhints.ai_flags = AI_PASSIVE; | ||
490 | if (localaddr) { | ||
491 | err = trybind6(localaddr, localserv, &bindhints, tcp); | ||
492 | if (err) { | ||
493 | lua_pushnil(L); | ||
494 | lua_pushstring(L, err); | ||
495 | return 2; | ||
496 | } | ||
497 | } | ||
498 | /* try to connect to remote address and port */ | ||
499 | memset(&connecthints, 0, sizeof(connecthints)); | ||
500 | connecthints.ai_socktype = SOCK_STREAM; | ||
501 | /* make sure we try to connect only to the same family */ | ||
502 | connecthints.ai_family = bindhints.ai_family; | ||
503 | err = tryconnect6(remoteaddr, remoteserv, &connecthints, tcp); | ||
504 | if (err) { | ||
505 | socket_destroy(&tcp->sock); | ||
506 | lua_pushnil(L); | ||
507 | lua_pushstring(L, err); | ||
508 | return 2; | ||
509 | } | ||
510 | auxiliar_setclass(L, "tcp{client}", -1); | ||
511 | return 1; | ||
512 | } | ||
diff --git a/src/timeout.c b/src/timeout.c index fb015f9..cc7309c 100644 --- a/src/timeout.c +++ b/src/timeout.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * Timeout management functions | 2 | * Timeout management functions |
3 | * LuaSocket toolkit | 3 | * LuaSocket toolkit |
4 | * | 4 | * |
5 | * RCS ID: $Id$ | 5 | * RCS ID: $Id: timeout.c,v 1.31 2009/05/27 09:31:35 diego Exp $ |
6 | \*=========================================================================*/ | 6 | \*=========================================================================*/ |
7 | #include <stdio.h> | 7 | #include <stdio.h> |
8 | #include <limits.h> | 8 | #include <limits.h> |
@@ -2,7 +2,7 @@ | |||
2 | -- Unified SMTP/FTP subsystem | 2 | -- Unified SMTP/FTP subsystem |
3 | -- LuaSocket toolkit. | 3 | -- LuaSocket toolkit. |
4 | -- Author: Diego Nehab | 4 | -- Author: Diego Nehab |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: tp.lua,v 1.23 2009/05/27 09:31:35 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | 7 | ||
8 | ----------------------------------------------------------------------------- | 8 | ----------------------------------------------------------------------------- |
@@ -2,7 +2,7 @@ | |||
2 | * UDP object | 2 | * UDP object |
3 | * LuaSocket toolkit | 3 | * LuaSocket toolkit |
4 | * | 4 | * |
5 | * RCS ID: $Id$ | 5 | * RCS ID: $Id: udp.c,v 1.30 2009/05/27 09:31:35 diego Exp $ |
6 | \*=========================================================================*/ | 6 | \*=========================================================================*/ |
7 | #include <string.h> | 7 | #include <string.h> |
8 | 8 | ||
@@ -2,7 +2,7 @@ | |||
2 | * Unix domain socket | 2 | * Unix domain socket |
3 | * LuaSocket toolkit | 3 | * LuaSocket toolkit |
4 | * | 4 | * |
5 | * RCS ID: $Id$ | 5 | * RCS ID: $Id: unix.c,v 1.14 2009/05/27 09:31:35 diego Exp $ |
6 | \*=========================================================================*/ | 6 | \*=========================================================================*/ |
7 | #include <string.h> | 7 | #include <string.h> |
8 | 8 | ||
diff --git a/src/url.lua b/src/url.lua index 7623557..2158796 100644 --- a/src/url.lua +++ b/src/url.lua | |||
@@ -2,7 +2,7 @@ | |||
2 | -- URI parsing, composition and relative URL resolution | 2 | -- URI parsing, composition and relative URL resolution |
3 | -- LuaSocket toolkit. | 3 | -- LuaSocket toolkit. |
4 | -- Author: Diego Nehab | 4 | -- Author: Diego Nehab |
5 | -- RCS ID: $Id$ | 5 | -- RCS ID: $Id: url.lua,v 1.38 2006/04/03 04:45:42 diego Exp $ |
6 | ----------------------------------------------------------------------------- | 6 | ----------------------------------------------------------------------------- |
7 | 7 | ||
8 | ----------------------------------------------------------------------------- | 8 | ----------------------------------------------------------------------------- |
@@ -195,13 +195,7 @@ function build(parsed) | |||
195 | end | 195 | end |
196 | if userinfo then authority = userinfo .. "@" .. authority end | 196 | if userinfo then authority = userinfo .. "@" .. authority end |
197 | end | 197 | end |
198 | if authority then | 198 | if authority then url = "//" .. authority .. url end |
199 | if string.sub(url, 1, 1) == "/" then | ||
200 | url = "//" .. authority .. url | ||
201 | else | ||
202 | url = "//" .. authority .. "/" .. url | ||
203 | end | ||
204 | end | ||
205 | if parsed.scheme then url = parsed.scheme .. ":" .. url end | 199 | if parsed.scheme then url = parsed.scheme .. ":" .. url end |
206 | if parsed.fragment then url = url .. "#" .. parsed.fragment end | 200 | if parsed.fragment then url = url .. "#" .. parsed.fragment end |
207 | -- url = string.gsub(url, "%s", "") | 201 | -- url = string.gsub(url, "%s", "") |
@@ -217,8 +211,8 @@ end | |||
217 | -- corresponding absolute url | 211 | -- corresponding absolute url |
218 | ----------------------------------------------------------------------------- | 212 | ----------------------------------------------------------------------------- |
219 | function absolute(base_url, relative_url) | 213 | function absolute(base_url, relative_url) |
220 | local base_parsed = base_url | ||
221 | if base.type(base_url) == "table" then | 214 | if base.type(base_url) == "table" then |
215 | base_parsed = base_url | ||
222 | base_url = build(base_parsed) | 216 | base_url = build(base_parsed) |
223 | else | 217 | else |
224 | base_parsed = parse(base_url) | 218 | base_parsed = parse(base_url) |
diff --git a/src/usocket.c b/src/usocket.c index 1ba1043..5201b7b 100644 --- a/src/usocket.c +++ b/src/usocket.c | |||
@@ -6,7 +6,7 @@ | |||
6 | * The penalty of calling select to avoid busy-wait is only paid when | 6 | * The penalty of calling select to avoid busy-wait is only paid when |
7 | * the I/O call fail in the first place. | 7 | * the I/O call fail in the first place. |
8 | * | 8 | * |
9 | * RCS ID: $Id$ | 9 | * RCS ID: $Id: usocket.c,v 1.38 2007/10/13 23:55:20 diego Exp $ |
10 | \*=========================================================================*/ | 10 | \*=========================================================================*/ |
11 | #include <string.h> | 11 | #include <string.h> |
12 | #include <signal.h> | 12 | #include <signal.h> |
@@ -368,3 +368,24 @@ const char *socket_ioerror(p_socket ps, int err) { | |||
368 | (void) ps; | 368 | (void) ps; |
369 | return socket_strerror(err); | 369 | return socket_strerror(err); |
370 | } | 370 | } |
371 | |||
372 | const char *socket_gaistrerror(int err) { | ||
373 | if (err == 0) return NULL; | ||
374 | switch (err) { | ||
375 | case EAI_AGAIN: return "temporary failure in name resolution"; | ||
376 | case EAI_BADFLAGS: return "invalid value for ai_flags"; | ||
377 | case EAI_BADHINTS: return "invalid value for hints"; | ||
378 | case EAI_FAIL: return "non-recoverable failure in name resolution"; | ||
379 | case EAI_FAMILY: return "ai_family not supported"; | ||
380 | case EAI_MEMORY: return "memory allocation failure"; | ||
381 | case EAI_NONAME: | ||
382 | return "hostname or servname not provided, or not known"; | ||
383 | case EAI_OVERFLOW: return "argument buffer overflow"; | ||
384 | case EAI_PROTOCOL: return "resolved protocol is unknown"; | ||
385 | case EAI_SERVICE: return "servname not supported for socktype"; | ||
386 | case EAI_SOCKTYPE: return "ai_socktype not supported"; | ||
387 | case EAI_SYSTEM: return strerror(errno); | ||
388 | default: return "unknown error"; | ||
389 | } | ||
390 | } | ||
391 | |||
diff --git a/src/wsocket.c b/src/wsocket.c index 2d07904..c82882a 100644 --- a/src/wsocket.c +++ b/src/wsocket.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * The penalty of calling select to avoid busy-wait is only paid when | 5 | * The penalty of calling select to avoid busy-wait is only paid when |
6 | * the I/O call fail in the first place. | 6 | * the I/O call fail in the first place. |
7 | * | 7 | * |
8 | * RCS ID: $Id$ | 8 | * RCS ID: $Id: wsocket.c,v 1.36 2007/06/11 23:44:54 diego Exp $ |
9 | \*=========================================================================*/ | 9 | \*=========================================================================*/ |
10 | #include <string.h> | 10 | #include <string.h> |
11 | 11 | ||