aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiego Nehab <diego@tecgraf.puc-rio.br>2009-05-27 09:31:38 +0000
committerDiego Nehab <diego@tecgraf.puc-rio.br>2009-05-27 09:31:38 +0000
commitbce60be30fe8e9c1b0eb33128c23c93d7bca5303 (patch)
tree3927343c777fcb7764a0f2f89754a0ceab141c21
parentd1a72435d5bd3528f3c334cd4d1da16dcead47bf (diff)
downloadluasocket-bce60be30fe8e9c1b0eb33128c23c93d7bca5303.tar.gz
luasocket-bce60be30fe8e9c1b0eb33128c23c93d7bca5303.tar.bz2
luasocket-bce60be30fe8e9c1b0eb33128c23c93d7bca5303.zip
Decent makefiles!
-rw-r--r--NEW26
-rw-r--r--config60
-rw-r--r--doc/dns.html8
-rw-r--r--doc/ftp.html8
-rw-r--r--doc/http.html8
-rw-r--r--doc/index.html77
-rw-r--r--doc/installation.html8
-rw-r--r--doc/introduction.html8
-rw-r--r--doc/ltn12.html8
-rw-r--r--doc/mime.html8
-rw-r--r--doc/reference.html9
-rw-r--r--doc/smtp.html8
-rw-r--r--doc/socket.html56
-rw-r--r--doc/tcp.html16
-rw-r--r--doc/udp.html8
-rw-r--r--doc/url.html8
-rw-r--r--etc/dispatch.lua2
-rw-r--r--luasocket.sln44
-rw-r--r--makefile56
-rw-r--r--makefile.dist7
-rw-r--r--mime.vcproj176
-rw-r--r--samples/cddb.lua2
-rw-r--r--socket.vcproj217
-rw-r--r--src/auxiliar.h2
-rw-r--r--src/buffer.c2
-rw-r--r--src/buffer.h2
-rw-r--r--src/except.h2
-rw-r--r--src/http.lua10
-rw-r--r--src/inet.h2
-rw-r--r--src/io.h2
-rw-r--r--src/luasocket.c2
-rw-r--r--src/luasocket.h6
-rw-r--r--src/makefile156
-rw-r--r--src/mime.c10
-rw-r--r--src/mime.h6
-rw-r--r--src/options.c86
-rw-r--r--src/options.h36
-rw-r--r--src/select.c39
-rw-r--r--src/select.h2
-rw-r--r--src/smtp.lua8
-rw-r--r--src/socket.h2
-rw-r--r--src/tcp.c12
-rw-r--r--src/tcp.h2
-rw-r--r--src/timeout.c18
-rw-r--r--src/timeout.h2
-rw-r--r--src/tp.lua1
-rw-r--r--src/udp.c41
-rw-r--r--src/udp.h2
-rw-r--r--src/unix.c10
-rw-r--r--src/unix.h4
-rw-r--r--src/usocket.h6
-rw-r--r--src/wsocket.h9
-rw-r--r--test/README2
-rw-r--r--test/hello.lua3
-rw-r--r--test/httptest.lua10
-rw-r--r--test/mimetest.lua24
-rw-r--r--test/testclnt.lua43
-rw-r--r--test/testmesg.lua2
58 files changed, 850 insertions, 544 deletions
diff --git a/NEW b/NEW
index 0191ccd..6c6b095 100644
--- a/NEW
+++ b/NEW
@@ -2,13 +2,19 @@ What's New
2 2
3This is just a bug-fix/update release. 3This is just a bug-fix/update release.
4 4
5 * Improved: http.request() now supports deprecated HTTP/0.9 5 * Fixed: manual links to home.html changed to index.html (Robert Hahn)
6 servers (Florian Berger) 6 * Fixed: mime.unb64() returns empty string on results that start
7 * Fixed: could return "timedout" instead of "timeout" (Leo Leo) 7 with a null character (Robert Raschke)
8 * Fixed: crash when reading '*a' on closed socket (Paul Ducklin); 8 * Fixed: HTTP now automatically redirecting on 303 and 307 (Jonathan Gray)
9 * Fixed: return values are consistent when reading from closed sockets; 9 * Fixed: sleep(-1) could sleep forever wasting CPU. Now it
10 * Fixed: case sensitivity in headers of multipart messages in 10 returns immediately (MPB);
11 smtp.message() (Graham Henstridge); 11
12 * Fixed a couple instances of error() being called instead of base.error(). These would cause an error when an error was reported. :) (Ketmar Dark); 12 * Improved: FTP commands are now sent in upper case to
13 * Fixed: test script now uses pairs() iterator instead of the old 13 help buggy servers (Anders Eurenius)
14 Lua syntax (Robert Dodier). 14 * Improved: known headers now sent in canonic
15 capitalization to help buggy servers (Joseph Stewart);
16 * Improved: Clarified tcp:receive() in the manual (MPB);
17
18 * Fixed: multicast didn't work on Windows (Herbert Leuwer, Adrian Sietsma)
19 * Fixed: select() reports an error when called with more
20 sockets than FD_SETSIZE (Lorenzo Leonini)
diff --git a/config b/config
deleted file mode 100644
index 49958eb..0000000
--- a/config
+++ /dev/null
@@ -1,60 +0,0 @@
1#------
2# LuaSocket makefile configuration
3#
4
5#------
6# Output file names
7#
8EXT=so
9SOCKET_V=2.0.2
10MIME_V=1.0.2
11SOCKET_SO=socket.$(EXT).$(SOCKET_V)
12MIME_SO=mime.$(EXT).$(MIME_V)
13UNIX_SO=unix.$(EXT)
14
15#------
16# Lua includes and libraries
17#
18#LUAINC=-I/usr/local/include/lua50
19#LUAINC=-I/usr/local/include/lua5.1
20#LUAINC=-Ilua-5.1.1/src
21
22#------
23# Compat-5.1 directory
24#
25#COMPAT=compat-5.1r5
26
27#------
28# Top of your Lua installation
29# Relative paths will be inside the src tree
30#
31#INSTALL_TOP_SHARE=/usr/local/share/lua/5.0
32#INSTALL_TOP_LIB=/usr/local/lib/lua/5.0
33INSTALL_TOP_SHARE=/usr/local/share/lua/5.1
34INSTALL_TOP_LIB=/usr/local/lib/lua/5.1
35
36INSTALL_DATA=cp
37INSTALL_EXEC=cp
38
39#------
40# Compiler and linker settings
41# for Mac OS X
42#
43#CC=gcc
44#DEF= -DLUASOCKET_DEBUG -DUNIX_HAS_SUN_LEN
45#CFLAGS= $(LUAINC) -I$(COMPAT) $(DEF) -pedantic -Wall -O2 -fno-common
46#LDFLAGS=-bundle -undefined dynamic_lookup
47#LD=export MACOSX_DEPLOYMENT_TARGET="10.3"; gcc
48
49#------
50# Compiler and linker settings
51# for Linux
52CC=gcc
53DEF=-DLUASOCKET_DEBUG
54CFLAGS= $(LUAINC) $(DEF) -pedantic -Wall -O2 -fpic
55LDFLAGS=-O -shared -fpic
56LD=gcc
57
58#------
59# End of makefile configuration
60#
diff --git a/doc/dns.html b/doc/dns.html
index f4c3b07..a38e368 100644
--- a/doc/dns.html
+++ b/doc/dns.html
@@ -24,8 +24,8 @@
24</td></tr> 24</td></tr>
25</table> 25</table>
26<p class=bar> 26<p class=bar>
27<a href="home.html">home</a> &middot; 27<a href="index.html">home</a> &middot;
28<a href="home.html#download">download</a> &middot; 28<a href="index.html#download">download</a> &middot;
29<a href="installation.html">installation</a> &middot; 29<a href="installation.html">installation</a> &middot;
30<a href="introduction.html">introduction</a> &middot; 30<a href="introduction.html">introduction</a> &middot;
31<a href="reference.html">reference</a> 31<a href="reference.html">reference</a>
@@ -113,8 +113,8 @@ message.
113<hr> 113<hr>
114<center> 114<center>
115<p class=bar> 115<p class=bar>
116<a href="home.html">home</a> &middot; 116<a href="index.html">home</a> &middot;
117<a href="home.html#down">download</a> &middot; 117<a href="index.html#down">download</a> &middot;
118<a href="installation.html">installation</a> &middot; 118<a href="installation.html">installation</a> &middot;
119<a href="introduction.html">introduction</a> &middot; 119<a href="introduction.html">introduction</a> &middot;
120<a href="reference.html">reference</a> 120<a href="reference.html">reference</a>
diff --git a/doc/ftp.html b/doc/ftp.html
index 9884f31..1f6335e 100644
--- a/doc/ftp.html
+++ b/doc/ftp.html
@@ -24,8 +24,8 @@
24</td></tr> 24</td></tr>
25</table> 25</table>
26<p class=bar> 26<p class=bar>
27<a href="home.html">home</a> &middot; 27<a href="index.html">home</a> &middot;
28<a href="home.html#download">download</a> &middot; 28<a href="index.html#download">download</a> &middot;
29<a href="installation.html">installation</a> &middot; 29<a href="installation.html">installation</a> &middot;
30<a href="introduction.html">introduction</a> &middot; 30<a href="introduction.html">introduction</a> &middot;
31<a href="reference.html">reference</a> 31<a href="reference.html">reference</a>
@@ -270,8 +270,8 @@ f, e = ftp.put{
270<hr> 270<hr>
271<center> 271<center>
272<p class=bar> 272<p class=bar>
273<a href="home.html">home</a> &middot; 273<a href="index.html">home</a> &middot;
274<a href="home.html#download">download</a> &middot; 274<a href="index.html#download">download</a> &middot;
275<a href="installation.html">installation</a> &middot; 275<a href="installation.html">installation</a> &middot;
276<a href="introduction.html">introduction</a> &middot; 276<a href="introduction.html">introduction</a> &middot;
277<a href="reference.html">reference</a> 277<a href="reference.html">reference</a>
diff --git a/doc/http.html b/doc/http.html
index 0acac13..a274aef 100644
--- a/doc/http.html
+++ b/doc/http.html
@@ -24,8 +24,8 @@
24</td></tr> 24</td></tr>
25</table> 25</table>
26<p class=bar> 26<p class=bar>
27<a href="home.html">home</a> &middot; 27<a href="index.html">home</a> &middot;
28<a href="home.html#download">download</a> &middot; 28<a href="index.html#download">download</a> &middot;
29<a href="introduction.html">introduction</a> &middot; 29<a href="introduction.html">introduction</a> &middot;
30<a href="introduction.html">introduction</a> &middot; 30<a href="introduction.html">introduction</a> &middot;
31<a href="reference.html">reference</a> 31<a href="reference.html">reference</a>
@@ -314,8 +314,8 @@ r, c = http.request {
314<hr> 314<hr>
315<center> 315<center>
316<p class=bar> 316<p class=bar>
317<a href="home.html">home</a> &middot; 317<a href="index.html">home</a> &middot;
318<a href="home.html#download">download</a> &middot; 318<a href="index.html#download">download</a> &middot;
319<a href="installation.html">installation</a> &middot; 319<a href="installation.html">installation</a> &middot;
320<a href="introduction.html">introduction</a> &middot; 320<a href="introduction.html">introduction</a> &middot;
321<a href="reference.html">reference</a> 321<a href="reference.html">reference</a>
diff --git a/doc/index.html b/doc/index.html
index 57a7907..5b54c59 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -24,8 +24,8 @@
24</td></tr> 24</td></tr>
25</table> 25</table>
26<p class=bar> 26<p class=bar>
27<a href="home.html">home</a> &middot; 27<a href="index.html">home</a> &middot;
28<a href="home.html#download">download</a> &middot; 28<a href="index.html#download">download</a> &middot;
29<a href="installation.html">installation</a> &middot; 29<a href="installation.html">installation</a> &middot;
30<a href="introduction.html">introduction</a> &middot; 30<a href="introduction.html">introduction</a> &middot;
31<a href="reference.html">reference</a> 31<a href="reference.html">reference</a>
@@ -87,7 +87,7 @@ Author: <A href="http://www.cs.princeton.edu/~diego">Diego Nehab</a>
87<h2 id=download>Download</h2> 87<h2 id=download>Download</h2>
88 88
89<p> 89<p>
90LuaSocket version 2.0.2 is now available for download! It is 90LuaSocket version 2.0.3 is now available for download! It is
91compatible with Lua&nbsp;5.1, and has 91compatible with Lua&nbsp;5.1, and has
92been tested on Windows&nbsp;XP, Linux, and Mac OS X. Chances 92been tested on Windows&nbsp;XP, Linux, and Mac OS X. Chances
93are it works well on most UNIX distributions and Windows flavors. 93are it works well on most UNIX distributions and Windows flavors.
@@ -118,14 +118,15 @@ manual to find out how to properly install the library.
118<h2 id=thanks>Special thanks</h2> 118<h2 id=thanks>Special thanks</h2>
119 119
120<p> 120<p>
121Throughout LuaSocket's history, many people gave suggestions that helped 121Throughout LuaSocket's history, many people gave suggestions
122improve it. For that, I thank the Lua community. 122that helped improve it. For that, I thank the Lua community.
123Special thanks go to 123Special thanks go to David Burgess, who has helped push the
124David Burgess, who has helped push the library to a new level of quality and 124library to a new level of quality and from whom I have
125from whom I have learned a lot of stuff that doesn't show up in RFCs. 125learned a lot of stuff that doesn't show up in RFCs.
126Special thanks also to Carlos Cassino, who played a big part in the 126Special thanks also to Carlos Cassino, who played a big part
127extensible design seen in the C core of LuaSocket 2.0. Mike Pall 127in the extensible design seen in the C core of LuaSocket
128has been helping a lot too! Thanks to you all! 1282.0. Mike Pall has been helping a lot too! Thanks to you
129all!
129</p> 130</p>
130 131
131<!-- whatsnew +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> 132<!-- whatsnew +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -133,44 +134,26 @@ has been helping a lot too! Thanks to you all!
133<h2 id=new>What's New</h2> 134<h2 id=new>What's New</h2>
134 135
135<p> 136<p>
1362.0.2 is just a bug-fix/update release. 1372.0.3 is just a bug-fix/update release.
137</p> 138</p>
138 139
139<ul> 140<ul>
140<li> Improved: http.request() now supports deprecated 141<li> Fixed: multicast didn't work on Windows, or anywhere
141HTTP/0.9 servers (Florian Berger); 142 else for that matter (Herbert Leuwer, Adrian Sietsma)
142<li> Fixed: could return "timedout" instead of "timeout" (Leo Leo); 143<li> Fixed: select() now reports an error when called with more
143<li> Fixed: crash when reading '*a' on closed socket (Paul Ducklin); 144 sockets than FD_SETSIZE (Lorenzo Leonini)
144<li> Fixed: return values are consistent when reading from closed sockets; 145<li> Fixed: manual links to home.html changed to index.html (Robert Hahn)
145<li> Fixed: case sensitivity in headers of multipart 146<li> Fixed: mime.unb64() would return an empty string on results that started
146messages in smtp.message() (Graham Henstridge); 147 with a null character (Robert Raschke)
147<li> Fixed a couple instances of error() being called instead of 148<li> Fixed: HTTP now automatically redirects on 303 and 307 (Jonathan Gray)
148base.error(). These would cause an error when an error was 149<li> Fixed: calling sleep() with negative numbers could
149reported :) (Ketmar Dark); 150 block forever, wasting CPU. Now it returns immediately (MPB);
150<li> Fixed: test script now uses pairs() iterator instead 151<li> Improved: FTP commands are now sent in upper case to
151of the old Lua syntax (Robert Dodier). 152 help buggy servers (Anders Eurenius)
152</ul> 153<li> Improved: known headers now sent in canonic
153 154 capitalization to help buggy servers (Joseph Stewart);
154<p> 155<li> Improved: Clarified tcp:receive() in the manual (MPB);
1552.0.1 is just a bug-fix/update release. 156<li> Improved: Decent makefiles (LHF).
156</p>
157
158<ul>
159<li> Updated: now using <tt>compat-5.1r5</tt>;
160<li> Improved: <tt>http.request</tt> is more robust to
161malformed URLs (Adrian Sietsma);
162<li> Improved: the simple <tt>http.request</tt> interface sends a
163"<tt>Content-type: application/x-www-form-urlencoded</tt>"
164header (William Trenker);
165<li> Improved: <tt>http.request</tt> is robust to evil
166servers that send inappropriate 100-continue messages
167(David Burgess);
168<li> Fixed: <tt>http.request</tt> was using the old host header during
169redirects (Florian Berger);
170<li> Fixed: sample <tt>unix.c</tt> had fallen through the
171cracks during development (Matthew Percival);
172<li> Fixed: error code was not being propagated correctly in
173ftp.lua (David Burgess).
174</ul> 157</ul>
175 158
176<!-- old ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> 159<!-- old ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -190,7 +173,7 @@ still available for those that have compatibility issues.
190<hr> 173<hr>
191<center> 174<center>
192<p class=bar> 175<p class=bar>
193<a href="home.html#download">download</a> &middot; 176<a href="index.html#download">download</a> &middot;
194<a href="installation.html">installation</a> &middot; 177<a href="installation.html">installation</a> &middot;
195<a href="introduction.html">introduction</a> &middot; 178<a href="introduction.html">introduction</a> &middot;
196<a href="reference.html">reference</a> 179<a href="reference.html">reference</a>
diff --git a/doc/installation.html b/doc/installation.html
index 0288f4a..bb9a5bb 100644
--- a/doc/installation.html
+++ b/doc/installation.html
@@ -25,8 +25,8 @@ Installation">
25</td></tr> 25</td></tr>
26</table> 26</table>
27<p class=bar> 27<p class=bar>
28<a href="home.html">home</a> &middot; 28<a href="index.html">home</a> &middot;
29<a href="home.html#download">download</a> &middot; 29<a href="index.html#download">download</a> &middot;
30<a href="installation.html">installation</a> &middot; 30<a href="installation.html">installation</a> &middot;
31<a href="introduction.html">introduction</a> &middot; 31<a href="introduction.html">introduction</a> &middot;
32<a href="reference.html">reference</a> 32<a href="reference.html">reference</a>
@@ -144,8 +144,8 @@ Lua 5.1.2 Copyright (C) 1994-2007 Lua.org, PUC-Rio
144<hr> 144<hr>
145<center> 145<center>
146<p class=bar> 146<p class=bar>
147<a href="home.html">home</a> &middot; 147<a href="index.html">home</a> &middot;
148<a href="home.html#down">download</a> &middot; 148<a href="index.html#down">download</a> &middot;
149<a href="installation.html">installation</a> &middot; 149<a href="installation.html">installation</a> &middot;
150<a href="introduction.html">introduction</a> &middot; 150<a href="introduction.html">introduction</a> &middot;
151<a href="reference.html">reference</a> 151<a href="reference.html">reference</a>
diff --git a/doc/introduction.html b/doc/introduction.html
index eff6367..fd22f48 100644
--- a/doc/introduction.html
+++ b/doc/introduction.html
@@ -25,8 +25,8 @@ Library, Support">
25</td></tr> 25</td></tr>
26</table> 26</table>
27<p class=bar> 27<p class=bar>
28<a href="home.html">home</a> &middot; 28<a href="index.html">home</a> &middot;
29<a href="home.html#download">download</a> &middot; 29<a href="index.html#download">download</a> &middot;
30<a href="installation.html">installation</a> &middot; 30<a href="installation.html">installation</a> &middot;
31<a href="introduction.html">introduction</a> &middot; 31<a href="introduction.html">introduction</a> &middot;
32<a href="reference.html">reference</a> 32<a href="reference.html">reference</a>
@@ -314,8 +314,8 @@ and many others are covered by the <a href=reference.html>reference manual</a>.
314<hr> 314<hr>
315<center> 315<center>
316<p class=bar> 316<p class=bar>
317<a href="home.html">home</a> &middot; 317<a href="index.html">home</a> &middot;
318<a href="home.html#down">download</a> &middot; 318<a href="index.html#down">download</a> &middot;
319<a href="installation.html">installation</a> &middot; 319<a href="installation.html">installation</a> &middot;
320<a href="introduction.html">introduction</a> &middot; 320<a href="introduction.html">introduction</a> &middot;
321<a href="reference.html">reference</a> 321<a href="reference.html">reference</a>
diff --git a/doc/ltn12.html b/doc/ltn12.html
index 0013950..7e2f49a 100644
--- a/doc/ltn12.html
+++ b/doc/ltn12.html
@@ -25,8 +25,8 @@ Pump, Support, Library">
25</td></tr> 25</td></tr>
26</table> 26</table>
27<p class=bar> 27<p class=bar>
28<a href="home.html">home</a> &middot; 28<a href="index.html">home</a> &middot;
29<a href="home.html#download">download</a> &middot; 29<a href="index.html#download">download</a> &middot;
30<a href="installation.html">installation</a> &middot; 30<a href="installation.html">installation</a> &middot;
31<a href="introduction.html">introduction</a> &middot; 31<a href="introduction.html">introduction</a> &middot;
32<a href="reference.html">reference</a> 32<a href="reference.html">reference</a>
@@ -411,8 +411,8 @@ Creates and returns a source that produces the contents of a
411<hr> 411<hr>
412<center> 412<center>
413<p class=bar> 413<p class=bar>
414<a href="home.html">home</a> &middot; 414<a href="index.html">home</a> &middot;
415<a href="home.html#down">download</a> &middot; 415<a href="index.html#down">download</a> &middot;
416<a href="installation.html">installation</a> &middot; 416<a href="installation.html">installation</a> &middot;
417<a href="introduction.html">introduction</a> &middot; 417<a href="introduction.html">introduction</a> &middot;
418<a href="reference.html">reference</a> 418<a href="reference.html">reference</a>
diff --git a/doc/mime.html b/doc/mime.html
index d7faf52..9844744 100644
--- a/doc/mime.html
+++ b/doc/mime.html
@@ -24,8 +24,8 @@
24</td></tr> 24</td></tr>
25</table> 25</table>
26<p class=bar> 26<p class=bar>
27<a href="home.html">home</a> &middot; 27<a href="index.html">home</a> &middot;
28<a href="home.html#download">download</a> &middot; 28<a href="index.html#download">download</a> &middot;
29<a href="installation.html">installation</a> &middot; 29<a href="installation.html">installation</a> &middot;
30<a href="introduction.html">introduction</a> &middot; 30<a href="introduction.html">introduction</a> &middot;
31<a href="reference.html">reference</a> 31<a href="reference.html">reference</a>
@@ -457,8 +457,8 @@ marker.
457<hr> 457<hr>
458<center> 458<center>
459<p class=bar> 459<p class=bar>
460<a href="home.html">home</a> &middot; 460<a href="index.html">home</a> &middot;
461<a href="home.html#down">download</a> &middot; 461<a href="index.html#down">download</a> &middot;
462<a href="installation.html">installation</a> &middot; 462<a href="installation.html">installation</a> &middot;
463<a href="introduction.html">introduction</a> &middot; 463<a href="introduction.html">introduction</a> &middot;
464<a href="reference.html">reference</a> 464<a href="reference.html">reference</a>
diff --git a/doc/reference.html b/doc/reference.html
index b329f57..31f6ecf 100644
--- a/doc/reference.html
+++ b/doc/reference.html
@@ -25,8 +25,8 @@ Support, Manual">
25</td></tr> 25</td></tr>
26</table> 26</table>
27<p class=bar> 27<p class=bar>
28<a href="home.html">home</a> &middot; 28<a href="index.html">home</a> &middot;
29<a href="home.html#download">download</a> &middot; 29<a href="index.html#download">download</a> &middot;
30<a href="installation.html">installation</a> &middot; 30<a href="installation.html">installation</a> &middot;
31<a href="introduction.html">introduction</a> &middot; 31<a href="introduction.html">introduction</a> &middot;
32<a href="reference.html">reference</a> 32<a href="reference.html">reference</a>
@@ -151,6 +151,7 @@ Support, Manual">
151<a href="socket.html#sink">sink</a>, 151<a href="socket.html#sink">sink</a>,
152<a href="socket.html#skip">skip</a>, 152<a href="socket.html#skip">skip</a>,
153<a href="socket.html#sleep">sleep</a>, 153<a href="socket.html#sleep">sleep</a>,
154<a href="socket.html#setsize">_SETSIZE</a>,
154<a href="socket.html#source">source</a>, 155<a href="socket.html#source">source</a>,
155<a href="tcp.html#tcp">tcp</a>, 156<a href="tcp.html#tcp">tcp</a>,
156<a href="socket.html#try">try</a>, 157<a href="socket.html#try">try</a>,
@@ -220,8 +221,8 @@ Support, Manual">
220<hr> 221<hr>
221<center> 222<center>
222<p class=bar> 223<p class=bar>
223<a href="home.html">home</a> &middot; 224<a href="index.html">home</a> &middot;
224<a href="home.html#down">download</a> &middot; 225<a href="index.html#down">download</a> &middot;
225<a href="installation.html">installation</a> &middot; 226<a href="installation.html">installation</a> &middot;
226<a href="introduction.html">introduction</a> &middot; 227<a href="introduction.html">introduction</a> &middot;
227<a href="reference.html">reference</a> 228<a href="reference.html">reference</a>
diff --git a/doc/smtp.html b/doc/smtp.html
index 27dd473..980b821 100644
--- a/doc/smtp.html
+++ b/doc/smtp.html
@@ -25,8 +25,8 @@ Library, Support">
25</td></tr> 25</td></tr>
26</table> 26</table>
27<p class=bar> 27<p class=bar>
28<a href="home.html">home</a> &middot; 28<a href="index.html">home</a> &middot;
29<a href="home.html#download">download</a> &middot; 29<a href="index.html#download">download</a> &middot;
30<a href="installation.html">installation</a> &middot; 30<a href="installation.html">installation</a> &middot;
31<a href="introduction.html">introduction</a> &middot; 31<a href="introduction.html">introduction</a> &middot;
32<a href="reference.html">reference</a> 32<a href="reference.html">reference</a>
@@ -398,8 +398,8 @@ r, e = smtp.send{
398<hr> 398<hr>
399<center> 399<center>
400<p class=bar> 400<p class=bar>
401<a href="home.html">home</a> &middot; 401<a href="index.html">home</a> &middot;
402<a href="home.html#down">download</a> &middot; 402<a href="index.html#down">download</a> &middot;
403<a href="installation.html">installation</a> &middot; 403<a href="installation.html">installation</a> &middot;
404<a href="introduction.html">introduction</a> &middot; 404<a href="introduction.html">introduction</a> &middot;
405<a href="reference.html">reference</a> 405<a href="reference.html">reference</a>
diff --git a/doc/socket.html b/doc/socket.html
index f096e4b..490ab50 100644
--- a/doc/socket.html
+++ b/doc/socket.html
@@ -24,8 +24,8 @@
24</td></tr> 24</td></tr>
25</table> 25</table>
26<p class=bar> 26<p class=bar>
27<a href="home.html">home</a> &middot; 27<a href="index.html">home</a> &middot;
28<a href="home.html#download">download</a> &middot; 28<a href="index.html#download">download</a> &middot;
29<a href="installation.html">installation</a> &middot; 29<a href="installation.html">installation</a> &middot;
30<a href="introduction.html">introduction</a> &middot; 30<a href="introduction.html">introduction</a> &middot;
31<a href="reference.html">reference</a> 31<a href="reference.html">reference</a>
@@ -94,6 +94,24 @@ This constant is set to <tt><b>true</b></tt> if the library was compiled
94with debug support. 94with debug support.
95</p> 95</p>
96 96
97<!-- get time +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
98
99<p class=name id=gettime>
100socket.<b>gettime()</b>
101</p>
102
103<p class=description>
104Returns the time in seconds, relative to the origin of the
105universe. You should subtract the values returned by this function
106to get meaningful values.
107</p>
108
109<pre class=example>
110t = socket.gettime()
111-- do stuff
112print(socket.gettime() - t .. " seconds elapsed")
113</pre>
114
97<!-- newtry +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> 115<!-- newtry +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
98 116
99<p class=name id=newtry> 117<p class=name id=newtry>
@@ -200,6 +218,15 @@ changed status.
200</p> 218</p>
201 219
202<p class=note> 220<p class=note>
221<b>Note: </b>: <tt>select</tt> can monitor a limited number
222of sockets, as defined by the constant <tt>socket._SETSIZE</tt>. This
223number may be as high as 1024 or as low as 64 by default,
224depending on the system. It is usually possible to change this
225at compile time. Invoking <tt>select</tt> with a larger
226number of sockets will raise an error.
227</p>
228
229<p class=note>
203<b>Important note</b>: a known bug in WinSock causes <tt>select</tt> to fail 230<b>Important note</b>: a known bug in WinSock causes <tt>select</tt> to fail
204on non-blocking TCP sockets. The function may return a socket as 231on non-blocking TCP sockets. The function may return a socket as
205writable even though the socket is <em>not</em> ready for sending. 232writable even though the socket is <em>not</em> ready for sending.
@@ -288,8 +315,8 @@ Freezes the program execution during a given amount of time.
288</p> 315</p>
289 316
290<p class=parameters> 317<p class=parameters>
291<tt>Time</tt> is the number of seconds to sleep for. 318<tt>Time</tt> is the number of seconds to sleep for. If
292The function truncates <tt>time</tt> down to the nearest integer. 319<tt>time</tt> is negative, the function returns immediately.
293</p> 320</p>
294 321
295<!-- source +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> 322<!-- source +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -324,24 +351,17 @@ side closes the connection.
324The function returns a source with the appropriate behavior. 351The function returns a source with the appropriate behavior.
325</p> 352</p>
326 353
327<!-- time ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> 354<!-- setsize ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
328 355
329<p class=name id=gettime> 356<p class=name id=setsize>
330socket.<b>gettime()</b> 357socket.<b>_SETSIZE</b>
331</p> 358</p>
332 359
333<p class=description> 360<p class=description>
334Returns the time in seconds, relative to the origin of the 361The maximum number of sockets that the <a
335universe. You should subtract the values returned by this function 362href=#select><tt>select</tt></a> function can handle.
336to get meaningful values.
337</p> 363</p>
338 364
339<pre class=example>
340t = socket.gettime()
341-- do stuff
342print(socket.gettime() - t .. " seconds elapsed")
343</pre>
344
345<!-- try ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> 365<!-- try ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
346 366
347<p class=name id=try> 367<p class=name id=try>
@@ -386,8 +406,8 @@ This constant has a string describing the current LuaSocket version.
386<hr> 406<hr>
387<center> 407<center>
388<p class=bar> 408<p class=bar>
389<a href="home.html">home</a> &middot; 409<a href="index.html">home</a> &middot;
390<a href="home.html#down">download</a> &middot; 410<a href="index.html#down">download</a> &middot;
391<a href="installation.html">installation</a> &middot; 411<a href="installation.html">installation</a> &middot;
392<a href="introduction.html">introduction</a> &middot; 412<a href="introduction.html">introduction</a> &middot;
393<a href="reference.html">reference</a> 413<a href="reference.html">reference</a>
diff --git a/doc/tcp.html b/doc/tcp.html
index a16a09e..d1d2154 100644
--- a/doc/tcp.html
+++ b/doc/tcp.html
@@ -24,8 +24,8 @@
24</td></tr> 24</td></tr>
25</table> 25</table>
26<p class=bar> 26<p class=bar>
27<a href="home.html">home</a> &middot; 27<a href="index.html">home</a> &middot;
28<a href="home.html#download">download</a> &middot; 28<a href="index.html#download">download</a> &middot;
29<a href="installation.html">installation</a> &middot; 29<a href="installation.html">installation</a> &middot;
30<a href="introduction.html">introduction</a> &middot; 30<a href="introduction.html">introduction</a> &middot;
31<a href="reference.html">reference</a> 31<a href="reference.html">reference</a>
@@ -297,12 +297,12 @@ of any received data before return.
297 297
298<p class=return> 298<p class=return>
299If successful, the method returns the received pattern. In case of error, 299If successful, the method returns the received pattern. In case of error,
300the method returns <tt><b>nil</b></tt> followed by an error message which 300the method returns <tt><b>nil</b></tt> followed by an error
301can be the string '<tt>closed</tt>' in case the connection was 301message, followed by a (possibly empty) string containing
302the partial that was received. The error message can be
303the string '<tt>closed</tt>' in case the connection was
302closed before the transmission was completed or the string 304closed before the transmission was completed or the string
303'<tt>timeout</tt>' in case there was a timeout during the operation. 305'<tt>timeout</tt>' in case there was a timeout during the operation.
304Also, after the error message, the function returns the partial result of
305the transmission.
306</p> 306</p>
307 307
308<p class=note> 308<p class=note>
@@ -514,8 +514,8 @@ This function returns 1.
514<hr> 514<hr>
515<center> 515<center>
516<p class=bar> 516<p class=bar>
517<a href="home.html">home</a> &middot; 517<a href="index.html">home</a> &middot;
518<a href="home.html#down">download</a> &middot; 518<a href="index.html#down">download</a> &middot;
519<a href="installation.html">installation</a> &middot; 519<a href="installation.html">installation</a> &middot;
520<a href="introduction.html">introduction</a> &middot; 520<a href="introduction.html">introduction</a> &middot;
521<a href="reference.html">reference</a> 521<a href="reference.html">reference</a>
diff --git a/doc/udp.html b/doc/udp.html
index 688649d..eca881d 100644
--- a/doc/udp.html
+++ b/doc/udp.html
@@ -24,8 +24,8 @@
24</td></tr> 24</td></tr>
25</table> 25</table>
26<p class=bar> 26<p class=bar>
27<a href="home.html">home</a> &middot; 27<a href="index.html">home</a> &middot;
28<a href="home.html#download">download</a> &middot; 28<a href="index.html#download">download</a> &middot;
29<a href="installation.html">installation</a> &middot; 29<a href="installation.html">installation</a> &middot;
30<a href="introduction.html">introduction</a> &middot; 30<a href="introduction.html">introduction</a> &middot;
31<a href="reference.html">reference</a> 31<a href="reference.html">reference</a>
@@ -397,8 +397,8 @@ imperative nature obvious.
397<hr> 397<hr>
398<center> 398<center>
399<p class=bar> 399<p class=bar>
400<a href="home.html">home</a> &middot; 400<a href="index.html">home</a> &middot;
401<a href="home.html#download">download</a> &middot; 401<a href="index.html#download">download</a> &middot;
402<a href="installation.html">installation</a> &middot; 402<a href="installation.html">installation</a> &middot;
403<a href="introduction.html">introduction</a> &middot; 403<a href="introduction.html">introduction</a> &middot;
404<a href="reference.html">reference</a> 404<a href="reference.html">reference</a>
diff --git a/doc/url.html b/doc/url.html
index e87126f..303e05d 100644
--- a/doc/url.html
+++ b/doc/url.html
@@ -24,8 +24,8 @@
24</td></tr> 24</td></tr>
25</table> 25</table>
26<p class=bar> 26<p class=bar>
27<a href="home.html">home</a> &middot; 27<a href="index.html">home</a> &middot;
28<a href="home.html#download">download</a> &middot; 28<a href="index.html#download">download</a> &middot;
29<a href="installation.html">installation</a> &middot; 29<a href="installation.html">installation</a> &middot;
30<a href="introduction.html">introduction</a> &middot; 30<a href="introduction.html">introduction</a> &middot;
31<a href="reference.html">reference</a> 31<a href="reference.html">reference</a>
@@ -310,8 +310,8 @@ The function returns the decoded string.
310<hr> 310<hr>
311<center> 311<center>
312<p class=bar> 312<p class=bar>
313<a href="home.html">home</a> &middot; 313<a href="index.html">home</a> &middot;
314<a href="home.html#down">download</a> &middot; 314<a href="index.html#down">download</a> &middot;
315<a href="installation.html">installation</a> &middot; 315<a href="installation.html">installation</a> &middot;
316<a href="introduction.html">introduction</a> &middot; 316<a href="introduction.html">introduction</a> &middot;
317<a href="reference.html">reference</a> 317<a href="reference.html">reference</a>
diff --git a/etc/dispatch.lua b/etc/dispatch.lua
index 3ef1e72..5236f3d 100644
--- a/etc/dispatch.lua
+++ b/etc/dispatch.lua
@@ -54,7 +54,7 @@ function socket.protect(f)
54 local results = {coroutine.resume(co, base.unpack(arg))} 54 local results = {coroutine.resume(co, base.unpack(arg))}
55 local status = table.remove(results, 1) 55 local status = table.remove(results, 1)
56 if not status then 56 if not status then
57 if type(results[1]) == 'table' then 57 if base.type(results[1]) == 'table' then
58 return nil, results[1][1] 58 return nil, results[1][1]
59 else base.error(results[1]) end 59 else base.error(results[1]) end
60 end 60 end
diff --git a/luasocket.sln b/luasocket.sln
index a674c33..76b175b 100644
--- a/luasocket.sln
+++ b/luasocket.sln
@@ -1,37 +1,25 @@
1Microsoft Visual Studio Solution File, Format Version 8.00 1Microsoft Visual Studio Solution File, Format Version 10.00
2# Visual Studio 2008
2Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "socket", "socket.vcproj", "{66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}" 3Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "socket", "socket.vcproj", "{66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}"
3 ProjectSection(ProjectDependencies) = postProject
4 EndProjectSection
5EndProject 4EndProject
6Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mime", "mime.vcproj", "{128E8BD0-174A-48F0-8771-92B1E8D18713}" 5Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mime", "mime.vcproj", "{128E8BD0-174A-48F0-8771-92B1E8D18713}"
7 ProjectSection(ProjectDependencies) = postProject
8 EndProjectSection
9EndProject
10Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libluasocket", "libluasocket.vcproj", "{599EAD40-60EE-4043-9C14-AE090A8A092D}"
11 ProjectSection(ProjectDependencies) = postProject
12 EndProjectSection
13EndProject 6EndProject
14Global 7Global
15 GlobalSection(SolutionConfiguration) = preSolution 8 GlobalSection(SolutionConfigurationPlatforms) = preSolution
16 Debug = Debug 9 Debug|Win32 = Debug|Win32
17 Release = Release 10 Release|Win32 = Release|Win32
18 EndGlobalSection
19 GlobalSection(ProjectConfiguration) = postSolution
20 {66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}.Debug.ActiveCfg = Debug|Win32
21 {66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}.Debug.Build.0 = Debug|Win32
22 {66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}.Release.ActiveCfg = Release|Win32
23 {66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}.Release.Build.0 = Release|Win32
24 {128E8BD0-174A-48F0-8771-92B1E8D18713}.Debug.ActiveCfg = Debug|Win32
25 {128E8BD0-174A-48F0-8771-92B1E8D18713}.Debug.Build.0 = Debug|Win32
26 {128E8BD0-174A-48F0-8771-92B1E8D18713}.Release.ActiveCfg = Release|Win32
27 {128E8BD0-174A-48F0-8771-92B1E8D18713}.Release.Build.0 = Release|Win32
28 {599EAD40-60EE-4043-9C14-AE090A8A092D}.Debug.ActiveCfg = Debug|Win32
29 {599EAD40-60EE-4043-9C14-AE090A8A092D}.Debug.Build.0 = Debug|Win32
30 {599EAD40-60EE-4043-9C14-AE090A8A092D}.Release.ActiveCfg = Release|Win32
31 {599EAD40-60EE-4043-9C14-AE090A8A092D}.Release.Build.0 = Release|Win32
32 EndGlobalSection 11 EndGlobalSection
33 GlobalSection(ExtensibilityGlobals) = postSolution 12 GlobalSection(ProjectConfigurationPlatforms) = postSolution
13 {66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}.Debug|Win32.ActiveCfg = Debug|Win32
14 {66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}.Debug|Win32.Build.0 = Debug|Win32
15 {66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}.Release|Win32.ActiveCfg = Release|Win32
16 {66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}.Release|Win32.Build.0 = Release|Win32
17 {128E8BD0-174A-48F0-8771-92B1E8D18713}.Debug|Win32.ActiveCfg = Debug|Win32
18 {128E8BD0-174A-48F0-8771-92B1E8D18713}.Debug|Win32.Build.0 = Debug|Win32
19 {128E8BD0-174A-48F0-8771-92B1E8D18713}.Release|Win32.ActiveCfg = Release|Win32
20 {128E8BD0-174A-48F0-8771-92B1E8D18713}.Release|Win32.Build.0 = Release|Win32
34 EndGlobalSection 21 EndGlobalSection
35 GlobalSection(ExtensibilityAddIns) = postSolution 22 GlobalSection(SolutionProperties) = preSolution
23 HideSolutionNode = FALSE
36 EndGlobalSection 24 EndGlobalSection
37EndGlobal 25EndGlobal
diff --git a/makefile b/makefile
index 6d70039..a9ce34d 100644
--- a/makefile
+++ b/makefile
@@ -1,51 +1,23 @@
1#------ 1PLAT= none
2# Load configuration 2PLATS= macosx linux
3#
4include config
5 3
6#------ 4#------
7# Hopefully no need to change anything below this line 5# Hopefully no need to change anything below this line
8# 6#
9INSTALL_SOCKET_SHARE=$(INSTALL_TOP_SHARE)/socket 7all: $(PLAT)
10INSTALL_SOCKET_LIB=$(INSTALL_TOP_LIB)/socket
11INSTALL_MIME_SHARE=$(INSTALL_TOP_SHARE)/mime
12INSTALL_MIME_LIB=$(INSTALL_TOP_LIB)/mime
13
14all clean:
15 cd src; $(MAKE) $@
16 8
17#------ 9none:
18# Files to install 10 @echo "Please run"
19# 11 @echo " make PLATFORM"
20TO_SOCKET_SHARE:= \ 12 @echo "where PLATFORM is one of these:"
21 http.lua \ 13 @echo " $(PLATS)"
22 url.lua \
23 tp.lua \
24 ftp.lua \
25 smtp.lua
26 14
27TO_TOP_SHARE:= \ 15$(PLATS) install local clean:
28 ltn12.lua \ 16 cd src; $(MAKE) $@
29 socket.lua \
30 mime.lua
31 17
32TO_MIME_SHARE:= 18dummy:
33 19
34#------ 20test: dummy
35# Install LuaSocket according to recommendation 21 lua test/hello.lua
36#
37install: all
38 cd src; mkdir -p $(INSTALL_TOP_SHARE)
39 cd src; $(INSTALL_DATA) $(TO_TOP_SHARE) $(INSTALL_TOP_SHARE)
40 cd src; mkdir -p $(INSTALL_SOCKET_SHARE)
41 cd src; $(INSTALL_DATA) $(TO_SOCKET_SHARE) $(INSTALL_SOCKET_SHARE)
42 cd src; mkdir -p $(INSTALL_SOCKET_LIB)
43 cd src; $(INSTALL_EXEC) $(SOCKET_SO) $(INSTALL_SOCKET_LIB)/core.$(EXT)
44 #cd src; mkdir -p $(INSTALL_MIME_SHARE)
45 #cd src; $(INSTALL_DATA) $(TO_MIME_SHARE) $(INSTALL_MIME_SHARE)
46 cd src; mkdir -p $(INSTALL_MIME_LIB)
47 cd src; $(INSTALL_EXEC) $(MIME_SO) $(INSTALL_MIME_LIB)/core.$(EXT)
48 22
49#------ 23.PHONY: dummy
50# End of makefile
51#
diff --git a/makefile.dist b/makefile.dist
index 876cf18..e4f8da8 100644
--- a/makefile.dist
+++ b/makefile.dist
@@ -1,10 +1,11 @@
1#-------------------------------------------------------------------------- 1#--------------------------------------------------------------------------
2# Distribution makefile 2# Distribution makefile
3#-------------------------------------------------------------------------- 3#--------------------------------------------------------------------------
4DIST = luasocket-2.0.2 4DIST = luasocket-2.0.3
5 5
6TEST = \ 6TEST = \
7 test/README \ 7 test/README \
8 test/hello.lua \
8 test/testclnt.lua \ 9 test/testclnt.lua \
9 test/testsrvr.lua \ 10 test/testsrvr.lua \
10 test/testsupport.lua 11 test/testsupport.lua
@@ -15,6 +16,8 @@ SAMPLES = \
15 samples/daytimeclnt.lua \ 16 samples/daytimeclnt.lua \
16 samples/echoclnt.lua \ 17 samples/echoclnt.lua \
17 samples/echosrvr.lua \ 18 samples/echosrvr.lua \
19 samples/mclisten.lua \
20 samples/mcsend.lua \
18 samples/listener.lua \ 21 samples/listener.lua \
19 samples/lpr.lua \ 22 samples/lpr.lua \
20 samples/talker.lua \ 23 samples/talker.lua \
@@ -73,12 +76,12 @@ SRC = \
73 src/mime.lua \ 76 src/mime.lua \
74 src/smtp.lua \ 77 src/smtp.lua \
75 src/socket.lua \ 78 src/socket.lua \
79 src/headers.lua \
76 src/tp.lua \ 80 src/tp.lua \
77 src/url.lua 81 src/url.lua
78 82
79MAKE = \ 83MAKE = \
80 makefile \ 84 makefile \
81 config \
82 luasocket.sln \ 85 luasocket.sln \
83 socket.vcproj \ 86 socket.vcproj \
84 mime.vcproj 87 mime.vcproj
diff --git a/mime.vcproj b/mime.vcproj
index 8ad7900..313cdb1 100644
--- a/mime.vcproj
+++ b/mime.vcproj
@@ -1,114 +1,179 @@
1<?xml version="1.0" encoding="Windows-1252"?> 1<?xml version="1.0" encoding="Windows-1252"?>
2<VisualStudioProject 2<VisualStudioProject
3 ProjectType="Visual C++" 3 ProjectType="Visual C++"
4 Version="7.10" 4 Version="9.00"
5 Name="mime" 5 Name="mime"
6 ProjectGUID="{128E8BD0-174A-48F0-8771-92B1E8D18713}" 6 ProjectGUID="{128E8BD0-174A-48F0-8771-92B1E8D18713}"
7 Keyword="Win32Proj"> 7 Keyword="Win32Proj"
8 TargetFrameworkVersion="131072"
9 >
8 <Platforms> 10 <Platforms>
9 <Platform 11 <Platform
10 Name="Win32"/> 12 Name="Win32"
13 />
11 </Platforms> 14 </Platforms>
15 <ToolFiles>
16 </ToolFiles>
12 <Configurations> 17 <Configurations>
13 <Configuration 18 <Configuration
14 Name="Debug|Win32" 19 Name="Debug|Win32"
15 OutputDirectory="src" 20 OutputDirectory="src"
16 IntermediateDirectory="src" 21 IntermediateDirectory="src"
17 ConfigurationType="2" 22 ConfigurationType="2"
18 CharacterSet="2"> 23 InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
24 CharacterSet="2"
25 >
26 <Tool
27 Name="VCPreBuildEventTool"
28 />
29 <Tool
30 Name="VCCustomBuildTool"
31 />
32 <Tool
33 Name="VCXMLDataGeneratorTool"
34 />
35 <Tool
36 Name="VCWebServiceProxyGeneratorTool"
37 />
38 <Tool
39 Name="VCMIDLTool"
40 />
19 <Tool 41 <Tool
20 Name="VCCLCompilerTool" 42 Name="VCCLCompilerTool"
21 Optimization="0" 43 Optimization="0"
22 AdditionalIncludeDirectories="h:\include\lua5.1" 44 AdditionalIncludeDirectories="..\lua-5.1.4\src"
23 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MIME_EXPORTS;MIME_API=__declspec(dllexport)" 45 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MIME_EXPORTS;MIME_API=__declspec(dllexport);_CRT_SECURE_NO_WARNINGS"
24 MinimalRebuild="TRUE" 46 MinimalRebuild="true"
25 BasicRuntimeChecks="3" 47 BasicRuntimeChecks="3"
26 RuntimeLibrary="3" 48 RuntimeLibrary="3"
27 UsePrecompiledHeader="0" 49 UsePrecompiledHeader="0"
28 WarningLevel="3" 50 WarningLevel="3"
29 Detect64BitPortabilityProblems="TRUE" 51 Detect64BitPortabilityProblems="false"
30 DebugInformationFormat="4"/> 52 DebugInformationFormat="4"
53 />
31 <Tool 54 <Tool
32 Name="VCCustomBuildTool"/> 55 Name="VCManagedResourceCompilerTool"
56 />
57 <Tool
58 Name="VCResourceCompilerTool"
59 />
60 <Tool
61 Name="VCPreLinkEventTool"
62 />
33 <Tool 63 <Tool
34 Name="VCLinkerTool" 64 Name="VCLinkerTool"
65 AdditionalDependencies="lua5.1.lib"
35 OutputFile="$(OutDir)/mime.dll" 66 OutputFile="$(OutDir)/mime.dll"
36 LinkIncremental="2" 67 LinkIncremental="2"
37 AdditionalLibraryDirectories="h:\lib" 68 AdditionalLibraryDirectories="..\lua-5.1.4"
38 GenerateDebugInformation="TRUE" 69 GenerateDebugInformation="true"
39 ProgramDatabaseFile="$(OutDir)/mime.pdb" 70 ProgramDatabaseFile="$(OutDir)/mime.pdb"
40 SubSystem="2" 71 SubSystem="2"
72 RandomizedBaseAddress="1"
73 DataExecutionPrevention="0"
41 ImportLibrary="$(OutDir)/mime.lib" 74 ImportLibrary="$(OutDir)/mime.lib"
42 TargetMachine="1"/> 75 TargetMachine="1"
43 <Tool 76 />
44 Name="VCMIDLTool"/>
45 <Tool
46 Name="VCPostBuildEventTool"/>
47 <Tool
48 Name="VCPreBuildEventTool"/>
49 <Tool 77 <Tool
50 Name="VCPreLinkEventTool"/> 78 Name="VCALinkTool"
79 />
51 <Tool 80 <Tool
52 Name="VCResourceCompilerTool"/> 81 Name="VCManifestTool"
82 />
53 <Tool 83 <Tool
54 Name="VCWebServiceProxyGeneratorTool"/> 84 Name="VCXDCMakeTool"
85 />
55 <Tool 86 <Tool
56 Name="VCXMLDataGeneratorTool"/> 87 Name="VCBscMakeTool"
88 />
57 <Tool 89 <Tool
58 Name="VCWebDeploymentTool"/> 90 Name="VCFxCopTool"
91 />
59 <Tool 92 <Tool
60 Name="VCManagedWrapperGeneratorTool"/> 93 Name="VCAppVerifierTool"
94 />
61 <Tool 95 <Tool
62 Name="VCAuxiliaryManagedWrapperGeneratorTool"/> 96 Name="VCPostBuildEventTool"
97 />
63 </Configuration> 98 </Configuration>
64 <Configuration 99 <Configuration
65 Name="Release|Win32" 100 Name="Release|Win32"
66 OutputDirectory="src" 101 OutputDirectory="src"
67 IntermediateDirectory="src" 102 IntermediateDirectory="src"
68 ConfigurationType="2" 103 ConfigurationType="2"
69 CharacterSet="2"> 104 InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
105 CharacterSet="2"
106 >
107 <Tool
108 Name="VCPreBuildEventTool"
109 />
110 <Tool
111 Name="VCCustomBuildTool"
112 />
113 <Tool
114 Name="VCXMLDataGeneratorTool"
115 />
116 <Tool
117 Name="VCWebServiceProxyGeneratorTool"
118 />
119 <Tool
120 Name="VCMIDLTool"
121 />
70 <Tool 122 <Tool
71 Name="VCCLCompilerTool" 123 Name="VCCLCompilerTool"
72 AdditionalIncludeDirectories="h:\include\lua5.1" 124 AdditionalIncludeDirectories="..\lua-5.1.4\src"
73 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MIME_EXPORTS; MIME_API=__declspec(dllexport)" 125 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MIME_EXPORTS; MIME_API=__declspec(dllexport);_CRT_SECURE_NO_WARNINGS"
74 RuntimeLibrary="2" 126 RuntimeLibrary="2"
75 UsePrecompiledHeader="0" 127 UsePrecompiledHeader="0"
76 WarningLevel="4" 128 WarningLevel="4"
77 Detect64BitPortabilityProblems="TRUE" 129 Detect64BitPortabilityProblems="false"
78 DebugInformationFormat="0"/> 130 DebugInformationFormat="0"
131 />
79 <Tool 132 <Tool
80 Name="VCCustomBuildTool"/> 133 Name="VCManagedResourceCompilerTool"
134 />
135 <Tool
136 Name="VCResourceCompilerTool"
137 />
138 <Tool
139 Name="VCPreLinkEventTool"
140 />
81 <Tool 141 <Tool
82 Name="VCLinkerTool" 142 Name="VCLinkerTool"
143 AdditionalDependencies="lua5.1.lib"
83 OutputFile="$(OutDir)/mime.dll" 144 OutputFile="$(OutDir)/mime.dll"
84 LinkIncremental="1" 145 LinkIncremental="1"
85 AdditionalLibraryDirectories="h:\lib" 146 AdditionalLibraryDirectories="..\lua-5.1.4"
86 GenerateDebugInformation="TRUE" 147 GenerateDebugInformation="true"
87 SubSystem="2" 148 SubSystem="2"
88 OptimizeReferences="2" 149 OptimizeReferences="2"
89 EnableCOMDATFolding="2" 150 EnableCOMDATFolding="2"
151 RandomizedBaseAddress="1"
152 DataExecutionPrevention="0"
90 ImportLibrary="$(OutDir)/mime.lib" 153 ImportLibrary="$(OutDir)/mime.lib"
91 TargetMachine="1"/> 154 TargetMachine="1"
92 <Tool 155 />
93 Name="VCMIDLTool"/>
94 <Tool
95 Name="VCPostBuildEventTool"/>
96 <Tool
97 Name="VCPreBuildEventTool"/>
98 <Tool 156 <Tool
99 Name="VCPreLinkEventTool"/> 157 Name="VCALinkTool"
158 />
100 <Tool 159 <Tool
101 Name="VCResourceCompilerTool"/> 160 Name="VCManifestTool"
161 />
102 <Tool 162 <Tool
103 Name="VCWebServiceProxyGeneratorTool"/> 163 Name="VCXDCMakeTool"
164 />
104 <Tool 165 <Tool
105 Name="VCXMLDataGeneratorTool"/> 166 Name="VCBscMakeTool"
167 />
106 <Tool 168 <Tool
107 Name="VCWebDeploymentTool"/> 169 Name="VCFxCopTool"
170 />
108 <Tool 171 <Tool
109 Name="VCManagedWrapperGeneratorTool"/> 172 Name="VCAppVerifierTool"
173 />
110 <Tool 174 <Tool
111 Name="VCAuxiliaryManagedWrapperGeneratorTool"/> 175 Name="VCPostBuildEventTool"
176 />
112 </Configuration> 177 </Configuration>
113 </Configurations> 178 </Configurations>
114 <References> 179 <References>
@@ -117,24 +182,25 @@
117 <Filter 182 <Filter
118 Name="Source Files" 183 Name="Source Files"
119 Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" 184 Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
120 UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> 185 UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
186 >
121 <File 187 <File
122 RelativePath="src\mime.c"> 188 RelativePath="src\mime.c"
189 >
123 </File> 190 </File>
124 </Filter> 191 </Filter>
125 <Filter 192 <Filter
126 Name="Header Files" 193 Name="Header Files"
127 Filter="h;hpp;hxx;hm;inl;inc;xsd" 194 Filter="h;hpp;hxx;hm;inl;inc;xsd"
128 UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> 195 UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
196 >
129 </Filter> 197 </Filter>
130 <Filter 198 <Filter
131 Name="Resource Files" 199 Name="Resource Files"
132 Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" 200 Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
133 UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"> 201 UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
202 >
134 </Filter> 203 </Filter>
135 <File
136 RelativePath="..\..\lib\lua5.1.dll.lib">
137 </File>
138 </Files> 204 </Files>
139 <Globals> 205 <Globals>
140 </Globals> 206 </Globals>
diff --git a/samples/cddb.lua b/samples/cddb.lua
index 883730c..49a1871 100644
--- a/samples/cddb.lua
+++ b/samples/cddb.lua
@@ -32,7 +32,7 @@ end
32local host = socket.dns.gethostname() 32local host = socket.dns.gethostname()
33local query = "%s?cmd=cddb+read+%s+%s&hello=LuaSocket+%s+LuaSocket+2.0&proto=6" 33local query = "%s?cmd=cddb+read+%s+%s&hello=LuaSocket+%s+LuaSocket+2.0&proto=6"
34local url = string.format(query, server, arg[1], arg[2], host) 34local url = string.format(query, server, arg[1], arg[2], host)
35local body, headers, code = http.get(url) 35local body, headers, code = http.request(url)
36 36
37if code == 200 then 37if code == 200 then
38 local data, code, error = parse(body) 38 local data, code, error = parse(body)
diff --git a/socket.vcproj b/socket.vcproj
index b7c4a08..195eb09 100644
--- a/socket.vcproj
+++ b/socket.vcproj
@@ -1,116 +1,179 @@
1<?xml version="1.0" encoding="Windows-1252"?> 1<?xml version="1.0" encoding="Windows-1252"?>
2<VisualStudioProject 2<VisualStudioProject
3 ProjectType="Visual C++" 3 ProjectType="Visual C++"
4 Version="7.10" 4 Version="9.00"
5 Name="socket" 5 Name="socket"
6 ProjectGUID="{66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}" 6 ProjectGUID="{66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}"
7 Keyword="Win32Proj"> 7 Keyword="Win32Proj"
8 TargetFrameworkVersion="131072"
9 >
8 <Platforms> 10 <Platforms>
9 <Platform 11 <Platform
10 Name="Win32"/> 12 Name="Win32"
13 />
11 </Platforms> 14 </Platforms>
15 <ToolFiles>
16 </ToolFiles>
12 <Configurations> 17 <Configurations>
13 <Configuration 18 <Configuration
14 Name="Debug|Win32" 19 Name="Debug|Win32"
15 OutputDirectory="src" 20 OutputDirectory="src"
16 IntermediateDirectory="src" 21 IntermediateDirectory="src"
17 ConfigurationType="2" 22 ConfigurationType="2"
18 CharacterSet="2"> 23 InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
24 CharacterSet="2"
25 >
26 <Tool
27 Name="VCPreBuildEventTool"
28 />
29 <Tool
30 Name="VCCustomBuildTool"
31 />
32 <Tool
33 Name="VCXMLDataGeneratorTool"
34 />
35 <Tool
36 Name="VCWebServiceProxyGeneratorTool"
37 />
38 <Tool
39 Name="VCMIDLTool"
40 />
19 <Tool 41 <Tool
20 Name="VCCLCompilerTool" 42 Name="VCCLCompilerTool"
21 Optimization="0" 43 Optimization="0"
22 AdditionalIncludeDirectories="h:\include\lua5.1" 44 AdditionalIncludeDirectories="..\lua-5.1.4\src"
23 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LUASOCKET_EXPORTS;LUASOCKET_API=__declspec(dllexport)" 45 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LUASOCKET_EXPORTS;LUASOCKET_API=__declspec(dllexport);_CRT_SECURE_NO_WARNINGS"
24 MinimalRebuild="TRUE" 46 MinimalRebuild="true"
25 BasicRuntimeChecks="3" 47 BasicRuntimeChecks="3"
26 RuntimeLibrary="3" 48 RuntimeLibrary="3"
27 UsePrecompiledHeader="0" 49 UsePrecompiledHeader="0"
28 WarningLevel="3" 50 WarningLevel="3"
29 Detect64BitPortabilityProblems="TRUE" 51 Detect64BitPortabilityProblems="false"
30 DebugInformationFormat="4"/> 52 DebugInformationFormat="4"
53 />
31 <Tool 54 <Tool
32 Name="VCCustomBuildTool"/> 55 Name="VCManagedResourceCompilerTool"
56 />
57 <Tool
58 Name="VCResourceCompilerTool"
59 />
60 <Tool
61 Name="VCPreLinkEventTool"
62 />
33 <Tool 63 <Tool
34 Name="VCLinkerTool" 64 Name="VCLinkerTool"
35 AdditionalDependencies="ws2_32.lib" 65 AdditionalDependencies="ws2_32.lib lua5.1.lib"
36 OutputFile="$(OutDir)/socket.dll" 66 OutputFile="$(OutDir)/socket.dll"
37 LinkIncremental="2" 67 LinkIncremental="2"
38 AdditionalLibraryDirectories="h:\lib" 68 AdditionalLibraryDirectories="..\lua-5.1.4"
39 GenerateDebugInformation="TRUE" 69 GenerateDebugInformation="true"
40 ProgramDatabaseFile="$(OutDir)/socket.pdb" 70 ProgramDatabaseFile="$(OutDir)/socket.pdb"
41 SubSystem="2" 71 SubSystem="2"
72 RandomizedBaseAddress="1"
73 DataExecutionPrevention="0"
42 ImportLibrary="$(OutDir)/socket.lib" 74 ImportLibrary="$(OutDir)/socket.lib"
43 TargetMachine="1"/> 75 TargetMachine="1"
44 <Tool 76 />
45 Name="VCMIDLTool"/>
46 <Tool
47 Name="VCPostBuildEventTool"/>
48 <Tool
49 Name="VCPreBuildEventTool"/>
50 <Tool 77 <Tool
51 Name="VCPreLinkEventTool"/> 78 Name="VCALinkTool"
79 />
52 <Tool 80 <Tool
53 Name="VCResourceCompilerTool"/> 81 Name="VCManifestTool"
82 />
54 <Tool 83 <Tool
55 Name="VCWebServiceProxyGeneratorTool"/> 84 Name="VCXDCMakeTool"
85 />
56 <Tool 86 <Tool
57 Name="VCXMLDataGeneratorTool"/> 87 Name="VCBscMakeTool"
88 />
58 <Tool 89 <Tool
59 Name="VCWebDeploymentTool"/> 90 Name="VCFxCopTool"
91 />
60 <Tool 92 <Tool
61 Name="VCManagedWrapperGeneratorTool"/> 93 Name="VCAppVerifierTool"
94 />
62 <Tool 95 <Tool
63 Name="VCAuxiliaryManagedWrapperGeneratorTool"/> 96 Name="VCPostBuildEventTool"
97 />
64 </Configuration> 98 </Configuration>
65 <Configuration 99 <Configuration
66 Name="Release|Win32" 100 Name="Release|Win32"
67 OutputDirectory="./src" 101 OutputDirectory="./src"
68 IntermediateDirectory="./src" 102 IntermediateDirectory="./src"
69 ConfigurationType="2" 103 ConfigurationType="2"
70 CharacterSet="2"> 104 InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
105 CharacterSet="2"
106 >
107 <Tool
108 Name="VCPreBuildEventTool"
109 />
110 <Tool
111 Name="VCCustomBuildTool"
112 />
113 <Tool
114 Name="VCXMLDataGeneratorTool"
115 />
116 <Tool
117 Name="VCWebServiceProxyGeneratorTool"
118 />
119 <Tool
120 Name="VCMIDLTool"
121 />
71 <Tool 122 <Tool
72 Name="VCCLCompilerTool" 123 Name="VCCLCompilerTool"
73 AdditionalIncludeDirectories="h:\include\lua5.1" 124 AdditionalIncludeDirectories="..\lua-5.1.4\src"
74 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LUASOCKET_EXPORTS;LUASOCKET_API=__declspec(dllexport); LUASOCKET_DEBUG" 125 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LUASOCKET_EXPORTS;LUASOCKET_API=__declspec(dllexport); LUASOCKET_DEBUG; _CRT_SECURE_NO_WARNINGS"
75 RuntimeLibrary="2" 126 RuntimeLibrary="2"
76 UsePrecompiledHeader="0" 127 UsePrecompiledHeader="0"
77 WarningLevel="3" 128 WarningLevel="3"
78 Detect64BitPortabilityProblems="TRUE" 129 Detect64BitPortabilityProblems="false"
79 DebugInformationFormat="0"/> 130 DebugInformationFormat="0"
131 />
80 <Tool 132 <Tool
81 Name="VCCustomBuildTool"/> 133 Name="VCManagedResourceCompilerTool"
134 />
135 <Tool
136 Name="VCResourceCompilerTool"
137 />
138 <Tool
139 Name="VCPreLinkEventTool"
140 />
82 <Tool 141 <Tool
83 Name="VCLinkerTool" 142 Name="VCLinkerTool"
84 AdditionalDependencies="ws2_32.lib" 143 AdditionalDependencies="ws2_32.lib lua5.1.lib"
85 OutputFile="$(OutDir)/socket.dll" 144 OutputFile="$(OutDir)/socket.dll"
86 LinkIncremental="1" 145 LinkIncremental="1"
87 AdditionalLibraryDirectories="h:\lib" 146 AdditionalLibraryDirectories="..\lua-5.1.4"
88 GenerateDebugInformation="TRUE" 147 GenerateDebugInformation="true"
89 SubSystem="2" 148 SubSystem="2"
90 OptimizeReferences="2" 149 OptimizeReferences="2"
91 EnableCOMDATFolding="2" 150 EnableCOMDATFolding="2"
151 RandomizedBaseAddress="1"
152 DataExecutionPrevention="0"
92 ImportLibrary="$(OutDir)/socket.lib" 153 ImportLibrary="$(OutDir)/socket.lib"
93 TargetMachine="1"/> 154 TargetMachine="1"
94 <Tool 155 />
95 Name="VCMIDLTool"/>
96 <Tool
97 Name="VCPostBuildEventTool"/>
98 <Tool
99 Name="VCPreBuildEventTool"/>
100 <Tool 156 <Tool
101 Name="VCPreLinkEventTool"/> 157 Name="VCALinkTool"
158 />
102 <Tool 159 <Tool
103 Name="VCResourceCompilerTool"/> 160 Name="VCManifestTool"
161 />
104 <Tool 162 <Tool
105 Name="VCWebServiceProxyGeneratorTool"/> 163 Name="VCXDCMakeTool"
164 />
106 <Tool 165 <Tool
107 Name="VCXMLDataGeneratorTool"/> 166 Name="VCBscMakeTool"
167 />
108 <Tool 168 <Tool
109 Name="VCWebDeploymentTool"/> 169 Name="VCFxCopTool"
170 />
110 <Tool 171 <Tool
111 Name="VCManagedWrapperGeneratorTool"/> 172 Name="VCAppVerifierTool"
173 />
112 <Tool 174 <Tool
113 Name="VCAuxiliaryManagedWrapperGeneratorTool"/> 175 Name="VCPostBuildEventTool"
176 />
114 </Configuration> 177 </Configuration>
115 </Configurations> 178 </Configurations>
116 <References> 179 <References>
@@ -119,63 +182,77 @@
119 <Filter 182 <Filter
120 Name="Source Files" 183 Name="Source Files"
121 Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" 184 Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
122 UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> 185 UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
186 >
123 <File 187 <File
124 RelativePath="src\auxiliar.c"> 188 RelativePath="src\auxiliar.c"
189 >
125 </File> 190 </File>
126 <File 191 <File
127 RelativePath="src\buffer.c"> 192 RelativePath="src\buffer.c"
193 >
128 </File> 194 </File>
129 <File 195 <File
130 RelativePath="src\except.c"> 196 RelativePath="src\except.c"
197 >
131 </File> 198 </File>
132 <File 199 <File
133 RelativePath="src\inet.c"> 200 RelativePath="src\inet.c"
201 >
134 </File> 202 </File>
135 <File 203 <File
136 RelativePath="src\io.c"> 204 RelativePath="src\io.c"
205 >
137 </File> 206 </File>
138 <File 207 <File
139 RelativePath="src\luasocket.c"> 208 RelativePath="src\luasocket.c"
209 >
140 </File> 210 </File>
141 <File 211 <File
142 RelativePath="src\options.c"> 212 RelativePath="src\options.c"
213 >
143 </File> 214 </File>
144 <File 215 <File
145 RelativePath="src\select.c"> 216 RelativePath="src\select.c"
217 >
146 </File> 218 </File>
147 <File 219 <File
148 RelativePath="src\tcp.c"> 220 RelativePath="src\tcp.c"
221 >
149 </File> 222 </File>
150 <File 223 <File
151 RelativePath="src\timeout.c"> 224 RelativePath="src\timeout.c"
225 >
152 </File> 226 </File>
153 <File 227 <File
154 RelativePath="src\udp.c"> 228 RelativePath="src\udp.c"
229 >
155 </File> 230 </File>
156 <File 231 <File
157 RelativePath="src\wsocket.c"> 232 RelativePath="src\wsocket.c"
233 >
158 <FileConfiguration 234 <FileConfiguration
159 Name="Release|Win32"> 235 Name="Release|Win32"
236 >
160 <Tool 237 <Tool
161 Name="VCCLCompilerTool" 238 Name="VCCLCompilerTool"
162 GeneratePreprocessedFile="0"/> 239 GeneratePreprocessedFile="0"
240 />
163 </FileConfiguration> 241 </FileConfiguration>
164 </File> 242 </File>
165 </Filter> 243 </Filter>
166 <Filter 244 <Filter
167 Name="Header Files" 245 Name="Header Files"
168 Filter="h;hpp;hxx;hm;inl;inc;xsd" 246 Filter="h;hpp;hxx;hm;inl;inc;xsd"
169 UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> 247 UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
248 >
170 </Filter> 249 </Filter>
171 <Filter 250 <Filter
172 Name="Resource Files" 251 Name="Resource Files"
173 Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" 252 Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
174 UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"> 253 UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
254 >
175 </Filter> 255 </Filter>
176 <File
177 RelativePath="..\..\lib\lua5.1.dll.lib">
178 </File>
179 </Files> 256 </Files>
180 <Globals> 257 <Globals>
181 </Globals> 258 </Globals>
diff --git a/src/auxiliar.h b/src/auxiliar.h
index 8a18bcf..57a2ecc 100644
--- a/src/auxiliar.h
+++ b/src/auxiliar.h
@@ -27,8 +27,6 @@
27* 27*
28* The mapping from class name to the corresponding metatable and the 28* The mapping from class name to the corresponding metatable and the
29* reverse mapping are done using lauxlib. 29* reverse mapping are done using lauxlib.
30*
31* RCS ID: $Id$
32\*=========================================================================*/ 30\*=========================================================================*/
33 31
34#include "lua.h" 32#include "lua.h"
diff --git a/src/buffer.c b/src/buffer.c
index de817b2..363da3d 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -166,7 +166,7 @@ static int sendraw(p_buffer buf, const char *data, size_t count, size_t *sent) {
166 size_t total = 0; 166 size_t total = 0;
167 int err = IO_DONE; 167 int err = IO_DONE;
168 while (total < count && err == IO_DONE) { 168 while (total < count && err == IO_DONE) {
169 size_t done; 169 size_t done = 0;
170 size_t step = (count-total <= STEPSIZE)? count-total: STEPSIZE; 170 size_t step = (count-total <= STEPSIZE)? count-total: STEPSIZE;
171 err = io->send(io->ctx, data+total, step, &done, tm); 171 err = io->send(io->ctx, data+total, step, &done, tm);
172 total += done; 172 total += done;
diff --git a/src/buffer.h b/src/buffer.h
index 0a4a335..58838d1 100644
--- a/src/buffer.h
+++ b/src/buffer.h
@@ -14,8 +14,6 @@
14* 14*
15* The module is built on top of the I/O abstraction defined in io.h and the 15* The module is built on top of the I/O abstraction defined in io.h and the
16* timeout management is done with the timeout.h interface. 16* timeout management is done with the timeout.h interface.
17*
18* RCS ID: $Id$
19\*=========================================================================*/ 17\*=========================================================================*/
20#include "lua.h" 18#include "lua.h"
21 19
diff --git a/src/except.h b/src/except.h
index 03e417d..1e7a245 100644
--- a/src/except.h
+++ b/src/except.h
@@ -24,8 +24,6 @@
24* 24*
25* With these two function, it's easy to write functions that throw 25* With these two function, it's easy to write functions that throw
26* exceptions on error, but that don't interrupt the user script. 26* exceptions on error, but that don't interrupt the user script.
27*
28* RCS ID: $Id$
29\*=========================================================================*/ 27\*=========================================================================*/
30 28
31#include "lua.h" 29#include "lua.h"
diff --git a/src/http.lua b/src/http.lua
index 3a386a6..4c27149 100644
--- a/src/http.lua
+++ b/src/http.lua
@@ -13,6 +13,7 @@ local url = require("socket.url")
13local ltn12 = require("ltn12") 13local ltn12 = require("ltn12")
14local mime = require("mime") 14local mime = require("mime")
15local string = require("string") 15local string = require("string")
16local headers = require("socket.headers")
16local base = _G 17local base = _G
17local table = require("table") 18local table = require("table")
18module("socket.http") 19module("socket.http")
@@ -123,10 +124,11 @@ function metat.__index:sendrequestline(method, uri)
123 return self.try(self.c:send(reqline)) 124 return self.try(self.c:send(reqline))
124end 125end
125 126
126function metat.__index:sendheaders(headers) 127function metat.__index:sendheaders(tosend)
128 local canonic = headers.canonic
127 local h = "\r\n" 129 local h = "\r\n"
128 for i, v in base.pairs(headers) do 130 for f, v in base.pairs(tosend) do
129 h = i .. ": " .. v .. "\r\n" .. h 131 h = (canonic[f] or f) .. ": " .. v .. "\r\n" .. h
130 end 132 end
131 self.try(self.c:send(h)) 133 self.try(self.c:send(h))
132 return 1 134 return 1
@@ -254,7 +256,7 @@ local function shouldredirect(reqt, code, headers)
254 return headers.location and 256 return headers.location and
255 string.gsub(headers.location, "%s", "") ~= "" and 257 string.gsub(headers.location, "%s", "") ~= "" and
256 (reqt.redirect ~= false) and 258 (reqt.redirect ~= false) and
257 (code == 301 or code == 302) and 259 (code == 301 or code == 302 or code == 303 or code == 307) and
258 (not reqt.method or reqt.method == "GET" or reqt.method == "HEAD") 260 (not reqt.method or reqt.method == "GET" or reqt.method == "HEAD")
259 and (not reqt.nredirects or reqt.nredirects < 5) 261 and (not reqt.nredirects or reqt.nredirects < 5)
260end 262end
diff --git a/src/inet.h b/src/inet.h
index c6d717d..dbc160c 100644
--- a/src/inet.h
+++ b/src/inet.h
@@ -13,8 +13,6 @@
13* getpeername and getsockname functions as seen by Lua programs. 13* getpeername and getsockname functions as seen by Lua programs.
14* 14*
15* The Lua functions toip and tohostname are also implemented here. 15* The Lua functions toip and tohostname are also implemented here.
16*
17* RCS ID: $Id$
18\*=========================================================================*/ 16\*=========================================================================*/
19#include "lua.h" 17#include "lua.h"
20#include "socket.h" 18#include "socket.h"
diff --git a/src/io.h b/src/io.h
index bff48a6..8cca08a 100644
--- a/src/io.h
+++ b/src/io.h
@@ -11,8 +11,6 @@
11* 11*
12* The module socket.h implements this interface, and thus the module tcp.h 12* The module socket.h implements this interface, and thus the module tcp.h
13* is very simple. 13* is very simple.
14*
15* RCS ID: $Id$
16\*=========================================================================*/ 14\*=========================================================================*/
17#include <stdio.h> 15#include <stdio.h>
18#include "lua.h" 16#include "lua.h"
diff --git a/src/luasocket.c b/src/luasocket.c
index 142aa95..3b29e8e 100644
--- a/src/luasocket.c
+++ b/src/luasocket.c
@@ -10,8 +10,6 @@
10* involved in setting up both client and server connections. The provided 10* involved in setting up both client and server connections. The provided
11* IO routines, however, follow the Lua style, being very similar to the 11* IO routines, however, follow the Lua style, being very similar to the
12* standard Lua read and write functions. 12* standard Lua read and write functions.
13*
14* RCS ID: $Id$
15\*=========================================================================*/ 13\*=========================================================================*/
16 14
17/*=========================================================================*\ 15/*=========================================================================*\
diff --git a/src/luasocket.h b/src/luasocket.h
index 13134cf..d7a78bb 100644
--- a/src/luasocket.h
+++ b/src/luasocket.h
@@ -5,16 +5,14 @@
5* Networking support for the Lua language 5* Networking support for the Lua language
6* Diego Nehab 6* Diego Nehab
7* 9/11/1999 7* 9/11/1999
8*
9* RCS ID: $Id$
10\*=========================================================================*/ 8\*=========================================================================*/
11#include "lua.h" 9#include "lua.h"
12 10
13/*-------------------------------------------------------------------------*\ 11/*-------------------------------------------------------------------------*\
14* Current socket library version 12* Current socket library version
15\*-------------------------------------------------------------------------*/ 13\*-------------------------------------------------------------------------*/
16#define LUASOCKET_VERSION "LuaSocket 2.0.2" 14#define LUASOCKET_VERSION "LuaSocket 2.0.3"
17#define LUASOCKET_COPYRIGHT "Copyright (C) 2004-2007 Diego Nehab" 15#define LUASOCKET_COPYRIGHT "Copyright (C) 1999-2009 Diego Nehab"
18#define LUASOCKET_AUTHORS "Diego Nehab" 16#define LUASOCKET_AUTHORS "Diego Nehab"
19 17
20/*-------------------------------------------------------------------------*\ 18/*-------------------------------------------------------------------------*\
diff --git a/src/makefile b/src/makefile
index b614f77..3351997 100644
--- a/src/makefile
+++ b/src/makefile
@@ -1,39 +1,86 @@
1PLAT = none
2INSTALL_DATA=cp
3INSTALL_EXEC=cp
4INSTALL_TOP= /opt/local
5LUAINC= $(LUAINC_$(PLAT))
6
1#------ 7#------
2# Load configuration 8# Install directories
3# 9#
4include ../config 10INSTALL_TOP_SHARE=$(INSTALL_TOP)/share/lua/5.1
11INSTALL_TOP_LIB=$(INSTALL_TOP)/lib/lua/5.1
12INSTALL_SOCKET_SHARE=$(INSTALL_TOP_SHARE)/socket
13INSTALL_SOCKET_LIB=$(INSTALL_TOP_LIB)/socket
14INSTALL_MIME_SHARE=$(INSTALL_TOP_SHARE)/mime
15INSTALL_MIME_LIB=$(INSTALL_TOP_LIB)/mime
5 16
6#------ 17#------
7# Hopefully no need to change anything below this line 18# Output file names
8# 19#
20EXT=so
21SOCKET_V=2.0.3
22MIME_V=1.0.3
23SOCKET_SO=socket.$(EXT).$(SOCKET_V)
24MIME_SO=mime.$(EXT).$(MIME_V)
25UNIX_SO=unix.$(EXT)
9 26
10#------ 27#------
11# Modules belonging to socket-core 28# Compiler and linker settings
12# 29# for Mac OS X
30LUAINC_macosx= -I/opt/local/include
31CC_macosx=gcc
32DEF_macosx= -DLUASOCKET_DEBUG -DUNIX_HAS_SUN_LEN \
33 -DLUASOCKET_API='__attribute__((visibility("default")))' \
34 -DMIME_API='__attribute__((visibility("default")))'
35CFLAGS_macosx= $(LUAINC) $(COMPAT) $(DEF) -pedantic -Wall -O2 -fno-common \
36 -fvisibility=hidden
37LDFLAGS_macosx= -bundle -undefined dynamic_lookup
38LD_macosx= export MACOSX_DEPLOYMENT_TARGET="10.3"; gcc
13 39
14#$(COMPAT)/compat-5.1.o \ 40#------
41# Compiler and linker settings
42# for Linux
43LUAINC_linux= -I/usr/local/include/lua5.1
44CC_linux=gcc
45DEF_linux=-DLUASOCKET_DEBUG \
46 -DLUASOCKET_API='__attribute__((visibility("default")))' \
47 -DMIME_API='__attribute__((visibility("default")))'
48CFLAGS_linux= $(LUAINC) $(DEF) -pedantic -Wall -O2 -fpic \
49 -fvisibility=hidden
50LDFLAGS_linux=-O -shared -fpic
51LD_linux= gcc
15 52
16SOCKET_OBJS:= \ 53#------
54# Settings selected for platform
55#
56CC=$(CC_$(PLAT))
57DEF=$(DEF_$(PLAT))
58CFLAGS=$(CFLAGS_$(PLAT))
59LDFLAGS=$(LDFLAGS_$(PLAT))
60LD=$(LD_$(PLAT))
61
62#------
63# Modules belonging to socket-core
64#
65SOCKET_OBJS= \
17 luasocket.o \ 66 luasocket.o \
18 timeout.o \ 67 timeout.o \
19 buffer.o \ 68 buffer.o \
20 io.o \ 69 io.o \
21 auxiliar.o \ 70 auxiliar.o \
22 options.o \ 71 options.o \
23 inet.o \ 72 inet.o \
24 tcp.o \ 73 usocket.o \
25 udp.o \
26 except.o \ 74 except.o \
27 select.o \ 75 select.o \
28 usocket.o 76 tcp.o \
77 udp.o
29 78
30#------ 79#------
31# Modules belonging mime-core 80# Modules belonging mime-core
32# 81#
33#$(COMPAT)/compat-5.1.o \ 82MIME_OBJS= \
34 83 mime.o
35MIME_OBJS:=\
36 mime.o
37 84
38#------ 85#------
39# Modules belonging unix (local domain sockets) 86# Modules belonging unix (local domain sockets)
@@ -47,7 +94,35 @@ UNIX_OBJS:=\
47 usocket.o \ 94 usocket.o \
48 unix.o 95 unix.o
49 96
50all: $(SOCKET_SO) $(MIME_SO) 97#------
98# Files to install
99#
100TO_SOCKET_SHARE:= \
101 http.lua \
102 url.lua \
103 tp.lua \
104 ftp.lua \
105 headers.lua \
106 smtp.lua
107
108TO_TOP_SHARE:= \
109 ltn12.lua \
110 socket.lua \
111 mime.lua
112
113default: $(PLAT)
114
115macosx:
116 $(MAKE) all PLAT=macosx
117
118linux:
119 $(MAKE) all PLAT=linux
120
121none:
122 @echo "Please choose a platform:"
123 @echo " $(PLATS)"
124
125all: $(SOCKET_SO) $(MIME_SO)
51 126
52$(SOCKET_SO): $(SOCKET_OBJS) 127$(SOCKET_SO): $(SOCKET_OBJS)
53 $(LD) $(LDFLAGS) -o $@ $(SOCKET_OBJS) 128 $(LD) $(LDFLAGS) -o $@ $(SOCKET_OBJS)
@@ -58,6 +133,25 @@ $(MIME_SO): $(MIME_OBJS)
58$(UNIX_SO): $(UNIX_OBJS) 133$(UNIX_SO): $(UNIX_OBJS)
59 $(LD) $(LDFLAGS) -o $@ $(UNIX_OBJS) 134 $(LD) $(LDFLAGS) -o $@ $(UNIX_OBJS)
60 135
136install:
137 mkdir -p $(INSTALL_TOP_SHARE)
138 $(INSTALL_DATA) $(TO_TOP_SHARE) $(INSTALL_TOP_SHARE)
139 mkdir -p $(INSTALL_SOCKET_SHARE)
140 $(INSTALL_DATA) $(TO_SOCKET_SHARE) $(INSTALL_SOCKET_SHARE)
141 mkdir -p $(INSTALL_SOCKET_LIB)
142 $(INSTALL_EXEC) $(SOCKET_SO) $(INSTALL_SOCKET_LIB)/core.$(EXT)
143 mkdir -p $(INSTALL_MIME_LIB)
144 $(INSTALL_EXEC) $(MIME_SO) $(INSTALL_MIME_LIB)/core.$(EXT)
145
146local:
147 $(MAKE) install INSTALL_TOP_LIB=.. INSTALL_TOP_SHARE=..
148
149clean:
150 rm -f $(SOCKET_SO) $(SOCKET_OBJS)
151 rm -f $(MIME_SO) $(UNIX_SO) $(MIME_OBJS) $(UNIX_OBJS)
152
153.PHONY: all $(PLATS) default clean echo none
154
61#------ 155#------
62# List of dependencies 156# List of dependencies
63# 157#
@@ -66,25 +160,19 @@ buffer.o: buffer.c buffer.h io.h timeout.h
66except.o: except.c except.h 160except.o: except.c except.h
67inet.o: inet.c inet.h socket.h io.h timeout.h usocket.h 161inet.o: inet.c inet.h socket.h io.h timeout.h usocket.h
68io.o: io.c io.h timeout.h 162io.o: io.c io.h timeout.h
69luasocket.o: luasocket.c luasocket.h auxiliar.h except.h timeout.h \ 163luasocket.o: luasocket.c luasocket.h auxiliar.h except.h \
70 buffer.h io.h inet.h socket.h usocket.h tcp.h udp.h select.h 164 timeout.h buffer.h io.h inet.h socket.h usocket.h tcp.h \
165 udp.h select.h
71mime.o: mime.c mime.h 166mime.o: mime.c mime.h
72options.o: options.c auxiliar.h options.h socket.h io.h timeout.h \ 167options.o: options.c auxiliar.h options.h socket.h io.h \
73 usocket.h inet.h 168 timeout.h usocket.h inet.h
74select.o: select.c socket.h io.h timeout.h usocket.h select.h 169select.o: select.c socket.h io.h timeout.h usocket.h select.h
75tcp.o: tcp.c auxiliar.h socket.h io.h timeout.h usocket.h inet.h \ 170tcp.o: tcp.c auxiliar.h socket.h io.h timeout.h usocket.h \
76 options.h tcp.h buffer.h 171 inet.h options.h tcp.h buffer.h
77timeout.o: timeout.c auxiliar.h timeout.h 172timeout.o: timeout.c auxiliar.h timeout.h
78udp.o: udp.c auxiliar.h socket.h io.h timeout.h usocket.h inet.h \ 173udp.o: udp.c auxiliar.h socket.h io.h timeout.h usocket.h \
79 options.h udp.h 174 inet.h options.h udp.h
80unix.o: unix.c auxiliar.h socket.h io.h timeout.h usocket.h options.h \ 175unix.o: unix.c auxiliar.h socket.h io.h timeout.h usocket.h \
81 unix.h buffer.h 176 options.h unix.h buffer.h
82usocket.o: usocket.c socket.h io.h timeout.h usocket.h 177usocket.o: usocket.c socket.h io.h timeout.h usocket.h
83 178wsocket.o: wsocket.c socket.h io.h timeout.h usocket.h
84clean:
85 rm -f $(SOCKET_SO) $(SOCKET_OBJS)
86 rm -f $(MIME_SO) $(UNIX_SO) $(MIME_OBJS) $(UNIX_OBJS)
87
88#------
89# End of makefile configuration
90#
diff --git a/src/mime.c b/src/mime.c
index a41bf40..1e8fded 100644
--- a/src/mime.c
+++ b/src/mime.c
@@ -272,9 +272,12 @@ static int mime_global_b64(lua_State *L)
272 input = (UC *) luaL_optlstring(L, 2, NULL, &isize); 272 input = (UC *) luaL_optlstring(L, 2, NULL, &isize);
273 /* if second part is nil, we are done */ 273 /* if second part is nil, we are done */
274 if (!input) { 274 if (!input) {
275 size_t osize = 0;
275 asize = b64pad(atom, asize, &buffer); 276 asize = b64pad(atom, asize, &buffer);
276 luaL_pushresult(&buffer); 277 luaL_pushresult(&buffer);
277 if (!(*lua_tostring(L, -1))) lua_pushnil(L); 278 /* if the output is empty and the input is nil, return nil */
279 lua_tolstring(L, -1, &osize);
280 if (osize == 0) lua_pushnil(L);
278 lua_pushnil(L); 281 lua_pushnil(L);
279 return 2; 282 return 2;
280 } 283 }
@@ -313,8 +316,11 @@ static int mime_global_unb64(lua_State *L)
313 input = (UC *) luaL_optlstring(L, 2, NULL, &isize); 316 input = (UC *) luaL_optlstring(L, 2, NULL, &isize);
314 /* if second is nil, we are done */ 317 /* if second is nil, we are done */
315 if (!input) { 318 if (!input) {
319 size_t osize = 0;
316 luaL_pushresult(&buffer); 320 luaL_pushresult(&buffer);
317 if (!(*lua_tostring(L, -1))) lua_pushnil(L); 321 /* if the output is empty and the input is nil, return nil */
322 lua_tolstring(L, -1, &osize);
323 if (osize == 0) lua_pushnil(L);
318 lua_pushnil(L); 324 lua_pushnil(L);
319 return 2; 325 return 2;
320 } 326 }
diff --git a/src/mime.h b/src/mime.h
index 0fe8000..37f370f 100644
--- a/src/mime.h
+++ b/src/mime.h
@@ -7,16 +7,14 @@
7* This module provides functions to implement transfer content encodings 7* This module provides functions to implement transfer content encodings
8* and formatting conforming to RFC 2045. It is used by mime.lua, which 8* and formatting conforming to RFC 2045. It is used by mime.lua, which
9* provide a higher level interface to this functionality. 9* provide a higher level interface to this functionality.
10*
11* RCS ID: $Id$
12\*=========================================================================*/ 10\*=========================================================================*/
13#include "lua.h" 11#include "lua.h"
14 12
15/*-------------------------------------------------------------------------*\ 13/*-------------------------------------------------------------------------*\
16* Current MIME library version 14* Current MIME library version
17\*-------------------------------------------------------------------------*/ 15\*-------------------------------------------------------------------------*/
18#define MIME_VERSION "MIME 1.0.2" 16#define MIME_VERSION "MIME 1.0.3"
19#define MIME_COPYRIGHT "Copyright (C) 2004-2007 Diego Nehab" 17#define MIME_COPYRIGHT "Copyright (C) 2004-2009 Diego Nehab"
20#define MIME_AUTHORS "Diego Nehab" 18#define MIME_AUTHORS "Diego Nehab"
21 19
22/*-------------------------------------------------------------------------*\ 20/*-------------------------------------------------------------------------*\
diff --git a/src/options.c b/src/options.c
index a464a4b..1d4c950 100644
--- a/src/options.c
+++ b/src/options.c
@@ -12,12 +12,12 @@
12#include "options.h" 12#include "options.h"
13#include "inet.h" 13#include "inet.h"
14 14
15
16/*=========================================================================*\ 15/*=========================================================================*\
17* Internal functions prototypes 16* Internal functions prototypes
18\*=========================================================================*/ 17\*=========================================================================*/
19static int opt_setmembership(lua_State *L, p_socket ps, int level, int name); 18static int opt_setmembership(lua_State *L, p_socket ps, int level, int name);
20static int opt_setboolean(lua_State *L, p_socket ps, int level, int name); 19static int opt_setboolean(lua_State *L, p_socket ps, int level, int name);
20static int opt_getboolean(lua_State *L, p_socket ps, int level, int name);
21static int opt_set(lua_State *L, p_socket ps, int level, int name, 21static int opt_set(lua_State *L, p_socket ps, int level, int name,
22 void *val, int len); 22 void *val, int len);
23 23
@@ -40,39 +40,63 @@ int opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps)
40 return opt->func(L, ps); 40 return opt->func(L, ps);
41} 41}
42 42
43int opt_meth_getoption(lua_State *L, p_opt opt, p_socket ps)
44{
45 const char *name = luaL_checkstring(L, 2); /* obj, name, ... */
46 while (opt->name && strcmp(name, opt->name))
47 opt++;
48 if (!opt->func) {
49 char msg[45];
50 sprintf(msg, "unsupported option `%.35s'", name);
51 luaL_argerror(L, 2, msg);
52 }
53 return opt->func(L, ps);
54}
55
43/* enables reuse of local address */ 56/* enables reuse of local address */
44int opt_reuseaddr(lua_State *L, p_socket ps) 57int opt_set_reuseaddr(lua_State *L, p_socket ps)
45{ 58{
46 return opt_setboolean(L, ps, SOL_SOCKET, SO_REUSEADDR); 59 return opt_setboolean(L, ps, SOL_SOCKET, SO_REUSEADDR);
47} 60}
48 61
62/* enables reuse of local port */
63int opt_set_reuseport(lua_State *L, p_socket ps)
64{
65 return opt_setboolean(L, ps, SOL_SOCKET, SO_REUSEPORT);
66}
67
49/* disables the Naggle algorithm */ 68/* disables the Naggle algorithm */
50int opt_tcp_nodelay(lua_State *L, p_socket ps) 69int opt_set_tcp_nodelay(lua_State *L, p_socket ps)
51{ 70{
52 return opt_setboolean(L, ps, IPPROTO_TCP, TCP_NODELAY); 71 return opt_setboolean(L, ps, IPPROTO_TCP, TCP_NODELAY);
53} 72}
54 73
55int opt_keepalive(lua_State *L, p_socket ps) 74int opt_set_keepalive(lua_State *L, p_socket ps)
56{ 75{
57 return opt_setboolean(L, ps, SOL_SOCKET, SO_KEEPALIVE); 76 return opt_setboolean(L, ps, SOL_SOCKET, SO_KEEPALIVE);
58} 77}
59 78
60int opt_dontroute(lua_State *L, p_socket ps) 79int opt_set_dontroute(lua_State *L, p_socket ps)
61{ 80{
62 return opt_setboolean(L, ps, SOL_SOCKET, SO_DONTROUTE); 81 return opt_setboolean(L, ps, SOL_SOCKET, SO_DONTROUTE);
63} 82}
64 83
65int opt_broadcast(lua_State *L, p_socket ps) 84int opt_set_broadcast(lua_State *L, p_socket ps)
66{ 85{
67 return opt_setboolean(L, ps, SOL_SOCKET, SO_BROADCAST); 86 return opt_setboolean(L, ps, SOL_SOCKET, SO_BROADCAST);
68} 87}
69 88
70int opt_ip_multicast_loop(lua_State *L, p_socket ps) 89int opt_set_ip_multicast_loop(lua_State *L, p_socket ps)
71{ 90{
72 return opt_setboolean(L, ps, IPPROTO_IP, IP_MULTICAST_LOOP); 91 return opt_setboolean(L, ps, IPPROTO_IP, IP_MULTICAST_LOOP);
73} 92}
74 93
75int opt_linger(lua_State *L, p_socket ps) 94int opt_get_ip_multicast_loop(lua_State *L, p_socket ps)
95{
96 return opt_getboolean(L, ps, IPPROTO_IP, IP_MULTICAST_LOOP);
97}
98
99int opt_set_linger(lua_State *L, p_socket ps)
76{ 100{
77 struct linger li; /* obj, name, table */ 101 struct linger li; /* obj, name, table */
78 if (!lua_istable(L, 3)) luaL_typerror(L, 3, lua_typename(L, LUA_TTABLE)); 102 if (!lua_istable(L, 3)) luaL_typerror(L, 3, lua_typename(L, LUA_TTABLE));
@@ -89,18 +113,43 @@ int opt_linger(lua_State *L, p_socket ps)
89 return opt_set(L, ps, SOL_SOCKET, SO_LINGER, (char *) &li, sizeof(li)); 113 return opt_set(L, ps, SOL_SOCKET, SO_LINGER, (char *) &li, sizeof(li));
90} 114}
91 115
92int opt_ip_multicast_ttl(lua_State *L, p_socket ps) 116int opt_set_ip_multicast_ttl(lua_State *L, p_socket ps)
93{ 117{
94 int val = (int) luaL_checknumber(L, 3); /* obj, name, int */ 118 int val = (int) luaL_checknumber(L, 3); /* obj, name, int */
95 return opt_set(L, ps, SOL_SOCKET, SO_LINGER, (char *) &val, sizeof(val)); 119 return opt_set(L, ps, IPPROTO_IP, IP_MULTICAST_TTL,
120 (char *) &val, sizeof(val));
121}
122
123int opt_set_ip_multicast_if(lua_State *L, p_socket ps)
124{
125 const char *address = luaL_checkstring(L, 3); /* obj, name, ip */
126 struct in_addr val;
127 val.s_addr = htonl(INADDR_ANY);
128 if (strcmp(address, "*") && !inet_aton(address, &val))
129 luaL_argerror(L, 3, "ip expected");
130 return opt_set(L, ps, IPPROTO_IP, IP_MULTICAST_IF,
131 (char *) &val, sizeof(val));
132}
133
134int opt_get_ip_multicast_if(lua_State *L, p_socket ps)
135{
136 struct in_addr val;
137 socklen_t len = sizeof(val);
138 if (getsockopt(*ps, IPPROTO_IP, IP_MULTICAST_IF, (char *) &val, &len) < 0) {
139 lua_pushnil(L);
140 lua_pushstring(L, "getsockopt failed");
141 return 2;
142 }
143 lua_pushstring(L, inet_ntoa(val));
144 return 1;
96} 145}
97 146
98int opt_ip_add_membership(lua_State *L, p_socket ps) 147int opt_set_ip_add_membership(lua_State *L, p_socket ps)
99{ 148{
100 return opt_setmembership(L, ps, IPPROTO_IP, IP_ADD_MEMBERSHIP); 149 return opt_setmembership(L, ps, IPPROTO_IP, IP_ADD_MEMBERSHIP);
101} 150}
102 151
103int opt_ip_drop_membersip(lua_State *L, p_socket ps) 152int opt_set_ip_drop_membersip(lua_State *L, p_socket ps)
104{ 153{
105 return opt_setmembership(L, ps, IPPROTO_IP, IP_DROP_MEMBERSHIP); 154 return opt_setmembership(L, ps, IPPROTO_IP, IP_DROP_MEMBERSHIP);
106} 155}
@@ -141,6 +190,19 @@ int opt_set(lua_State *L, p_socket ps, int level, int name, void *val, int len)
141 return 1; 190 return 1;
142} 191}
143 192
193static int opt_getboolean(lua_State *L, p_socket ps, int level, int name)
194{
195 int val = 0;
196 socklen_t len = sizeof(val);
197 if (getsockopt(*ps, level, name, (char *) &val, &len) < 0) {
198 lua_pushnil(L);
199 lua_pushstring(L, "getsockopt failed");
200 return 2;
201 }
202 lua_pushboolean(L, val);
203 return 1;
204}
205
144static int opt_setboolean(lua_State *L, p_socket ps, int level, int name) 206static int opt_setboolean(lua_State *L, p_socket ps, int level, int name)
145{ 207{
146 int val = auxiliar_checkboolean(L, 3); /* obj, name, bool */ 208 int val = auxiliar_checkboolean(L, 3); /* obj, name, bool */
diff --git a/src/options.h b/src/options.h
index 900761e..aa43cab 100644
--- a/src/options.h
+++ b/src/options.h
@@ -6,8 +6,6 @@
6* 6*
7* This module provides a common interface to socket options, used mainly by 7* This module provides a common interface to socket options, used mainly by
8* modules UDP and TCP. 8* modules UDP and TCP.
9*
10* RCS ID: $Id$
11\*=========================================================================*/ 9\*=========================================================================*/
12 10
13#include "lua.h" 11#include "lua.h"
@@ -20,20 +18,28 @@ typedef struct t_opt {
20} t_opt; 18} t_opt;
21typedef t_opt *p_opt; 19typedef t_opt *p_opt;
22 20
23/* supported options */ 21/* supported options for setoption */
24int opt_dontroute(lua_State *L, p_socket ps); 22int opt_set_dontroute(lua_State *L, p_socket ps);
25int opt_broadcast(lua_State *L, p_socket ps); 23int opt_set_broadcast(lua_State *L, p_socket ps);
26int opt_reuseaddr(lua_State *L, p_socket ps); 24int opt_set_reuseaddr(lua_State *L, p_socket ps);
27int opt_tcp_nodelay(lua_State *L, p_socket ps); 25int opt_set_tcp_nodelay(lua_State *L, p_socket ps);
28int opt_keepalive(lua_State *L, p_socket ps); 26int opt_set_keepalive(lua_State *L, p_socket ps);
29int opt_linger(lua_State *L, p_socket ps); 27int opt_set_linger(lua_State *L, p_socket ps);
30int opt_reuseaddr(lua_State *L, p_socket ps); 28int opt_set_reuseaddr(lua_State *L, p_socket ps);
31int opt_ip_multicast_ttl(lua_State *L, p_socket ps); 29int opt_set_reuseport(lua_State *L, p_socket ps);
32int opt_ip_multicast_loop(lua_State *L, p_socket ps); 30int opt_set_ip_multicast_if(lua_State *L, p_socket ps);
33int opt_ip_add_membership(lua_State *L, p_socket ps); 31int opt_set_ip_multicast_ttl(lua_State *L, p_socket ps);
34int opt_ip_drop_membersip(lua_State *L, p_socket ps); 32int opt_set_ip_multicast_loop(lua_State *L, p_socket ps);
35 33int opt_set_ip_add_membership(lua_State *L, p_socket ps);
34int opt_set_ip_drop_membersip(lua_State *L, p_socket ps);
36/* invokes the appropriate option handler */ 35/* invokes the appropriate option handler */
37int opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps); 36int opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps);
38 37
38/* supported options for getoption */
39int opt_get_ip_multicast_loop(lua_State *L, p_socket ps);
40int opt_get_ip_multicast_if(lua_State *L, p_socket ps);
41/* invokes the appropriate option handler */
42int opt_meth_getoption(lua_State *L, p_opt opt, p_socket ps);
43
44
39#endif 45#endif
diff --git a/src/select.c b/src/select.c
index 99b59f5..8e47d0e 100644
--- a/src/select.c
+++ b/src/select.c
@@ -18,8 +18,8 @@
18\*=========================================================================*/ 18\*=========================================================================*/
19static t_socket getfd(lua_State *L); 19static t_socket getfd(lua_State *L);
20static int dirty(lua_State *L); 20static int dirty(lua_State *L);
21static t_socket collect_fd(lua_State *L, int tab, t_socket max_fd, 21static void collect_fd(lua_State *L, int tab, int itab,
22 int itab, fd_set *set); 22 fd_set *set, t_socket *max_fd);
23static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set); 23static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set);
24static void return_fd(lua_State *L, fd_set *set, t_socket max_fd, 24static void return_fd(lua_State *L, fd_set *set, t_socket max_fd,
25 int itab, int tab, int start); 25 int itab, int tab, int start);
@@ -39,6 +39,9 @@ static luaL_reg func[] = {
39* Initializes module 39* Initializes module
40\*-------------------------------------------------------------------------*/ 40\*-------------------------------------------------------------------------*/
41int select_open(lua_State *L) { 41int select_open(lua_State *L) {
42 lua_pushstring(L, "_SETSIZE");
43 lua_pushnumber(L, FD_SETSIZE);
44 lua_rawset(L, -3);
42 luaL_openlib(L, NULL, func, 0); 45 luaL_openlib(L, NULL, func, 0);
43 return 0; 46 return 0;
44} 47}
@@ -51,7 +54,7 @@ int select_open(lua_State *L) {
51\*-------------------------------------------------------------------------*/ 54\*-------------------------------------------------------------------------*/
52static int global_select(lua_State *L) { 55static int global_select(lua_State *L) {
53 int rtab, wtab, itab, ret, ndirty; 56 int rtab, wtab, itab, ret, ndirty;
54 t_socket max_fd; 57 t_socket max_fd = SOCKET_INVALID;
55 fd_set rset, wset; 58 fd_set rset, wset;
56 t_timeout tm; 59 t_timeout tm;
57 double t = luaL_optnumber(L, 3, -1); 60 double t = luaL_optnumber(L, 3, -1);
@@ -60,12 +63,12 @@ static int global_select(lua_State *L) {
60 lua_newtable(L); itab = lua_gettop(L); 63 lua_newtable(L); itab = lua_gettop(L);
61 lua_newtable(L); rtab = lua_gettop(L); 64 lua_newtable(L); rtab = lua_gettop(L);
62 lua_newtable(L); wtab = lua_gettop(L); 65 lua_newtable(L); wtab = lua_gettop(L);
63 max_fd = collect_fd(L, 1, SOCKET_INVALID, itab, &rset); 66 collect_fd(L, 1, itab, &rset, &max_fd);
67 collect_fd(L, 2, itab, &wset, &max_fd);
64 ndirty = check_dirty(L, 1, rtab, &rset); 68 ndirty = check_dirty(L, 1, rtab, &rset);
65 t = ndirty > 0? 0.0: t; 69 t = ndirty > 0? 0.0: t;
66 timeout_init(&tm, t, -1); 70 timeout_init(&tm, t, -1);
67 timeout_markstart(&tm); 71 timeout_markstart(&tm);
68 max_fd = collect_fd(L, 2, max_fd, itab, &wset);
69 ret = socket_select(max_fd+1, &rset, &wset, NULL, &tm); 72 ret = socket_select(max_fd+1, &rset, &wset, NULL, &tm);
70 if (ret > 0 || ndirty > 0) { 73 if (ret > 0 || ndirty > 0) {
71 return_fd(L, &rset, max_fd+1, itab, rtab, ndirty); 74 return_fd(L, &rset, max_fd+1, itab, rtab, ndirty);
@@ -77,7 +80,7 @@ static int global_select(lua_State *L) {
77 lua_pushstring(L, "timeout"); 80 lua_pushstring(L, "timeout");
78 return 3; 81 return 3;
79 } else { 82 } else {
80 lua_pushstring(L, "error"); 83 luaL_error(L, "select failed");
81 return 3; 84 return 3;
82 } 85 }
83} 86}
@@ -112,11 +115,13 @@ static int dirty(lua_State *L) {
112 return is; 115 return is;
113} 116}
114 117
115static t_socket collect_fd(lua_State *L, int tab, t_socket max_fd, 118static void collect_fd(lua_State *L, int tab, int itab,
116 int itab, fd_set *set) { 119 fd_set *set, t_socket *max_fd) {
117 int i = 1; 120 int i = 1, n = 0;
118 if (lua_isnil(L, tab)) 121 /* nil is the same as an empty table */
119 return max_fd; 122 if (lua_isnil(L, tab)) return;
123 /* otherwise we need it to be a table */
124 luaL_checktype(L, tab, LUA_TTABLE);
120 while (1) { 125 while (1) {
121 t_socket fd; 126 t_socket fd;
122 lua_pushnumber(L, i); 127 lua_pushnumber(L, i);
@@ -125,11 +130,18 @@ static t_socket collect_fd(lua_State *L, int tab, t_socket max_fd,
125 lua_pop(L, 1); 130 lua_pop(L, 1);
126 break; 131 break;
127 } 132 }
133 /* getfd figures out if this is a socket */
128 fd = getfd(L); 134 fd = getfd(L);
129 if (fd != SOCKET_INVALID) { 135 if (fd != SOCKET_INVALID) {
136 /* make sure we don't overflow the fd_set */
137 if (n >= FD_SETSIZE)
138 luaL_argerror(L, tab, "too many sockets");
130 FD_SET(fd, set); 139 FD_SET(fd, set);
131 if (max_fd == SOCKET_INVALID || max_fd < fd) 140 n++;
132 max_fd = fd; 141 /* keep track of the largest descriptor so far */
142 if (*max_fd == SOCKET_INVALID || *max_fd < fd)
143 *max_fd = fd;
144 /* make sure we can map back from descriptor to the object */
133 lua_pushnumber(L, fd); 145 lua_pushnumber(L, fd);
134 lua_pushvalue(L, -2); 146 lua_pushvalue(L, -2);
135 lua_settable(L, itab); 147 lua_settable(L, itab);
@@ -137,7 +149,6 @@ static t_socket collect_fd(lua_State *L, int tab, t_socket max_fd,
137 lua_pop(L, 1); 149 lua_pop(L, 1);
138 i = i + 1; 150 i = i + 1;
139 } 151 }
140 return max_fd;
141} 152}
142 153
143static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set) { 154static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set) {
diff --git a/src/select.h b/src/select.h
index f2d2cc2..8750200 100644
--- a/src/select.h
+++ b/src/select.h
@@ -8,8 +8,6 @@
8* method getfd() which returns the descriptor to be passed to the 8* method getfd() which returns the descriptor to be passed to the
9* underlying select function. Another method, dirty(), should return 9* underlying select function. Another method, dirty(), should return
10* true if there is data ready for reading (required for buffered input). 10* true if there is data ready for reading (required for buffered input).
11*
12* RCS ID: $Id$
13\*=========================================================================*/ 11\*=========================================================================*/
14 12
15int select_open(lua_State *L); 13int select_open(lua_State *L);
diff --git a/src/smtp.lua b/src/smtp.lua
index 9a204d8..b39f5d6 100644
--- a/src/smtp.lua
+++ b/src/smtp.lua
@@ -16,6 +16,7 @@ local os = require("os")
16local socket = require("socket") 16local socket = require("socket")
17local tp = require("socket.tp") 17local tp = require("socket.tp")
18local ltn12 = require("ltn12") 18local ltn12 = require("ltn12")
19local headers = require("socket.headers")
19local mime = require("mime") 20local mime = require("mime")
20module("socket.smtp") 21module("socket.smtp")
21 22
@@ -146,10 +147,11 @@ end
146local send_message 147local send_message
147 148
148-- yield the headers all at once, it's faster 149-- yield the headers all at once, it's faster
149local function send_headers(headers) 150local function send_headers(tosend)
151 local canonic = headers.canonic
150 local h = "\r\n" 152 local h = "\r\n"
151 for i,v in base.pairs(headers) do 153 for f,v in base.pairs(tosend) do
152 h = i .. ': ' .. v .. "\r\n" .. h 154 h = (canonic[f] or f) .. ': ' .. v .. "\r\n" .. h
153 end 155 end
154 coroutine.yield(h) 156 coroutine.yield(h)
155end 157end
diff --git a/src/socket.h b/src/socket.h
index de5d79f..425628d 100644
--- a/src/socket.h
+++ b/src/socket.h
@@ -8,8 +8,6 @@
8* differences. Also, not all *nix platforms behave the same. This module 8* differences. Also, not all *nix platforms behave the same. This module
9* (and the associated usocket.h and wsocket.h) factor these differences and 9* (and the associated usocket.h and wsocket.h) factor these differences and
10* creates a interface compatible with the io.h module. 10* creates a interface compatible with the io.h module.
11*
12* RCS ID: $Id$
13\*=========================================================================*/ 11\*=========================================================================*/
14#include "io.h" 12#include "io.h"
15 13
diff --git a/src/tcp.c b/src/tcp.c
index 539ad5e..06d687b 100644
--- a/src/tcp.c
+++ b/src/tcp.c
@@ -64,11 +64,11 @@ static luaL_reg tcp[] = {
64}; 64};
65 65
66/* socket option handlers */ 66/* socket option handlers */
67static t_opt opt[] = { 67static t_opt optset[] = {
68 {"keepalive", opt_keepalive}, 68 {"keepalive", opt_set_keepalive},
69 {"reuseaddr", opt_reuseaddr}, 69 {"reuseaddr", opt_set_reuseaddr},
70 {"tcp-nodelay", opt_tcp_nodelay}, 70 {"tcp-nodelay", opt_set_tcp_nodelay},
71 {"linger", opt_linger}, 71 {"linger", opt_set_linger},
72 {NULL, NULL} 72 {NULL, NULL}
73}; 73};
74 74
@@ -128,7 +128,7 @@ static int meth_setstats(lua_State *L) {
128static int meth_setoption(lua_State *L) 128static int meth_setoption(lua_State *L)
129{ 129{
130 p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, "tcp{any}", 1); 130 p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, "tcp{any}", 1);
131 return opt_meth_setoption(L, opt, &tcp->sock); 131 return opt_meth_setoption(L, optset, &tcp->sock);
132} 132}
133 133
134/*-------------------------------------------------------------------------*\ 134/*-------------------------------------------------------------------------*\
diff --git a/src/tcp.h b/src/tcp.h
index 7e98ab6..a536b49 100644
--- a/src/tcp.h
+++ b/src/tcp.h
@@ -13,8 +13,6 @@
13* objects are tcp objects bound to some local address. Client objects are 13* objects are tcp objects bound to some local address. Client objects are
14* tcp objects either connected to some address or returned by the accept 14* tcp objects either connected to some address or returned by the accept
15* method of a server object. 15* method of a server object.
16*
17* RCS ID: $Id$
18\*=========================================================================*/ 16\*=========================================================================*/
19#include "lua.h" 17#include "lua.h"
20 18
diff --git a/src/timeout.c b/src/timeout.c
index 863546e..fb015f9 100644
--- a/src/timeout.c
+++ b/src/timeout.c
@@ -5,6 +5,8 @@
5* RCS ID: $Id$ 5* RCS ID: $Id$
6\*=========================================================================*/ 6\*=========================================================================*/
7#include <stdio.h> 7#include <stdio.h>
8#include <limits.h>
9#include <float.h>
8 10
9#include "lua.h" 11#include "lua.h"
10#include "lauxlib.h" 12#include "lauxlib.h"
@@ -187,13 +189,23 @@ static int timeout_lua_gettime(lua_State *L)
187/*-------------------------------------------------------------------------*\ 189/*-------------------------------------------------------------------------*\
188* Sleep for n seconds. 190* Sleep for n seconds.
189\*-------------------------------------------------------------------------*/ 191\*-------------------------------------------------------------------------*/
192#ifdef _WIN32
190int timeout_lua_sleep(lua_State *L) 193int timeout_lua_sleep(lua_State *L)
191{ 194{
192 double n = luaL_checknumber(L, 1); 195 double n = luaL_checknumber(L, 1);
193#ifdef _WIN32 196 if (n < 0.0) n = 0.0;
194 Sleep((int)(n*1000)); 197 if (n < DBL_MAX/1000.0) n *= 1000.0;
198 if (n > INT_MAX) n = INT_MAX;
199 Sleep((int)n);
200 return 0;
201}
195#else 202#else
203int timeout_lua_sleep(lua_State *L)
204{
205 double n = luaL_checknumber(L, 1);
196 struct timespec t, r; 206 struct timespec t, r;
207 if (n < 0.0) n = 0.0;
208 if (n > INT_MAX) n = INT_MAX;
197 t.tv_sec = (int) n; 209 t.tv_sec = (int) n;
198 n -= t.tv_sec; 210 n -= t.tv_sec;
199 t.tv_nsec = (int) (n * 1000000000); 211 t.tv_nsec = (int) (n * 1000000000);
@@ -202,6 +214,6 @@ int timeout_lua_sleep(lua_State *L)
202 t.tv_sec = r.tv_sec; 214 t.tv_sec = r.tv_sec;
203 t.tv_nsec = r.tv_nsec; 215 t.tv_nsec = r.tv_nsec;
204 } 216 }
205#endif
206 return 0; 217 return 0;
207} 218}
219#endif
diff --git a/src/timeout.h b/src/timeout.h
index a328bcc..6715ca7 100644
--- a/src/timeout.h
+++ b/src/timeout.h
@@ -3,8 +3,6 @@
3/*=========================================================================*\ 3/*=========================================================================*\
4* Timeout management functions 4* Timeout management functions
5* LuaSocket toolkit 5* LuaSocket toolkit
6*
7* RCS ID: $Id$
8\*=========================================================================*/ 6\*=========================================================================*/
9#include "lua.h" 7#include "lua.h"
10 8
diff --git a/src/tp.lua b/src/tp.lua
index 2eacdc4..5fd8d22 100644
--- a/src/tp.lua
+++ b/src/tp.lua
@@ -64,6 +64,7 @@ function metat.__index:check(ok)
64end 64end
65 65
66function metat.__index:command(cmd, arg) 66function metat.__index:command(cmd, arg)
67 cmd = string.upper(cmd)
67 if arg then 68 if arg then
68 return self.c:send(cmd .. " " .. arg.. "\r\n") 69 return self.c:send(cmd .. " " .. arg.. "\r\n")
69 else 70 else
diff --git a/src/udp.c b/src/udp.c
index e604bea..db519ca 100644
--- a/src/udp.c
+++ b/src/udp.c
@@ -37,6 +37,7 @@ static int meth_setsockname(lua_State *L);
37static int meth_setpeername(lua_State *L); 37static int meth_setpeername(lua_State *L);
38static int meth_close(lua_State *L); 38static int meth_close(lua_State *L);
39static int meth_setoption(lua_State *L); 39static int meth_setoption(lua_State *L);
40static int meth_getoption(lua_State *L);
40static int meth_settimeout(lua_State *L); 41static int meth_settimeout(lua_State *L);
41static int meth_getfd(lua_State *L); 42static int meth_getfd(lua_State *L);
42static int meth_setfd(lua_State *L); 43static int meth_setfd(lua_State *L);
@@ -57,22 +58,32 @@ static luaL_reg udp[] = {
57 {"sendto", meth_sendto}, 58 {"sendto", meth_sendto},
58 {"setfd", meth_setfd}, 59 {"setfd", meth_setfd},
59 {"setoption", meth_setoption}, 60 {"setoption", meth_setoption},
61 {"getoption", meth_getoption},
60 {"setpeername", meth_setpeername}, 62 {"setpeername", meth_setpeername},
61 {"setsockname", meth_setsockname}, 63 {"setsockname", meth_setsockname},
62 {"settimeout", meth_settimeout}, 64 {"settimeout", meth_settimeout},
63 {NULL, NULL} 65 {NULL, NULL}
64}; 66};
65 67
66/* socket options */ 68/* socket options for setoption */
67static t_opt opt[] = { 69static t_opt optset[] = {
68 {"dontroute", opt_dontroute}, 70 {"dontroute", opt_set_dontroute},
69 {"broadcast", opt_broadcast}, 71 {"broadcast", opt_set_broadcast},
70 {"reuseaddr", opt_reuseaddr}, 72 {"reuseaddr", opt_set_reuseaddr},
71 {"ip-multicast-ttl", opt_ip_multicast_ttl}, 73 {"reuseport", opt_set_reuseport},
72 {"ip-multicast-loop", opt_ip_multicast_loop}, 74 {"ip-multicast-if", opt_set_ip_multicast_if},
73 {"ip-add-membership", opt_ip_add_membership}, 75 {"ip-multicast-ttl", opt_set_ip_multicast_ttl},
74 {"ip-drop-membership", opt_ip_drop_membersip}, 76 {"ip-multicast-loop", opt_set_ip_multicast_loop},
75 {NULL, NULL} 77 {"ip-add-membership", opt_set_ip_add_membership},
78 {"ip-drop-membership", opt_set_ip_drop_membersip},
79 {NULL, NULL}
80};
81
82/* socket options for getoption */
83static t_opt optget[] = {
84 {"ip-multicast-if", opt_get_ip_multicast_if},
85 {"ip-multicast-loop", opt_get_ip_multicast_loop},
86 {NULL, NULL}
76}; 87};
77 88
78/* functions in library namespace */ 89/* functions in library namespace */
@@ -247,7 +258,15 @@ static int meth_getsockname(lua_State *L) {
247\*-------------------------------------------------------------------------*/ 258\*-------------------------------------------------------------------------*/
248static int meth_setoption(lua_State *L) { 259static int meth_setoption(lua_State *L) {
249 p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1); 260 p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1);
250 return opt_meth_setoption(L, opt, &udp->sock); 261 return opt_meth_setoption(L, optset, &udp->sock);
262}
263
264/*-------------------------------------------------------------------------*\
265* Just call option handler
266\*-------------------------------------------------------------------------*/
267static int meth_getoption(lua_State *L) {
268 p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1);
269 return opt_meth_getoption(L, optget, &udp->sock);
251} 270}
252 271
253/*-------------------------------------------------------------------------*\ 272/*-------------------------------------------------------------------------*\
diff --git a/src/udp.h b/src/udp.h
index d29f833..358d9e1 100644
--- a/src/udp.h
+++ b/src/udp.h
@@ -11,8 +11,6 @@
11* originally unconnected. They can be "connected" to a given address 11* originally unconnected. They can be "connected" to a given address
12* with a call to the setpeername function. The same function can be used to 12* with a call to the setpeername function. The same function can be used to
13* break the connection. 13* break the connection.
14*
15* RCS ID: $Id$
16\*=========================================================================*/ 14\*=========================================================================*/
17#include "lua.h" 15#include "lua.h"
18 16
diff --git a/src/unix.c b/src/unix.c
index 0430086..a309823 100644
--- a/src/unix.c
+++ b/src/unix.c
@@ -63,10 +63,10 @@ static luaL_reg un[] = {
63}; 63};
64 64
65/* socket option handlers */ 65/* socket option handlers */
66static t_opt opt[] = { 66static t_opt optset[] = {
67 {"keepalive", opt_keepalive}, 67 {"keepalive", opt_set_keepalive},
68 {"reuseaddr", opt_reuseaddr}, 68 {"reuseaddr", opt_set_reuseaddr},
69 {"linger", opt_linger}, 69 {"linger", opt_set_linger},
70 {NULL, NULL} 70 {NULL, NULL}
71}; 71};
72 72
@@ -128,7 +128,7 @@ static int meth_setstats(lua_State *L) {
128\*-------------------------------------------------------------------------*/ 128\*-------------------------------------------------------------------------*/
129static int meth_setoption(lua_State *L) { 129static int meth_setoption(lua_State *L) {
130 p_unix un = (p_unix) auxiliar_checkgroup(L, "unix{any}", 1); 130 p_unix un = (p_unix) auxiliar_checkgroup(L, "unix{any}", 1);
131 return opt_meth_setoption(L, opt, &un->sock); 131 return opt_meth_setoption(L, optset, &un->sock);
132} 132}
133 133
134/*-------------------------------------------------------------------------*\ 134/*-------------------------------------------------------------------------*\
diff --git a/src/unix.h b/src/unix.h
index 055b02b..39fa719 100644
--- a/src/unix.h
+++ b/src/unix.h
@@ -6,8 +6,6 @@
6* 6*
7* This module is just an example of how to extend LuaSocket with a new 7* This module is just an example of how to extend LuaSocket with a new
8* domain. 8* domain.
9*
10* RCS ID: $Id$
11\*=========================================================================*/ 9\*=========================================================================*/
12#include "lua.h" 10#include "lua.h"
13 11
@@ -23,6 +21,6 @@ typedef struct t_unix_ {
23} t_unix; 21} t_unix;
24typedef t_unix *p_unix; 22typedef t_unix *p_unix;
25 23
26int luaopen_socketunix(lua_State *L); 24int luaopen_socket_unix(lua_State *L);
27 25
28#endif /* UNIX_H */ 26#endif /* UNIX_H */
diff --git a/src/usocket.h b/src/usocket.h
index e1f7498..75bfe82 100644
--- a/src/usocket.h
+++ b/src/usocket.h
@@ -3,8 +3,6 @@
3/*=========================================================================*\ 3/*=========================================================================*\
4* Socket compatibilization module for Unix 4* Socket compatibilization module for Unix
5* LuaSocket toolkit 5* LuaSocket toolkit
6*
7* RCS ID: $Id$
8\*=========================================================================*/ 6\*=========================================================================*/
9 7
10/*=========================================================================*\ 8/*=========================================================================*\
@@ -32,6 +30,10 @@
32/* TCP options (nagle algorithm disable) */ 30/* TCP options (nagle algorithm disable) */
33#include <netinet/tcp.h> 31#include <netinet/tcp.h>
34 32
33#ifndef SO_REUSEPORT
34#define SO_REUSEPORT SO_REUSEADDR
35#endif
36
35typedef int t_socket; 37typedef int t_socket;
36typedef t_socket *p_socket; 38typedef t_socket *p_socket;
37 39
diff --git a/src/wsocket.h b/src/wsocket.h
index e4f0e92..8e0f114 100644
--- a/src/wsocket.h
+++ b/src/wsocket.h
@@ -3,14 +3,13 @@
3/*=========================================================================*\ 3/*=========================================================================*\
4* Socket compatibilization module for Win32 4* Socket compatibilization module for Win32
5* LuaSocket toolkit 5* LuaSocket toolkit
6*
7* RCS ID: $Id$
8\*=========================================================================*/ 6\*=========================================================================*/
9 7
10/*=========================================================================*\ 8/*=========================================================================*\
11* WinSock include files 9* WinSock include files
12\*=========================================================================*/ 10\*=========================================================================*/
13#include <winsock.h> 11#include <winsock2.h>
12#include <ws2tcpip.h>
14 13
15typedef int socklen_t; 14typedef int socklen_t;
16typedef SOCKET t_socket; 15typedef SOCKET t_socket;
@@ -18,4 +17,8 @@ typedef t_socket *p_socket;
18 17
19#define SOCKET_INVALID (INVALID_SOCKET) 18#define SOCKET_INVALID (INVALID_SOCKET)
20 19
20#ifndef SO_REUSEPORT
21#define SO_REUSEPORT SO_REUSEADDR
22#endif
23
21#endif /* WSOCKET_H */ 24#endif /* WSOCKET_H */
diff --git a/test/README b/test/README
index 180fa27..27837e0 100644
--- a/test/README
+++ b/test/README
@@ -8,5 +8,7 @@ The files provided are:
8 8
9To run these tests, just run lua on the server and then on the client. 9To run these tests, just run lua on the server and then on the client.
10 10
11 hello.lua -- run to verify if installation worked
12
11Good luck, 13Good luck,
12Diego. 14Diego.
diff --git a/test/hello.lua b/test/hello.lua
new file mode 100644
index 0000000..cfa5c82
--- /dev/null
+++ b/test/hello.lua
@@ -0,0 +1,3 @@
1require"socket"
2require"mime"
3print("Hello from " .. socket._VERSION .. " and " .. mime._VERSION .. "!")
diff --git a/test/httptest.lua b/test/httptest.lua
index dd53ec3..9d50a14 100644
--- a/test/httptest.lua
+++ b/test/httptest.lua
@@ -420,17 +420,17 @@ print("ok")
420io.write("testing HEAD method: ") 420io.write("testing HEAD method: ")
421local r, c, h = http.request { 421local r, c, h = http.request {
422 method = "HEAD", 422 method = "HEAD",
423 url = "http://www.cs.princeton.edu/~diego/" 423 url = "http://www.tecgraf.puc-rio.br/~diego/"
424} 424}
425assert(r and h and (c == 200), c) 425assert(r and h and (c == 200), c)
426print("ok") 426print("ok")
427 427
428------------------------------------------------------------------------ 428------------------------------------------------------------------------
429io.write("testing host not found: ") 429io.write("testing host not found: ")
430local c, e = socket.connect("wronghost", 80) 430local c, e = socket.connect("example.invalid", 80)
431local r, re = http.request{url = "http://wronghost/does/not/exist"} 431local r, re = http.request{url = "http://example.invalid/does/not/exist"}
432assert(r == nil and e == re) 432assert(r == nil and e == re, tostring(r) .. " " .. tostring(re))
433r, re = http.request("http://wronghost/does/not/exist") 433r, re = http.request("http://example.invalid/does/not/exist")
434assert(r == nil and e == re) 434assert(r == nil and e == re)
435print("ok") 435print("ok")
436 436
diff --git a/test/mimetest.lua b/test/mimetest.lua
index f52a351..11c3f4f 100644
--- a/test/mimetest.lua
+++ b/test/mimetest.lua
@@ -251,6 +251,28 @@ io.write("testing b64 padding: ")
251 print("ok") 251 print("ok")
252end 252end
253 253
254local function test_b64lowlevel()
255io.write("testing b64 low-level: ")
256 local a, b
257 a, b = mime.b64("", "")
258 assert(a == "" and b == "")
259 a, b = mime.b64(nil, "blablabla")
260 assert(a == nil and b == nil)
261 a, b = mime.b64("", nil)
262 assert(a == nil and b == nil)
263 a, b = mime.unb64("", "")
264 assert(a == "" and b == "")
265 a, b = mime.unb64(nil, "blablabla")
266 assert(a == nil and b == nil)
267 a, b = mime.unb64("", nil)
268 assert(a == nil and b == nil)
269 local binary=string.char(0x00,0x44,0x1D,0x14,0x0F,0xF4,0xDA,0x11,0xA9,0x78,0x00,0x14,0x38,0x50,0x60,0xCE)
270 local encoded = mime.b64(binary)
271 local decoded=mime.unb64(encoded)
272 assert(binary == decoded)
273 print("ok")
274end
275
254local t = socket.gettime() 276local t = socket.gettime()
255 277
256create_b64test() 278create_b64test()
@@ -260,6 +282,7 @@ decode_b64test()
260compare_b64test() 282compare_b64test()
261cleanup_b64test() 283cleanup_b64test()
262padding_b64test() 284padding_b64test()
285test_b64lowlevel()
263 286
264create_qptest() 287create_qptest()
265encode_qptest() 288encode_qptest()
@@ -270,4 +293,5 @@ decode_qptest()
270compare_qptest() 293compare_qptest()
271cleanup_qptest() 294cleanup_qptest()
272 295
296
273print(string.format("done in %.2fs", socket.gettime() - t)) 297print(string.format("done in %.2fs", socket.gettime() - t))
diff --git a/test/testclnt.lua b/test/testclnt.lua
index a7ca1ba..1f03b10 100644
--- a/test/testclnt.lua
+++ b/test/testclnt.lua
@@ -342,6 +342,7 @@ end
342------------------------------------------------------------------------ 342------------------------------------------------------------------------
343function test_selectbugs() 343function test_selectbugs()
344 local r, s, e = socket.select(nil, nil, 0.1) 344 local r, s, e = socket.select(nil, nil, 0.1)
345print(r, s, e)
345 assert(type(r) == "table" and type(s) == "table" and 346 assert(type(r) == "table" and type(s) == "table" and
346 (e == "timeout" or e == "error")) 347 (e == "timeout" or e == "error"))
347 pass("both nil: ok") 348 pass("both nil: ok")
@@ -352,10 +353,23 @@ function test_selectbugs()
352 (e == "timeout" or e == "error")) 353 (e == "timeout" or e == "error"))
353 pass("closed sockets: ok") 354 pass("closed sockets: ok")
354 e = pcall(socket.select, "wrong", 1, 0.1) 355 e = pcall(socket.select, "wrong", 1, 0.1)
355 assert(e == false) 356 assert(e == false, tostring(e))
356 e = pcall(socket.select, {}, 1, 0.1) 357 e = pcall(socket.select, {}, 1, 0.1)
357 assert(e == false) 358 assert(e == false, tostring(e))
358 pass("invalid input: ok") 359 pass("invalid input: ok")
360 local toomany = {}
361 for i = 1, socket._SETSIZE+1 do
362 toomany[#toomany+1] = socket.udp()
363 end
364 if #toomany > socket._SETSIZE then
365 local e = pcall(socket.select, toomany, nil, 0.1)
366 assert(e == false, tostring(e))
367 pass("too many sockets (" .. #toomany .. "): ok")
368 else
369 pass("unable to create enough sockets (max was "..#toomany..")")
370 pass("try using ulimit")
371 end
372 for _, c in ipairs(toomany) do c:close() end
359end 373end
360 374
361------------------------------------------------------------------------ 375------------------------------------------------------------------------
@@ -555,6 +569,25 @@ function test_readafterclose()
555 print("ok") 569 print("ok")
556end 570end
557 571
572------------------------------------------------------------------------
573function test_writeafterclose()
574 local str = 'little string'
575 reconnect()
576 remote (string.format ([[
577 data:close()
578 data = nil
579 ]]))
580 local sent, err, errsent
581 while not err do
582 sent, err, errsent, time = data:send(str)
583 end
584 print(sent, err, errsent, time)
585 print("ok")
586end
587
588------------------------------------------------------------------------
589--test_writeafterclose()
590
558test("method registration") 591test("method registration")
559test_methods(socket.tcp(), { 592test_methods(socket.tcp(), {
560 "accept", 593 "accept",
@@ -596,12 +629,12 @@ test_methods(socket.udp(), {
596 "settimeout" 629 "settimeout"
597}) 630})
598 631
599test("testing read after close")
600test_readafterclose()
601
602test("select function") 632test("select function")
603test_selectbugs() 633test_selectbugs()
604 634
635test("testing read after close")
636test_readafterclose()
637
605test("connect function") 638test("connect function")
606connect_timeout() 639connect_timeout()
607empty_connect() 640empty_connect()
diff --git a/test/testmesg.lua b/test/testmesg.lua
index 580693b..135a008 100644
--- a/test/testmesg.lua
+++ b/test/testmesg.lua
@@ -32,6 +32,8 @@ r, e = smtp.send{
32 port = 2525 32 port = 2525
33} 33}
34 34
35print(r, e)
36
35-- creates a source to send a message with two parts. The first part is 37-- creates a source to send a message with two parts. The first part is
36-- plain text, the second part is a PNG image, encoded as base64. 38-- plain text, the second part is a PNG image, encoded as base64.
37source = smtp.message{ 39source = smtp.message{