mirror of
				https://github.com/lunarmodules/luasocket.git
				synced 2025-10-31 18:35:45 +01:00 
			
		
		
		
	Decent makefiles!
This commit is contained in:
		
							
								
								
									
										26
									
								
								NEW
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								NEW
									
									
									
									
									
								
							| @@ -2,13 +2,19 @@ What's New | ||||
|  | ||||
| This is just a bug-fix/update release. | ||||
|  | ||||
|     * Improved: http.request() now supports deprecated HTTP/0.9 | ||||
|       servers (Florian Berger) | ||||
|     * Fixed: could return "timedout" instead of "timeout" (Leo Leo) | ||||
|     * Fixed: crash when reading '*a' on closed socket (Paul Ducklin); | ||||
|     * Fixed: return values are consistent when reading from closed sockets; | ||||
|     * Fixed: case sensitivity in headers of multipart messages in  | ||||
|       smtp.message() (Graham Henstridge); | ||||
|     * Fixed a couple instances of error() being called instead of base.error().       These would cause an error when an error was reported. :)  (Ketmar Dark); | ||||
|     * Fixed: test script now uses pairs() iterator instead of the old  | ||||
|       Lua syntax (Robert Dodier). | ||||
|     * Fixed: manual links to home.html changed to index.html (Robert Hahn) | ||||
|     * Fixed: mime.unb64() returns empty string on results that start | ||||
|       with a null character (Robert Raschke) | ||||
|     * Fixed: HTTP now automatically redirecting on 303 and 307 (Jonathan Gray) | ||||
|     * Fixed: sleep(-1) could sleep forever wasting CPU. Now it | ||||
|       returns immediately (MPB); | ||||
|  | ||||
|     * Improved: FTP commands are now sent in upper case to | ||||
|       help buggy servers (Anders Eurenius) | ||||
|     * Improved: known headers now sent in canonic | ||||
|       capitalization to help buggy servers (Joseph Stewart); | ||||
|     * Improved: Clarified tcp:receive() in the manual (MPB);   | ||||
|  | ||||
|     * Fixed: multicast didn't work on Windows (Herbert Leuwer, Adrian Sietsma) | ||||
|     * Fixed: select() reports an error when called with more | ||||
|       sockets than FD_SETSIZE (Lorenzo Leonini) | ||||
|   | ||||
							
								
								
									
										60
									
								
								config
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								config
									
									
									
									
									
								
							| @@ -1,60 +0,0 @@ | ||||
| #------ | ||||
| # LuaSocket makefile configuration | ||||
| # | ||||
|  | ||||
| #------ | ||||
| # Output file names | ||||
| # | ||||
| EXT=so | ||||
| SOCKET_V=2.0.2 | ||||
| MIME_V=1.0.2 | ||||
| SOCKET_SO=socket.$(EXT).$(SOCKET_V)  | ||||
| MIME_SO=mime.$(EXT).$(MIME_V) | ||||
| UNIX_SO=unix.$(EXT) | ||||
|  | ||||
| #------ | ||||
| # Lua includes and libraries | ||||
| # | ||||
| #LUAINC=-I/usr/local/include/lua50 | ||||
| #LUAINC=-I/usr/local/include/lua5.1 | ||||
| #LUAINC=-Ilua-5.1.1/src | ||||
|  | ||||
| #------ | ||||
| # Compat-5.1 directory | ||||
| # | ||||
| #COMPAT=compat-5.1r5 | ||||
|  | ||||
| #------ | ||||
| # Top of your Lua installation | ||||
| # Relative paths will be inside the src tree | ||||
| # | ||||
| #INSTALL_TOP_SHARE=/usr/local/share/lua/5.0 | ||||
| #INSTALL_TOP_LIB=/usr/local/lib/lua/5.0 | ||||
| INSTALL_TOP_SHARE=/usr/local/share/lua/5.1 | ||||
| INSTALL_TOP_LIB=/usr/local/lib/lua/5.1 | ||||
|  | ||||
| INSTALL_DATA=cp | ||||
| INSTALL_EXEC=cp | ||||
|  | ||||
| #------ | ||||
| # Compiler and linker settings | ||||
| # for Mac OS X | ||||
| # | ||||
| #CC=gcc | ||||
| #DEF= -DLUASOCKET_DEBUG -DUNIX_HAS_SUN_LEN | ||||
| #CFLAGS= $(LUAINC) -I$(COMPAT) $(DEF) -pedantic -Wall -O2 -fno-common | ||||
| #LDFLAGS=-bundle -undefined dynamic_lookup | ||||
| #LD=export MACOSX_DEPLOYMENT_TARGET="10.3"; gcc | ||||
|  | ||||
| #------ | ||||
| # Compiler and linker settings | ||||
| # for Linux | ||||
| CC=gcc | ||||
| DEF=-DLUASOCKET_DEBUG  | ||||
| CFLAGS= $(LUAINC) $(DEF) -pedantic -Wall -O2 -fpic | ||||
| LDFLAGS=-O -shared -fpic | ||||
| LD=gcc  | ||||
|  | ||||
| #------ | ||||
| # End of makefile configuration | ||||
| # | ||||
| @@ -24,8 +24,8 @@ | ||||
| </td></tr> | ||||
| </table> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#download">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#download">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a>  | ||||
| @@ -113,8 +113,8 @@ message. | ||||
| <hr> | ||||
| <center> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#down">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#down">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a> | ||||
|   | ||||
| @@ -24,8 +24,8 @@ | ||||
| </td></tr> | ||||
| </table> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#download">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#download">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a>  | ||||
| @@ -270,8 +270,8 @@ f, e = ftp.put{ | ||||
| <hr> | ||||
| <center> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#download">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#download">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a>  | ||||
|   | ||||
| @@ -24,8 +24,8 @@ | ||||
| </td></tr> | ||||
| </table> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#download">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#download">download</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a>  | ||||
| @@ -314,8 +314,8 @@ r, c = http.request { | ||||
| <hr> | ||||
| <center> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#download">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#download">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a>  | ||||
|   | ||||
| @@ -24,8 +24,8 @@ | ||||
| </td></tr> | ||||
| </table> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#download">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#download">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a>  | ||||
| @@ -87,7 +87,7 @@ Author: <A href="http://www.cs.princeton.edu/~diego">Diego Nehab</a> | ||||
| <h2 id=download>Download</h2> | ||||
|  | ||||
| <p> | ||||
| LuaSocket version 2.0.2 is now  available for download! It  is | ||||
| LuaSocket version 2.0.3 is now  available for download! It  is | ||||
| compatible with  Lua 5.1, and has     | ||||
| been tested on Windows XP, Linux, and Mac OS X. Chances | ||||
| are it works well on most UNIX distributions and Windows flavors. | ||||
| @@ -118,14 +118,15 @@ manual to find out how to properly install the library. | ||||
| <h2 id=thanks>Special thanks</h2> | ||||
|  | ||||
| <p> | ||||
| Throughout LuaSocket's history, many people gave suggestions that helped | ||||
| improve it. For that, I thank the Lua community.  | ||||
| Special thanks go to | ||||
| David Burgess, who has helped push the library to a new level of quality and | ||||
| from whom I have learned a lot of stuff that doesn't show up in RFCs. | ||||
| Special thanks also to Carlos Cassino, who played a big part in the  | ||||
| extensible design seen in the C core of LuaSocket 2.0. Mike Pall | ||||
| has been helping a lot too! Thanks to you all!  | ||||
| Throughout LuaSocket's history, many people gave suggestions | ||||
| that helped improve it. For that, I thank the Lua community. | ||||
| Special thanks go to David Burgess, who has helped push the | ||||
| library to a new level of quality and from whom I have | ||||
| learned a lot of stuff that doesn't show up in RFCs. | ||||
| Special thanks also to Carlos Cassino, who played a big part | ||||
| in the extensible design seen in the C core of LuaSocket | ||||
| 2.0. Mike Pall has been helping a lot too! Thanks to you | ||||
| all!  | ||||
| </p> | ||||
|  | ||||
| <!-- whatsnew +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> | ||||
| @@ -133,44 +134,26 @@ has been helping a lot too! Thanks to you all! | ||||
| <h2 id=new>What's New</h2> | ||||
|  | ||||
| <p> | ||||
| 2.0.2 is just a bug-fix/update release.  | ||||
| 2.0.3 is just a bug-fix/update release.  | ||||
| </p> | ||||
|  | ||||
| <ul> | ||||
| <li> Improved: http.request() now supports deprecated | ||||
| HTTP/0.9 servers (Florian Berger); | ||||
| <li> Fixed: could return "timedout" instead of "timeout" (Leo Leo); | ||||
| <li> Fixed: crash when reading '*a' on closed socket (Paul Ducklin); | ||||
| <li> Fixed: return values are consistent when reading from closed sockets; | ||||
| <li> Fixed: case sensitivity in headers of multipart | ||||
| messages in smtp.message() (Graham Henstridge); | ||||
| <li> Fixed a couple instances of error() being called instead of | ||||
| base.error(). These would cause an error when an error was | ||||
| reported :)  (Ketmar Dark); | ||||
| <li> Fixed: test script now uses pairs() iterator instead | ||||
| of the old Lua syntax (Robert Dodier). | ||||
| </ul> | ||||
|  | ||||
| <p> | ||||
| 2.0.1 is just a bug-fix/update release.  | ||||
| </p> | ||||
|  | ||||
| <ul> | ||||
| <li> Updated: now using <tt>compat-5.1r5</tt>;  | ||||
| <li> Improved: <tt>http.request</tt> is more robust to | ||||
| malformed URLs (Adrian Sietsma); | ||||
| <li> Improved: the simple <tt>http.request</tt> interface sends a | ||||
| "<tt>Content-type: application/x-www-form-urlencoded</tt>" | ||||
| header (William Trenker); | ||||
| <li> Improved: <tt>http.request</tt> is robust to evil | ||||
| servers that send inappropriate 100-continue messages | ||||
| (David Burgess); | ||||
| <li> Fixed: <tt>http.request</tt> was using the old host header during | ||||
| redirects (Florian Berger); | ||||
| <li> Fixed: sample <tt>unix.c</tt> had fallen through the | ||||
| cracks during development (Matthew Percival);  | ||||
| <li> Fixed: error code was not being propagated correctly in | ||||
| ftp.lua (David Burgess).  | ||||
| <li> Fixed: multicast didn't work on Windows, or anywhere | ||||
|      else for that matter (Herbert Leuwer, Adrian Sietsma) | ||||
| <li> Fixed: select() now reports an error when called with more | ||||
|      sockets than FD_SETSIZE (Lorenzo Leonini) | ||||
| <li> Fixed: manual links to home.html changed to index.html (Robert Hahn) | ||||
| <li> Fixed: mime.unb64() would return an empty string on results that started | ||||
|      with a null character (Robert Raschke) | ||||
| <li> Fixed: HTTP now automatically redirects on 303 and 307 (Jonathan Gray) | ||||
| <li> Fixed: calling sleep() with negative numbers could | ||||
|      block forever, wasting CPU. Now it returns immediately (MPB); | ||||
| <li> Improved: FTP commands are now sent in upper case to | ||||
|      help buggy servers (Anders Eurenius) | ||||
| <li> Improved: known headers now sent in canonic | ||||
|      capitalization to help buggy servers (Joseph Stewart); | ||||
| <li> Improved: Clarified tcp:receive() in the manual (MPB);   | ||||
| <li> Improved: Decent makefiles (LHF). | ||||
| </ul> | ||||
|  | ||||
| <!-- old ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> | ||||
| @@ -190,7 +173,7 @@ still available for those that have compatibility issues. | ||||
| <hr> | ||||
| <center> | ||||
| <p class=bar> | ||||
| <a href="home.html#download">download</a> · | ||||
| <a href="index.html#download">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a> | ||||
|   | ||||
| @@ -25,8 +25,8 @@ Installation"> | ||||
| </td></tr> | ||||
| </table> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#download">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#download">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a>  | ||||
| @@ -144,8 +144,8 @@ Lua 5.1.2  Copyright (C) 1994-2007 Lua.org, PUC-Rio | ||||
| <hr> | ||||
| <center> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#down">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#down">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a> | ||||
|   | ||||
| @@ -25,8 +25,8 @@ Library, Support"> | ||||
| </td></tr> | ||||
| </table> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#download">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#download">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a>  | ||||
| @@ -314,8 +314,8 @@ and many others are covered by the <a href=reference.html>reference manual</a>. | ||||
| <hr> | ||||
| <center> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#down">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#down">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a> | ||||
|   | ||||
| @@ -25,8 +25,8 @@ Pump, Support, Library"> | ||||
| </td></tr> | ||||
| </table> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#download">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#download">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a>  | ||||
| @@ -411,8 +411,8 @@ Creates and returns a source that produces the contents of a | ||||
| <hr> | ||||
| <center> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#down">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#down">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a> | ||||
|   | ||||
| @@ -24,8 +24,8 @@ | ||||
| </td></tr> | ||||
| </table> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#download">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#download">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a>  | ||||
| @@ -457,8 +457,8 @@ marker. | ||||
| <hr> | ||||
| <center> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#down">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#down">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a> | ||||
|   | ||||
| @@ -25,8 +25,8 @@ Support, Manual"> | ||||
| </td></tr> | ||||
| </table> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#download">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#download">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a>  | ||||
| @@ -151,6 +151,7 @@ Support, Manual"> | ||||
| <a href="socket.html#sink">sink</a>, | ||||
| <a href="socket.html#skip">skip</a>, | ||||
| <a href="socket.html#sleep">sleep</a>, | ||||
| <a href="socket.html#setsize">_SETSIZE</a>, | ||||
| <a href="socket.html#source">source</a>, | ||||
| <a href="tcp.html#tcp">tcp</a>, | ||||
| <a href="socket.html#try">try</a>, | ||||
| @@ -220,8 +221,8 @@ Support, Manual"> | ||||
| <hr> | ||||
| <center> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#down">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#down">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a> | ||||
|   | ||||
| @@ -25,8 +25,8 @@ Library, Support"> | ||||
| </td></tr> | ||||
| </table> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#download">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#download">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a>  | ||||
| @@ -398,8 +398,8 @@ r, e = smtp.send{ | ||||
| <hr> | ||||
| <center> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#down">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#down">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a> | ||||
|   | ||||
| @@ -24,8 +24,8 @@ | ||||
| </td></tr> | ||||
| </table> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#download">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#download">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <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 | ||||
| with debug support. | ||||
| </p> | ||||
|  | ||||
| <!-- get time +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> | ||||
|  | ||||
| <p class=name id=gettime>  | ||||
| socket.<b>gettime()</b> | ||||
| </p> | ||||
|  | ||||
| <p class=description> | ||||
| Returns the time in seconds, relative to the origin of the  | ||||
| universe. You should subtract the values returned by this function | ||||
| to get meaningful values.  | ||||
| </p> | ||||
|  | ||||
| <pre class=example> | ||||
| t = socket.gettime() | ||||
| -- do stuff | ||||
| print(socket.gettime() - t .. " seconds elapsed") | ||||
| </pre> | ||||
|  | ||||
| <!-- newtry +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> | ||||
|  | ||||
| <p class=name id=newtry>  | ||||
| @@ -199,6 +217,15 @@ themselves, to simplify the test if a specific socket has | ||||
| changed status.  | ||||
| </p> | ||||
|  | ||||
| <p class=note> | ||||
| <b>Note: </b>: <tt>select</tt> can monitor a limited number | ||||
| of sockets, as defined by the constant <tt>socket._SETSIZE</tt>. This | ||||
| number may be as high as 1024 or as low as 64 by default, | ||||
| depending on the system. It is usually possible to change this | ||||
| at compile time. Invoking <tt>select</tt> with a larger | ||||
| number of sockets will raise an error. | ||||
| </p> | ||||
|  | ||||
| <p class=note> | ||||
| <b>Important note</b>: a known bug in WinSock causes <tt>select</tt> to fail  | ||||
| on non-blocking TCP sockets. The function may return a socket as | ||||
| @@ -288,8 +315,8 @@ Freezes the program execution during a given amount of time. | ||||
| </p> | ||||
|  | ||||
| <p class=parameters>  | ||||
| <tt>Time</tt> is the number of seconds to sleep for.  | ||||
| The function truncates <tt>time</tt> down to the nearest integer.  | ||||
| <tt>Time</tt> is the number of seconds to sleep for. If | ||||
| <tt>time</tt> is negative, the function returns immediately. | ||||
| </p> | ||||
|  | ||||
| <!-- source +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> | ||||
| @@ -324,24 +351,17 @@ side closes the connection. | ||||
| The function returns a source with the appropriate behavior.  | ||||
| </p> | ||||
|  | ||||
| <!-- time ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> | ||||
| <!-- setsize ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> | ||||
|  | ||||
| <p class=name id=gettime>  | ||||
| socket.<b>gettime()</b> | ||||
| <p class=name id=setsize>  | ||||
| socket.<b>_SETSIZE</b> | ||||
| </p> | ||||
|  | ||||
| <p class=description> | ||||
| Returns the time in seconds, relative to the origin of the  | ||||
| universe. You should subtract the values returned by this function | ||||
| to get meaningful values.  | ||||
| The maximum number of sockets that the <a | ||||
| href=#select><tt>select</tt></a> function can handle.  | ||||
| </p> | ||||
|  | ||||
| <pre class=example> | ||||
| t = socket.gettime() | ||||
| -- do stuff | ||||
| print(socket.gettime() - t .. " seconds elapsed") | ||||
| </pre> | ||||
|  | ||||
| <!-- try ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> | ||||
|  | ||||
| <p class=name id=try>  | ||||
| @@ -386,8 +406,8 @@ This constant has a string describing the current LuaSocket version. | ||||
| <hr> | ||||
| <center> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#down">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#down">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a> | ||||
|   | ||||
							
								
								
									
										16
									
								
								doc/tcp.html
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								doc/tcp.html
									
									
									
									
									
								
							| @@ -24,8 +24,8 @@ | ||||
| </td></tr> | ||||
| </table> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#download">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#download">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a>  | ||||
| @@ -297,12 +297,12 @@ of any received data before return. | ||||
|  | ||||
| <p class=return> | ||||
| If successful, the method returns the received pattern. In case of error, | ||||
| the method returns <tt><b>nil</b></tt> followed by an error message which | ||||
| can be the string '<tt>closed</tt>'  in   case  the  connection  was | ||||
| the method returns <tt><b>nil</b></tt> followed by an error | ||||
| message, followed by a (possibly empty) string containing | ||||
| the partial that was received. The error message can be | ||||
| the string '<tt>closed</tt>'  in   case  the  connection  was | ||||
| closed  before  the transmission  was completed  or  the string | ||||
| '<tt>timeout</tt>' in  case there was a timeout during  the operation. | ||||
| Also, after the error message, the function returns the partial result of | ||||
| the transmission. | ||||
| </p> | ||||
|  | ||||
| <p class=note> | ||||
| @@ -514,8 +514,8 @@ This function returns 1. | ||||
| <hr> | ||||
| <center> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#down">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#down">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a> | ||||
|   | ||||
| @@ -24,8 +24,8 @@ | ||||
| </td></tr> | ||||
| </table> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#download">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#download">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a>  | ||||
| @@ -397,8 +397,8 @@ imperative nature obvious. | ||||
| <hr> | ||||
| <center> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#download">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#download">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a>  | ||||
|   | ||||
| @@ -24,8 +24,8 @@ | ||||
| </td></tr> | ||||
| </table> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#download">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#download">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a>  | ||||
| @@ -310,8 +310,8 @@ The function returns the decoded string. | ||||
| <hr> | ||||
| <center> | ||||
| <p class=bar> | ||||
| <a href="home.html">home</a> · | ||||
| <a href="home.html#down">download</a> · | ||||
| <a href="index.html">home</a> · | ||||
| <a href="index.html#down">download</a> · | ||||
| <a href="installation.html">installation</a> · | ||||
| <a href="introduction.html">introduction</a> · | ||||
| <a href="reference.html">reference</a> | ||||
|   | ||||
| @@ -54,7 +54,7 @@ function socket.protect(f) | ||||
|       local results = {coroutine.resume(co, base.unpack(arg))} | ||||
|       local status = table.remove(results, 1) | ||||
|       if not status then | ||||
|         if type(results[1]) == 'table' then | ||||
|         if base.type(results[1]) == 'table' then | ||||
|           return nil, results[1][1] | ||||
|         else base.error(results[1]) end | ||||
|       end | ||||
|   | ||||
| @@ -1,37 +1,25 @@ | ||||
| Microsoft Visual Studio Solution File, Format Version 8.00 | ||||
| Microsoft Visual Studio Solution File, Format Version 10.00 | ||||
| # Visual Studio 2008 | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "socket", "socket.vcproj", "{66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}" | ||||
| 	ProjectSection(ProjectDependencies) = postProject | ||||
| 	EndProjectSection | ||||
| EndProject | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mime", "mime.vcproj", "{128E8BD0-174A-48F0-8771-92B1E8D18713}" | ||||
| 	ProjectSection(ProjectDependencies) = postProject | ||||
| 	EndProjectSection | ||||
| EndProject | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libluasocket", "libluasocket.vcproj", "{599EAD40-60EE-4043-9C14-AE090A8A092D}" | ||||
| 	ProjectSection(ProjectDependencies) = postProject | ||||
| 	EndProjectSection | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfiguration) = preSolution | ||||
| 		Debug = Debug | ||||
| 		Release = Release | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| 		Debug|Win32 = Debug|Win32 | ||||
| 		Release|Win32 = Release|Win32 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ProjectConfiguration) = postSolution | ||||
| 		{66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}.Debug.ActiveCfg = Debug|Win32 | ||||
| 		{66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}.Debug.Build.0 = Debug|Win32 | ||||
| 		{66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}.Release.ActiveCfg = Release|Win32 | ||||
| 		{66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}.Release.Build.0 = Release|Win32 | ||||
| 		{128E8BD0-174A-48F0-8771-92B1E8D18713}.Debug.ActiveCfg = Debug|Win32 | ||||
| 		{128E8BD0-174A-48F0-8771-92B1E8D18713}.Debug.Build.0 = Debug|Win32 | ||||
| 		{128E8BD0-174A-48F0-8771-92B1E8D18713}.Release.ActiveCfg = Release|Win32 | ||||
| 		{128E8BD0-174A-48F0-8771-92B1E8D18713}.Release.Build.0 = Release|Win32 | ||||
| 		{599EAD40-60EE-4043-9C14-AE090A8A092D}.Debug.ActiveCfg = Debug|Win32 | ||||
| 		{599EAD40-60EE-4043-9C14-AE090A8A092D}.Debug.Build.0 = Debug|Win32 | ||||
| 		{599EAD40-60EE-4043-9C14-AE090A8A092D}.Release.ActiveCfg = Release|Win32 | ||||
| 		{599EAD40-60EE-4043-9C14-AE090A8A092D}.Release.Build.0 = Release|Win32 | ||||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||
| 		{66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}.Debug|Win32.ActiveCfg = Debug|Win32 | ||||
| 		{66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}.Debug|Win32.Build.0 = Debug|Win32 | ||||
| 		{66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}.Release|Win32.ActiveCfg = Release|Win32 | ||||
| 		{66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}.Release|Win32.Build.0 = Release|Win32 | ||||
| 		{128E8BD0-174A-48F0-8771-92B1E8D18713}.Debug|Win32.ActiveCfg = Debug|Win32 | ||||
| 		{128E8BD0-174A-48F0-8771-92B1E8D18713}.Debug|Win32.Build.0 = Debug|Win32 | ||||
| 		{128E8BD0-174A-48F0-8771-92B1E8D18713}.Release|Win32.ActiveCfg = Release|Win32 | ||||
| 		{128E8BD0-174A-48F0-8771-92B1E8D18713}.Release|Win32.Build.0 = Release|Win32 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ExtensibilityGlobals) = postSolution | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ExtensibilityAddIns) = postSolution | ||||
| 	GlobalSection(SolutionProperties) = preSolution | ||||
| 		HideSolutionNode = FALSE | ||||
| 	EndGlobalSection | ||||
| EndGlobal | ||||
|   | ||||
							
								
								
									
										56
									
								
								makefile
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								makefile
									
									
									
									
									
								
							| @@ -1,51 +1,23 @@ | ||||
| #------ | ||||
| # Load configuration | ||||
| # | ||||
| include config | ||||
| PLAT= none | ||||
| PLATS= macosx linux | ||||
|  | ||||
| #------ | ||||
| # Hopefully no need to change anything below this line | ||||
| # | ||||
| INSTALL_SOCKET_SHARE=$(INSTALL_TOP_SHARE)/socket | ||||
| INSTALL_SOCKET_LIB=$(INSTALL_TOP_LIB)/socket | ||||
| INSTALL_MIME_SHARE=$(INSTALL_TOP_SHARE)/mime | ||||
| INSTALL_MIME_LIB=$(INSTALL_TOP_LIB)/mime | ||||
| all: $(PLAT) | ||||
|  | ||||
| all clean: | ||||
| none: | ||||
| 	@echo "Please run" | ||||
| 	@echo "   make PLATFORM" | ||||
| 	@echo "where PLATFORM is one of these:" | ||||
| 	@echo "   $(PLATS)" | ||||
|  | ||||
| $(PLATS) install local clean: | ||||
| 	cd src; $(MAKE) $@ | ||||
|  | ||||
| #------ | ||||
| # Files to install | ||||
| # | ||||
| TO_SOCKET_SHARE:= \ | ||||
| 	http.lua \ | ||||
| 	url.lua \ | ||||
| 	tp.lua \ | ||||
| 	ftp.lua \ | ||||
| 	smtp.lua | ||||
| dummy: | ||||
|  | ||||
| TO_TOP_SHARE:= \ | ||||
| 	ltn12.lua \ | ||||
| 	socket.lua \ | ||||
| 	mime.lua | ||||
| test: dummy | ||||
| 	lua test/hello.lua | ||||
|  | ||||
| TO_MIME_SHARE:=  | ||||
|  | ||||
| #------ | ||||
| # Install LuaSocket according to recommendation | ||||
| # | ||||
| install: all | ||||
| 	cd src; mkdir -p $(INSTALL_TOP_SHARE) | ||||
| 	cd src; $(INSTALL_DATA) $(TO_TOP_SHARE) $(INSTALL_TOP_SHARE) | ||||
| 	cd src; mkdir -p $(INSTALL_SOCKET_SHARE) | ||||
| 	cd src; $(INSTALL_DATA) $(TO_SOCKET_SHARE) $(INSTALL_SOCKET_SHARE) | ||||
| 	cd src; mkdir -p $(INSTALL_SOCKET_LIB) | ||||
| 	cd src; $(INSTALL_EXEC) $(SOCKET_SO) $(INSTALL_SOCKET_LIB)/core.$(EXT) | ||||
| 	#cd src; mkdir -p $(INSTALL_MIME_SHARE) | ||||
| 	#cd src; $(INSTALL_DATA) $(TO_MIME_SHARE) $(INSTALL_MIME_SHARE) | ||||
| 	cd src; mkdir -p $(INSTALL_MIME_LIB) | ||||
| 	cd src; $(INSTALL_EXEC) $(MIME_SO) $(INSTALL_MIME_LIB)/core.$(EXT) | ||||
|  | ||||
| #------ | ||||
| # End of makefile | ||||
| # | ||||
| .PHONY: dummy | ||||
|   | ||||
| @@ -1,10 +1,11 @@ | ||||
| #-------------------------------------------------------------------------- | ||||
| # Distribution makefile | ||||
| #-------------------------------------------------------------------------- | ||||
| DIST = luasocket-2.0.2 | ||||
| DIST = luasocket-2.0.3 | ||||
|  | ||||
| TEST = \ | ||||
| 	test/README \ | ||||
| 	test/hello.lua \ | ||||
| 	test/testclnt.lua \ | ||||
| 	test/testsrvr.lua \ | ||||
| 	test/testsupport.lua | ||||
| @@ -15,6 +16,8 @@ SAMPLES = \ | ||||
| 	samples/daytimeclnt.lua \ | ||||
| 	samples/echoclnt.lua \ | ||||
| 	samples/echosrvr.lua \ | ||||
| 	samples/mclisten.lua \ | ||||
| 	samples/mcsend.lua \ | ||||
| 	samples/listener.lua \ | ||||
| 	samples/lpr.lua \ | ||||
| 	samples/talker.lua \ | ||||
| @@ -73,12 +76,12 @@ SRC = \ | ||||
| 	src/mime.lua \ | ||||
| 	src/smtp.lua \ | ||||
| 	src/socket.lua \ | ||||
| 	src/headers.lua \ | ||||
| 	src/tp.lua \ | ||||
| 	src/url.lua | ||||
|  | ||||
| MAKE = \ | ||||
| 	makefile \ | ||||
| 	config \ | ||||
| 	luasocket.sln \ | ||||
| 	socket.vcproj \ | ||||
| 	mime.vcproj | ||||
|   | ||||
							
								
								
									
										176
									
								
								mime.vcproj
									
									
									
									
									
								
							
							
						
						
									
										176
									
								
								mime.vcproj
									
									
									
									
									
								
							| @@ -1,114 +1,179 @@ | ||||
| <?xml version="1.0" encoding="Windows-1252"?> | ||||
| <VisualStudioProject | ||||
| 	ProjectType="Visual C++" | ||||
| 	Version="7.10" | ||||
| 	Version="9.00" | ||||
| 	Name="mime" | ||||
| 	ProjectGUID="{128E8BD0-174A-48F0-8771-92B1E8D18713}" | ||||
| 	Keyword="Win32Proj"> | ||||
| 	Keyword="Win32Proj" | ||||
| 	TargetFrameworkVersion="131072" | ||||
| 	> | ||||
| 	<Platforms> | ||||
| 		<Platform | ||||
| 			Name="Win32"/> | ||||
| 			Name="Win32" | ||||
| 		/> | ||||
| 	</Platforms> | ||||
| 	<ToolFiles> | ||||
| 	</ToolFiles> | ||||
| 	<Configurations> | ||||
| 		<Configuration | ||||
| 			Name="Debug|Win32" | ||||
| 			OutputDirectory="src" | ||||
| 			IntermediateDirectory="src" | ||||
| 			ConfigurationType="2" | ||||
| 			CharacterSet="2"> | ||||
| 			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="h:\include\lua5.1" | ||||
| 				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MIME_EXPORTS;MIME_API=__declspec(dllexport)" | ||||
| 				MinimalRebuild="TRUE" | ||||
| 				AdditionalIncludeDirectories="..\lua-5.1.4\src" | ||||
| 				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MIME_EXPORTS;MIME_API=__declspec(dllexport);_CRT_SECURE_NO_WARNINGS" | ||||
| 				MinimalRebuild="true" | ||||
| 				BasicRuntimeChecks="3" | ||||
| 				RuntimeLibrary="3" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="TRUE" | ||||
| 				DebugInformationFormat="4"/> | ||||
| 				Detect64BitPortabilityProblems="false" | ||||
| 				DebugInformationFormat="4" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool"/> | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="lua5.1.lib" | ||||
| 				OutputFile="$(OutDir)/mime.dll" | ||||
| 				LinkIncremental="2" | ||||
| 				AdditionalLibraryDirectories="h:\lib" | ||||
| 				GenerateDebugInformation="TRUE" | ||||
| 				AdditionalLibraryDirectories="..\lua-5.1.4" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				ProgramDatabaseFile="$(OutDir)/mime.pdb" | ||||
| 				SubSystem="2" | ||||
| 				RandomizedBaseAddress="1" | ||||
| 				DataExecutionPrevention="0" | ||||
| 				ImportLibrary="$(OutDir)/mime.lib" | ||||
| 				TargetMachine="1"/> | ||||
| 				TargetMachine="1" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool"/> | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool"/> | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool"/> | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool"/> | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool"/> | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool"/> | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool"/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool"/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedWrapperGeneratorTool"/> | ||||
| 			<Tool | ||||
| 				Name="VCAuxiliaryManagedWrapperGeneratorTool"/> | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Release|Win32" | ||||
| 			OutputDirectory="src" | ||||
| 			IntermediateDirectory="src" | ||||
| 			ConfigurationType="2" | ||||
| 			CharacterSet="2"> | ||||
| 			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				AdditionalIncludeDirectories="h:\include\lua5.1" | ||||
| 				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MIME_EXPORTS; MIME_API=__declspec(dllexport)" | ||||
| 				AdditionalIncludeDirectories="..\lua-5.1.4\src" | ||||
| 				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MIME_EXPORTS; MIME_API=__declspec(dllexport);_CRT_SECURE_NO_WARNINGS" | ||||
| 				RuntimeLibrary="2" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				WarningLevel="4" | ||||
| 				Detect64BitPortabilityProblems="TRUE" | ||||
| 				DebugInformationFormat="0"/> | ||||
| 				Detect64BitPortabilityProblems="false" | ||||
| 				DebugInformationFormat="0" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool"/> | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="lua5.1.lib" | ||||
| 				OutputFile="$(OutDir)/mime.dll" | ||||
| 				LinkIncremental="1" | ||||
| 				AdditionalLibraryDirectories="h:\lib" | ||||
| 				GenerateDebugInformation="TRUE" | ||||
| 				AdditionalLibraryDirectories="..\lua-5.1.4" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				SubSystem="2" | ||||
| 				OptimizeReferences="2" | ||||
| 				EnableCOMDATFolding="2" | ||||
| 				RandomizedBaseAddress="1" | ||||
| 				DataExecutionPrevention="0" | ||||
| 				ImportLibrary="$(OutDir)/mime.lib" | ||||
| 				TargetMachine="1"/> | ||||
| 				TargetMachine="1" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool"/> | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool"/> | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool"/> | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool"/> | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool"/> | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool"/> | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool"/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool"/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedWrapperGeneratorTool"/> | ||||
| 			<Tool | ||||
| 				Name="VCAuxiliaryManagedWrapperGeneratorTool"/> | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 	</Configurations> | ||||
| 	<References> | ||||
| @@ -117,24 +182,25 @@ | ||||
| 		<Filter | ||||
| 			Name="Source Files" | ||||
| 			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" | ||||
| 			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> | ||||
| 			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" | ||||
| 			> | ||||
| 			<File | ||||
| 				RelativePath="src\mime.c"> | ||||
| 				RelativePath="src\mime.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 		</Filter> | ||||
| 		<Filter | ||||
| 			Name="Header Files" | ||||
| 			Filter="h;hpp;hxx;hm;inl;inc;xsd" | ||||
| 			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> | ||||
| 			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" | ||||
| 			> | ||||
| 		</Filter> | ||||
| 		<Filter | ||||
| 			Name="Resource Files" | ||||
| 			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" | ||||
| 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"> | ||||
| 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" | ||||
| 			> | ||||
| 		</Filter> | ||||
| 		<File | ||||
| 			RelativePath="..\..\lib\lua5.1.dll.lib"> | ||||
| 		</File> | ||||
| 	</Files> | ||||
| 	<Globals> | ||||
| 	</Globals> | ||||
|   | ||||
| @@ -32,7 +32,7 @@ end | ||||
| local host = socket.dns.gethostname() | ||||
| local query = "%s?cmd=cddb+read+%s+%s&hello=LuaSocket+%s+LuaSocket+2.0&proto=6" | ||||
| local url = string.format(query, server, arg[1], arg[2], host) | ||||
| local body, headers, code = http.get(url) | ||||
| local body, headers, code = http.request(url) | ||||
|  | ||||
| if code == 200 then | ||||
|     local data, code, error = parse(body) | ||||
|   | ||||
							
								
								
									
										217
									
								
								socket.vcproj
									
									
									
									
									
								
							
							
						
						
									
										217
									
								
								socket.vcproj
									
									
									
									
									
								
							| @@ -1,116 +1,179 @@ | ||||
| <?xml version="1.0" encoding="Windows-1252"?> | ||||
| <VisualStudioProject | ||||
| 	ProjectType="Visual C++" | ||||
| 	Version="7.10" | ||||
| 	Version="9.00" | ||||
| 	Name="socket" | ||||
| 	ProjectGUID="{66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}" | ||||
| 	Keyword="Win32Proj"> | ||||
| 	Keyword="Win32Proj" | ||||
| 	TargetFrameworkVersion="131072" | ||||
| 	> | ||||
| 	<Platforms> | ||||
| 		<Platform | ||||
| 			Name="Win32"/> | ||||
| 			Name="Win32" | ||||
| 		/> | ||||
| 	</Platforms> | ||||
| 	<ToolFiles> | ||||
| 	</ToolFiles> | ||||
| 	<Configurations> | ||||
| 		<Configuration | ||||
| 			Name="Debug|Win32" | ||||
| 			OutputDirectory="src" | ||||
| 			IntermediateDirectory="src" | ||||
| 			ConfigurationType="2" | ||||
| 			CharacterSet="2"> | ||||
| 			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="h:\include\lua5.1" | ||||
| 				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LUASOCKET_EXPORTS;LUASOCKET_API=__declspec(dllexport)" | ||||
| 				MinimalRebuild="TRUE" | ||||
| 				AdditionalIncludeDirectories="..\lua-5.1.4\src" | ||||
| 				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LUASOCKET_EXPORTS;LUASOCKET_API=__declspec(dllexport);_CRT_SECURE_NO_WARNINGS" | ||||
| 				MinimalRebuild="true" | ||||
| 				BasicRuntimeChecks="3" | ||||
| 				RuntimeLibrary="3" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="TRUE" | ||||
| 				DebugInformationFormat="4"/> | ||||
| 				Detect64BitPortabilityProblems="false" | ||||
| 				DebugInformationFormat="4" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool"/> | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="ws2_32.lib" | ||||
| 				AdditionalDependencies="ws2_32.lib lua5.1.lib" | ||||
| 				OutputFile="$(OutDir)/socket.dll" | ||||
| 				LinkIncremental="2" | ||||
| 				AdditionalLibraryDirectories="h:\lib" | ||||
| 				GenerateDebugInformation="TRUE" | ||||
| 				AdditionalLibraryDirectories="..\lua-5.1.4" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				ProgramDatabaseFile="$(OutDir)/socket.pdb" | ||||
| 				SubSystem="2" | ||||
| 				RandomizedBaseAddress="1" | ||||
| 				DataExecutionPrevention="0" | ||||
| 				ImportLibrary="$(OutDir)/socket.lib" | ||||
| 				TargetMachine="1"/> | ||||
| 				TargetMachine="1" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool"/> | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool"/> | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool"/> | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool"/> | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool"/> | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool"/> | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool"/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool"/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedWrapperGeneratorTool"/> | ||||
| 			<Tool | ||||
| 				Name="VCAuxiliaryManagedWrapperGeneratorTool"/> | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Release|Win32" | ||||
| 			OutputDirectory="./src" | ||||
| 			IntermediateDirectory="./src" | ||||
| 			ConfigurationType="2" | ||||
| 			CharacterSet="2"> | ||||
| 			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				AdditionalIncludeDirectories="h:\include\lua5.1" | ||||
| 				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LUASOCKET_EXPORTS;LUASOCKET_API=__declspec(dllexport);  LUASOCKET_DEBUG" | ||||
| 				AdditionalIncludeDirectories="..\lua-5.1.4\src" | ||||
| 				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LUASOCKET_EXPORTS;LUASOCKET_API=__declspec(dllexport);  LUASOCKET_DEBUG; _CRT_SECURE_NO_WARNINGS" | ||||
| 				RuntimeLibrary="2" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="TRUE" | ||||
| 				DebugInformationFormat="0"/> | ||||
| 				Detect64BitPortabilityProblems="false" | ||||
| 				DebugInformationFormat="0" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool"/> | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="ws2_32.lib" | ||||
| 				AdditionalDependencies="ws2_32.lib lua5.1.lib" | ||||
| 				OutputFile="$(OutDir)/socket.dll" | ||||
| 				LinkIncremental="1" | ||||
| 				AdditionalLibraryDirectories="h:\lib" | ||||
| 				GenerateDebugInformation="TRUE" | ||||
| 				AdditionalLibraryDirectories="..\lua-5.1.4" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				SubSystem="2" | ||||
| 				OptimizeReferences="2" | ||||
| 				EnableCOMDATFolding="2" | ||||
| 				RandomizedBaseAddress="1" | ||||
| 				DataExecutionPrevention="0" | ||||
| 				ImportLibrary="$(OutDir)/socket.lib" | ||||
| 				TargetMachine="1"/> | ||||
| 				TargetMachine="1" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool"/> | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool"/> | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool"/> | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool"/> | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool"/> | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool"/> | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool"/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool"/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedWrapperGeneratorTool"/> | ||||
| 			<Tool | ||||
| 				Name="VCAuxiliaryManagedWrapperGeneratorTool"/> | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 	</Configurations> | ||||
| 	<References> | ||||
| @@ -119,63 +182,77 @@ | ||||
| 		<Filter | ||||
| 			Name="Source Files" | ||||
| 			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" | ||||
| 			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> | ||||
| 			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" | ||||
| 			> | ||||
| 			<File | ||||
| 				RelativePath="src\auxiliar.c"> | ||||
| 				RelativePath="src\auxiliar.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="src\buffer.c"> | ||||
| 				RelativePath="src\buffer.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="src\except.c"> | ||||
| 				RelativePath="src\except.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="src\inet.c"> | ||||
| 				RelativePath="src\inet.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="src\io.c"> | ||||
| 				RelativePath="src\io.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="src\luasocket.c"> | ||||
| 				RelativePath="src\luasocket.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="src\options.c"> | ||||
| 				RelativePath="src\options.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="src\select.c"> | ||||
| 				RelativePath="src\select.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="src\tcp.c"> | ||||
| 				RelativePath="src\tcp.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="src\timeout.c"> | ||||
| 				RelativePath="src\timeout.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="src\udp.c"> | ||||
| 				RelativePath="src\udp.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="src\wsocket.c"> | ||||
| 				RelativePath="src\wsocket.c" | ||||
| 				> | ||||
| 				<FileConfiguration | ||||
| 					Name="Release|Win32"> | ||||
| 					Name="Release|Win32" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 						GeneratePreprocessedFile="0"/> | ||||
| 						GeneratePreprocessedFile="0" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 			</File> | ||||
| 		</Filter> | ||||
| 		<Filter | ||||
| 			Name="Header Files" | ||||
| 			Filter="h;hpp;hxx;hm;inl;inc;xsd" | ||||
| 			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> | ||||
| 			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" | ||||
| 			> | ||||
| 		</Filter> | ||||
| 		<Filter | ||||
| 			Name="Resource Files" | ||||
| 			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" | ||||
| 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"> | ||||
| 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" | ||||
| 			> | ||||
| 		</Filter> | ||||
| 		<File | ||||
| 			RelativePath="..\..\lib\lua5.1.dll.lib"> | ||||
| 		</File> | ||||
| 	</Files> | ||||
| 	<Globals> | ||||
| 	</Globals> | ||||
|   | ||||
| @@ -27,8 +27,6 @@ | ||||
| * | ||||
| * The mapping from class name to the corresponding metatable and the | ||||
| * reverse mapping are done using lauxlib.  | ||||
| * | ||||
| * RCS ID: $Id$ | ||||
| \*=========================================================================*/ | ||||
|  | ||||
| #include "lua.h" | ||||
|   | ||||
| @@ -166,7 +166,7 @@ static int sendraw(p_buffer buf, const char *data, size_t count, size_t *sent) { | ||||
|     size_t total = 0; | ||||
|     int err = IO_DONE; | ||||
|     while (total < count && err == IO_DONE) { | ||||
|         size_t done; | ||||
|         size_t done = 0; | ||||
|         size_t step = (count-total <= STEPSIZE)? count-total: STEPSIZE; | ||||
|         err = io->send(io->ctx, data+total, step, &done, tm); | ||||
|         total += done; | ||||
|   | ||||
| @@ -14,8 +14,6 @@ | ||||
| * | ||||
| * The module is built on top of the I/O abstraction defined in io.h and the | ||||
| * timeout management is done with the timeout.h interface. | ||||
| * | ||||
| * RCS ID: $Id$ | ||||
| \*=========================================================================*/ | ||||
| #include "lua.h" | ||||
|  | ||||
|   | ||||
| @@ -24,8 +24,6 @@ | ||||
| * | ||||
| * With these two function, it's easy to write functions that throw | ||||
| * exceptions on error, but that don't interrupt the user script.  | ||||
| * | ||||
| * RCS ID: $Id$ | ||||
| \*=========================================================================*/ | ||||
|  | ||||
| #include "lua.h" | ||||
|   | ||||
							
								
								
									
										10
									
								
								src/http.lua
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/http.lua
									
									
									
									
									
								
							| @@ -13,6 +13,7 @@ local url = require("socket.url") | ||||
| local ltn12 = require("ltn12") | ||||
| local mime = require("mime") | ||||
| local string = require("string") | ||||
| local headers = require("socket.headers") | ||||
| local base = _G | ||||
| local table = require("table") | ||||
| module("socket.http") | ||||
| @@ -123,10 +124,11 @@ function metat.__index:sendrequestline(method, uri) | ||||
|     return self.try(self.c:send(reqline)) | ||||
| end | ||||
|  | ||||
| function metat.__index:sendheaders(headers) | ||||
| function metat.__index:sendheaders(tosend) | ||||
|     local canonic = headers.canonic | ||||
|     local h = "\r\n" | ||||
|     for i, v in base.pairs(headers) do | ||||
|         h = i .. ": " .. v .. "\r\n" .. h | ||||
|     for f, v in base.pairs(tosend) do | ||||
|         h = (canonic[f] or f) .. ": " .. v .. "\r\n" .. h | ||||
|     end | ||||
|     self.try(self.c:send(h)) | ||||
|     return 1 | ||||
| @@ -254,7 +256,7 @@ local function shouldredirect(reqt, code, headers) | ||||
|     return headers.location and | ||||
|            string.gsub(headers.location, "%s", "") ~= "" and | ||||
|            (reqt.redirect ~= false) and | ||||
|            (code == 301 or code == 302) and | ||||
|            (code == 301 or code == 302 or code == 303 or code == 307) and | ||||
|            (not reqt.method or reqt.method == "GET" or reqt.method == "HEAD") | ||||
|            and (not reqt.nredirects or reqt.nredirects < 5) | ||||
| end | ||||
|   | ||||
| @@ -13,8 +13,6 @@ | ||||
| * getpeername and getsockname functions as seen by Lua programs. | ||||
| * | ||||
| * The Lua functions toip and tohostname are also implemented here. | ||||
| * | ||||
| * RCS ID: $Id$ | ||||
| \*=========================================================================*/ | ||||
| #include "lua.h" | ||||
| #include "socket.h" | ||||
|   | ||||
							
								
								
									
										2
									
								
								src/io.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								src/io.h
									
									
									
									
									
								
							| @@ -11,8 +11,6 @@ | ||||
| * | ||||
| * The module socket.h implements this interface, and thus the module tcp.h | ||||
| * is very simple. | ||||
| * | ||||
| * RCS ID: $Id$ | ||||
| \*=========================================================================*/ | ||||
| #include <stdio.h> | ||||
| #include "lua.h" | ||||
|   | ||||
| @@ -10,8 +10,6 @@ | ||||
| * involved in setting up both  client and server connections. The provided | ||||
| * IO routines, however, follow the Lua  style, being very similar  to the | ||||
| * standard Lua read and write functions. | ||||
| * | ||||
| * RCS ID: $Id$ | ||||
| \*=========================================================================*/ | ||||
|  | ||||
| /*=========================================================================*\ | ||||
|   | ||||
| @@ -5,16 +5,14 @@ | ||||
| * Networking support for the Lua language | ||||
| * Diego Nehab | ||||
| * 9/11/1999 | ||||
| * | ||||
| * RCS ID: $Id$ | ||||
| \*=========================================================================*/ | ||||
| #include "lua.h" | ||||
|  | ||||
| /*-------------------------------------------------------------------------*\ | ||||
| * Current socket library version | ||||
| \*-------------------------------------------------------------------------*/ | ||||
| #define LUASOCKET_VERSION    "LuaSocket 2.0.2" | ||||
| #define LUASOCKET_COPYRIGHT  "Copyright (C) 2004-2007 Diego Nehab" | ||||
| #define LUASOCKET_VERSION    "LuaSocket 2.0.3" | ||||
| #define LUASOCKET_COPYRIGHT  "Copyright (C) 1999-2009 Diego Nehab" | ||||
| #define LUASOCKET_AUTHORS    "Diego Nehab" | ||||
|  | ||||
| /*-------------------------------------------------------------------------*\ | ||||
|   | ||||
							
								
								
									
										154
									
								
								src/makefile
									
									
									
									
									
								
							
							
						
						
									
										154
									
								
								src/makefile
									
									
									
									
									
								
							| @@ -1,19 +1,68 @@ | ||||
| #------ | ||||
| # Load configuration | ||||
| # | ||||
| include ../config | ||||
| PLAT = none | ||||
| INSTALL_DATA=cp | ||||
| INSTALL_EXEC=cp | ||||
| INSTALL_TOP= /opt/local | ||||
| LUAINC= $(LUAINC_$(PLAT)) | ||||
|  | ||||
| #------ | ||||
| # Hopefully no need to change anything below this line | ||||
| # Install directories | ||||
| # | ||||
| INSTALL_TOP_SHARE=$(INSTALL_TOP)/share/lua/5.1 | ||||
| INSTALL_TOP_LIB=$(INSTALL_TOP)/lib/lua/5.1 | ||||
| INSTALL_SOCKET_SHARE=$(INSTALL_TOP_SHARE)/socket | ||||
| INSTALL_SOCKET_LIB=$(INSTALL_TOP_LIB)/socket | ||||
| INSTALL_MIME_SHARE=$(INSTALL_TOP_SHARE)/mime | ||||
| INSTALL_MIME_LIB=$(INSTALL_TOP_LIB)/mime | ||||
|  | ||||
| #------ | ||||
| # Output file names | ||||
| # | ||||
| EXT=so | ||||
| SOCKET_V=2.0.3 | ||||
| MIME_V=1.0.3 | ||||
| SOCKET_SO=socket.$(EXT).$(SOCKET_V) | ||||
| MIME_SO=mime.$(EXT).$(MIME_V) | ||||
| UNIX_SO=unix.$(EXT) | ||||
|  | ||||
| #------ | ||||
| # Compiler and linker settings | ||||
| # for Mac OS X | ||||
| LUAINC_macosx= -I/opt/local/include | ||||
| CC_macosx=gcc | ||||
| DEF_macosx= -DLUASOCKET_DEBUG -DUNIX_HAS_SUN_LEN \ | ||||
| 	-DLUASOCKET_API='__attribute__((visibility("default")))' \ | ||||
| 	-DMIME_API='__attribute__((visibility("default")))' | ||||
| CFLAGS_macosx= $(LUAINC) $(COMPAT) $(DEF) -pedantic -Wall -O2 -fno-common \ | ||||
| 	-fvisibility=hidden | ||||
| LDFLAGS_macosx= -bundle -undefined dynamic_lookup | ||||
| LD_macosx= export MACOSX_DEPLOYMENT_TARGET="10.3"; gcc | ||||
|  | ||||
| #------ | ||||
| # Compiler and linker settings | ||||
| # for Linux | ||||
| LUAINC_linux= -I/usr/local/include/lua5.1 | ||||
| CC_linux=gcc | ||||
| DEF_linux=-DLUASOCKET_DEBUG \ | ||||
| 	-DLUASOCKET_API='__attribute__((visibility("default")))' \ | ||||
| 	-DMIME_API='__attribute__((visibility("default")))' | ||||
| CFLAGS_linux= $(LUAINC) $(DEF) -pedantic -Wall -O2 -fpic \ | ||||
| 	-fvisibility=hidden | ||||
| LDFLAGS_linux=-O -shared -fpic | ||||
| LD_linux= gcc | ||||
|  | ||||
| #------ | ||||
| # Settings selected for platform | ||||
| # | ||||
| CC=$(CC_$(PLAT)) | ||||
| DEF=$(DEF_$(PLAT)) | ||||
| CFLAGS=$(CFLAGS_$(PLAT)) | ||||
| LDFLAGS=$(LDFLAGS_$(PLAT)) | ||||
| LD=$(LD_$(PLAT)) | ||||
|  | ||||
| #------ | ||||
| # Modules belonging to socket-core | ||||
| # | ||||
|  | ||||
| #$(COMPAT)/compat-5.1.o \ | ||||
|  | ||||
| SOCKET_OBJS:= \ | ||||
| SOCKET_OBJS= \ | ||||
| 	luasocket.o \ | ||||
| 	timeout.o \ | ||||
| 	buffer.o \ | ||||
| @@ -21,18 +70,16 @@ SOCKET_OBJS:= \ | ||||
|     auxiliar.o \ | ||||
| 	options.o \ | ||||
| 	inet.o \ | ||||
| 	tcp.o \ | ||||
| 	udp.o \ | ||||
| 	usocket.o \ | ||||
| 	except.o \ | ||||
| 	select.o \ | ||||
| 	usocket.o  | ||||
| 	tcp.o \ | ||||
| 	udp.o | ||||
|  | ||||
| #------ | ||||
| # Modules belonging mime-core | ||||
| # | ||||
| #$(COMPAT)/compat-5.1.o \ | ||||
|  | ||||
| MIME_OBJS:=\ | ||||
| MIME_OBJS= \ | ||||
| 	mime.o | ||||
|  | ||||
| #------ | ||||
| @@ -47,6 +94,34 @@ UNIX_OBJS:=\ | ||||
| 	usocket.o \ | ||||
| 	unix.o | ||||
|  | ||||
| #------ | ||||
| # Files to install | ||||
| # | ||||
| TO_SOCKET_SHARE:= \ | ||||
| 	http.lua \ | ||||
| 	url.lua \ | ||||
| 	tp.lua \ | ||||
| 	ftp.lua \ | ||||
| 	headers.lua \ | ||||
| 	smtp.lua | ||||
|  | ||||
| TO_TOP_SHARE:= \ | ||||
| 	ltn12.lua \ | ||||
| 	socket.lua \ | ||||
| 	mime.lua | ||||
|  | ||||
| default: $(PLAT) | ||||
|  | ||||
| macosx: | ||||
| 	$(MAKE) all PLAT=macosx | ||||
|  | ||||
| linux: | ||||
| 	$(MAKE) all PLAT=linux | ||||
|  | ||||
| none: | ||||
| 	@echo "Please choose a platform:" | ||||
| 	@echo "   $(PLATS)" | ||||
|  | ||||
| all: $(SOCKET_SO) $(MIME_SO) | ||||
|  | ||||
| $(SOCKET_SO): $(SOCKET_OBJS) | ||||
| @@ -58,6 +133,25 @@ $(MIME_SO): $(MIME_OBJS) | ||||
| $(UNIX_SO): $(UNIX_OBJS) | ||||
| 	$(LD) $(LDFLAGS) -o $@ $(UNIX_OBJS) | ||||
|  | ||||
| install:  | ||||
| 	mkdir -p $(INSTALL_TOP_SHARE) | ||||
| 	$(INSTALL_DATA) $(TO_TOP_SHARE) $(INSTALL_TOP_SHARE) | ||||
| 	mkdir -p $(INSTALL_SOCKET_SHARE) | ||||
| 	$(INSTALL_DATA) $(TO_SOCKET_SHARE) $(INSTALL_SOCKET_SHARE) | ||||
| 	mkdir -p $(INSTALL_SOCKET_LIB) | ||||
| 	$(INSTALL_EXEC) $(SOCKET_SO) $(INSTALL_SOCKET_LIB)/core.$(EXT) | ||||
| 	mkdir -p $(INSTALL_MIME_LIB) | ||||
| 	$(INSTALL_EXEC) $(MIME_SO) $(INSTALL_MIME_LIB)/core.$(EXT) | ||||
|  | ||||
| local: | ||||
| 	$(MAKE) install INSTALL_TOP_LIB=.. INSTALL_TOP_SHARE=.. | ||||
|  | ||||
| clean: | ||||
| 	rm -f $(SOCKET_SO) $(SOCKET_OBJS) | ||||
| 	rm -f $(MIME_SO) $(UNIX_SO) $(MIME_OBJS) $(UNIX_OBJS) | ||||
|  | ||||
| .PHONY: all $(PLATS) default clean echo none | ||||
|  | ||||
| #------ | ||||
| # List of dependencies | ||||
| # | ||||
| @@ -66,25 +160,19 @@ buffer.o: buffer.c buffer.h io.h timeout.h | ||||
| except.o: except.c except.h | ||||
| inet.o: inet.c inet.h socket.h io.h timeout.h usocket.h | ||||
| io.o: io.c io.h timeout.h | ||||
| luasocket.o: luasocket.c luasocket.h auxiliar.h except.h timeout.h \ | ||||
|   buffer.h io.h inet.h socket.h usocket.h tcp.h udp.h select.h | ||||
| luasocket.o: luasocket.c luasocket.h auxiliar.h except.h \ | ||||
| 	timeout.h buffer.h io.h inet.h socket.h usocket.h tcp.h \ | ||||
| 	udp.h select.h | ||||
| mime.o: mime.c mime.h | ||||
| options.o: options.c auxiliar.h options.h socket.h io.h timeout.h \ | ||||
|   usocket.h inet.h | ||||
| options.o: options.c auxiliar.h options.h socket.h io.h \ | ||||
| 	timeout.h usocket.h inet.h | ||||
| select.o: select.c socket.h io.h timeout.h usocket.h select.h | ||||
| tcp.o: tcp.c auxiliar.h socket.h io.h timeout.h usocket.h inet.h \ | ||||
|   options.h tcp.h buffer.h | ||||
| tcp.o: tcp.c auxiliar.h socket.h io.h timeout.h usocket.h \ | ||||
| 	inet.h options.h tcp.h buffer.h | ||||
| timeout.o: timeout.c auxiliar.h timeout.h | ||||
| udp.o: udp.c auxiliar.h socket.h io.h timeout.h usocket.h inet.h \ | ||||
|   options.h udp.h | ||||
| unix.o: unix.c auxiliar.h socket.h io.h timeout.h usocket.h options.h \ | ||||
|   unix.h buffer.h | ||||
| udp.o: udp.c auxiliar.h socket.h io.h timeout.h usocket.h \ | ||||
| 	inet.h options.h udp.h | ||||
| unix.o: unix.c auxiliar.h socket.h io.h timeout.h usocket.h \ | ||||
| 	options.h unix.h buffer.h | ||||
| usocket.o: usocket.c socket.h io.h timeout.h usocket.h | ||||
|  | ||||
| clean: | ||||
| 	rm -f $(SOCKET_SO) $(SOCKET_OBJS)  | ||||
| 	rm -f $(MIME_SO) $(UNIX_SO) $(MIME_OBJS) $(UNIX_OBJS) | ||||
|  | ||||
| #------ | ||||
| # End of makefile configuration | ||||
| # | ||||
| wsocket.o: wsocket.c socket.h io.h timeout.h usocket.h | ||||
|   | ||||
							
								
								
									
										10
									
								
								src/mime.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/mime.c
									
									
									
									
									
								
							| @@ -272,9 +272,12 @@ static int mime_global_b64(lua_State *L) | ||||
|     input = (UC *) luaL_optlstring(L, 2, NULL, &isize); | ||||
|     /* if second part is nil, we are done */ | ||||
|     if (!input) { | ||||
|         size_t osize = 0; | ||||
|         asize = b64pad(atom, asize, &buffer); | ||||
|         luaL_pushresult(&buffer); | ||||
|         if (!(*lua_tostring(L, -1))) lua_pushnil(L); | ||||
|         /* if the output is empty  and the input is nil, return nil */ | ||||
|         lua_tolstring(L, -1, &osize); | ||||
|         if (osize == 0) lua_pushnil(L); | ||||
|         lua_pushnil(L); | ||||
|         return 2; | ||||
|     } | ||||
| @@ -313,8 +316,11 @@ static int mime_global_unb64(lua_State *L) | ||||
|     input = (UC *) luaL_optlstring(L, 2, NULL, &isize); | ||||
|     /* if second is nil, we are done */ | ||||
|     if (!input) { | ||||
|         size_t osize = 0; | ||||
|         luaL_pushresult(&buffer); | ||||
|         if (!(*lua_tostring(L, -1))) lua_pushnil(L); | ||||
|         /* if the output is empty  and the input is nil, return nil */ | ||||
|         lua_tolstring(L, -1, &osize); | ||||
|         if (osize == 0) lua_pushnil(L); | ||||
|         lua_pushnil(L); | ||||
|         return 2; | ||||
|     } | ||||
|   | ||||
| @@ -7,16 +7,14 @@ | ||||
| * This module provides functions to implement transfer content encodings | ||||
| * and formatting conforming to RFC 2045. It is used by mime.lua, which | ||||
| * provide a higher level interface to this functionality.  | ||||
| * | ||||
| * RCS ID: $Id$ | ||||
| \*=========================================================================*/ | ||||
| #include "lua.h" | ||||
|  | ||||
| /*-------------------------------------------------------------------------*\ | ||||
| * Current MIME library version | ||||
| \*-------------------------------------------------------------------------*/ | ||||
| #define MIME_VERSION    "MIME 1.0.2" | ||||
| #define MIME_COPYRIGHT  "Copyright (C) 2004-2007 Diego Nehab" | ||||
| #define MIME_VERSION    "MIME 1.0.3" | ||||
| #define MIME_COPYRIGHT  "Copyright (C) 2004-2009 Diego Nehab" | ||||
| #define MIME_AUTHORS    "Diego Nehab" | ||||
|  | ||||
| /*-------------------------------------------------------------------------*\ | ||||
|   | ||||
| @@ -12,12 +12,12 @@ | ||||
| #include "options.h" | ||||
| #include "inet.h" | ||||
|  | ||||
|  | ||||
| /*=========================================================================*\ | ||||
| * Internal functions prototypes | ||||
| \*=========================================================================*/ | ||||
| static int opt_setmembership(lua_State *L, p_socket ps, int level, int name); | ||||
| static int opt_setboolean(lua_State *L, p_socket ps, int level, int name); | ||||
| static int opt_getboolean(lua_State *L, p_socket ps, int level, int name); | ||||
| static int opt_set(lua_State *L, p_socket ps, int level, int name,  | ||||
|         void *val, int len); | ||||
|  | ||||
| @@ -40,39 +40,63 @@ int opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps) | ||||
|     return opt->func(L, ps); | ||||
| } | ||||
|  | ||||
| int opt_meth_getoption(lua_State *L, p_opt opt, p_socket ps) | ||||
| { | ||||
|     const char *name = luaL_checkstring(L, 2);      /* obj, name, ... */ | ||||
|     while (opt->name && strcmp(name, opt->name)) | ||||
|         opt++; | ||||
|     if (!opt->func) { | ||||
|         char msg[45]; | ||||
|         sprintf(msg, "unsupported option `%.35s'", name); | ||||
|         luaL_argerror(L, 2, msg); | ||||
|     } | ||||
|     return opt->func(L, ps); | ||||
| } | ||||
|  | ||||
| /* enables reuse of local address */ | ||||
| int opt_reuseaddr(lua_State *L, p_socket ps) | ||||
| int opt_set_reuseaddr(lua_State *L, p_socket ps) | ||||
| { | ||||
|     return opt_setboolean(L, ps, SOL_SOCKET, SO_REUSEADDR);  | ||||
| } | ||||
|  | ||||
| /* enables reuse of local port */ | ||||
| int opt_set_reuseport(lua_State *L, p_socket ps) | ||||
| { | ||||
|     return opt_setboolean(L, ps, SOL_SOCKET, SO_REUSEPORT);  | ||||
| } | ||||
|  | ||||
| /* disables the Naggle algorithm */ | ||||
| int opt_tcp_nodelay(lua_State *L, p_socket ps) | ||||
| int opt_set_tcp_nodelay(lua_State *L, p_socket ps) | ||||
| { | ||||
|     return opt_setboolean(L, ps, IPPROTO_TCP, TCP_NODELAY);  | ||||
| } | ||||
|  | ||||
| int opt_keepalive(lua_State *L, p_socket ps) | ||||
| int opt_set_keepalive(lua_State *L, p_socket ps) | ||||
| { | ||||
|     return opt_setboolean(L, ps, SOL_SOCKET, SO_KEEPALIVE);  | ||||
| } | ||||
|  | ||||
| int opt_dontroute(lua_State *L, p_socket ps) | ||||
| int opt_set_dontroute(lua_State *L, p_socket ps) | ||||
| { | ||||
|     return opt_setboolean(L, ps, SOL_SOCKET, SO_DONTROUTE); | ||||
| } | ||||
|  | ||||
| int opt_broadcast(lua_State *L, p_socket ps) | ||||
| int opt_set_broadcast(lua_State *L, p_socket ps) | ||||
| { | ||||
|     return opt_setboolean(L, ps, SOL_SOCKET, SO_BROADCAST); | ||||
| } | ||||
|  | ||||
| int opt_ip_multicast_loop(lua_State *L, p_socket ps) | ||||
| int opt_set_ip_multicast_loop(lua_State *L, p_socket ps) | ||||
| { | ||||
|     return opt_setboolean(L, ps, IPPROTO_IP, IP_MULTICAST_LOOP); | ||||
| } | ||||
|  | ||||
| int opt_linger(lua_State *L, p_socket ps) | ||||
| int opt_get_ip_multicast_loop(lua_State *L, p_socket ps) | ||||
| { | ||||
|     return opt_getboolean(L, ps, IPPROTO_IP, IP_MULTICAST_LOOP); | ||||
| } | ||||
|  | ||||
| int opt_set_linger(lua_State *L, p_socket ps) | ||||
| { | ||||
|     struct linger li;                      /* obj, name, table */ | ||||
|     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) | ||||
|     return opt_set(L, ps, SOL_SOCKET, SO_LINGER, (char *) &li, sizeof(li)); | ||||
| } | ||||
|  | ||||
| int opt_ip_multicast_ttl(lua_State *L, p_socket ps) | ||||
| int opt_set_ip_multicast_ttl(lua_State *L, p_socket ps) | ||||
| { | ||||
|     int val = (int) luaL_checknumber(L, 3);    /* obj, name, int */ | ||||
|     return opt_set(L, ps, SOL_SOCKET, SO_LINGER, (char *) &val, sizeof(val)); | ||||
|     return opt_set(L, ps, IPPROTO_IP, IP_MULTICAST_TTL,  | ||||
|         (char *) &val, sizeof(val)); | ||||
| } | ||||
|  | ||||
| int opt_ip_add_membership(lua_State *L, p_socket ps) | ||||
| int opt_set_ip_multicast_if(lua_State *L, p_socket ps) | ||||
| { | ||||
|     const char *address = luaL_checkstring(L, 3);    /* obj, name, ip */ | ||||
|     struct in_addr val; | ||||
|     val.s_addr = htonl(INADDR_ANY); | ||||
|     if (strcmp(address, "*") && !inet_aton(address, &val)) | ||||
|         luaL_argerror(L, 3, "ip expected"); | ||||
|     return opt_set(L, ps, IPPROTO_IP, IP_MULTICAST_IF,  | ||||
|         (char *) &val, sizeof(val)); | ||||
| } | ||||
|  | ||||
| int opt_get_ip_multicast_if(lua_State *L, p_socket ps) | ||||
| { | ||||
|     struct in_addr val; | ||||
|     socklen_t len = sizeof(val); | ||||
|     if (getsockopt(*ps, IPPROTO_IP, IP_MULTICAST_IF, (char *) &val, &len) < 0) { | ||||
|         lua_pushnil(L); | ||||
|         lua_pushstring(L, "getsockopt failed"); | ||||
|         return 2; | ||||
|     } | ||||
|     lua_pushstring(L, inet_ntoa(val)); | ||||
|     return 1; | ||||
| } | ||||
|  | ||||
| int opt_set_ip_add_membership(lua_State *L, p_socket ps) | ||||
| { | ||||
|     return opt_setmembership(L, ps, IPPROTO_IP, IP_ADD_MEMBERSHIP); | ||||
| } | ||||
|  | ||||
| int opt_ip_drop_membersip(lua_State *L, p_socket ps) | ||||
| int opt_set_ip_drop_membersip(lua_State *L, p_socket ps) | ||||
| { | ||||
|     return opt_setmembership(L, ps, IPPROTO_IP, IP_DROP_MEMBERSHIP); | ||||
| } | ||||
| @@ -141,6 +190,19 @@ int opt_set(lua_State *L, p_socket ps, int level, int name, void *val, int len) | ||||
|     return 1; | ||||
| } | ||||
|  | ||||
| static int opt_getboolean(lua_State *L, p_socket ps, int level, int name) | ||||
| { | ||||
|     int val = 0; | ||||
|     socklen_t len = sizeof(val); | ||||
|     if (getsockopt(*ps, level, name, (char *) &val, &len) < 0) { | ||||
|         lua_pushnil(L); | ||||
|         lua_pushstring(L, "getsockopt failed"); | ||||
|         return 2; | ||||
|     } | ||||
|     lua_pushboolean(L, val); | ||||
|     return 1; | ||||
| } | ||||
|  | ||||
| static int opt_setboolean(lua_State *L, p_socket ps, int level, int name) | ||||
| { | ||||
|     int val = auxiliar_checkboolean(L, 3);             /* obj, name, bool */ | ||||
|   | ||||
| @@ -6,8 +6,6 @@ | ||||
| * | ||||
| * This module provides a common interface to socket options, used mainly by | ||||
| * modules UDP and TCP.  | ||||
| * | ||||
| * RCS ID: $Id$ | ||||
| \*=========================================================================*/ | ||||
|  | ||||
| #include "lua.h" | ||||
| @@ -20,20 +18,28 @@ typedef struct t_opt { | ||||
| } t_opt; | ||||
| typedef t_opt *p_opt; | ||||
|  | ||||
| /* supported options */ | ||||
| int opt_dontroute(lua_State *L, p_socket ps); | ||||
| int opt_broadcast(lua_State *L, p_socket ps); | ||||
| int opt_reuseaddr(lua_State *L, p_socket ps); | ||||
| int opt_tcp_nodelay(lua_State *L, p_socket ps); | ||||
| int opt_keepalive(lua_State *L, p_socket ps); | ||||
| int opt_linger(lua_State *L, p_socket ps); | ||||
| int opt_reuseaddr(lua_State *L, p_socket ps); | ||||
| int opt_ip_multicast_ttl(lua_State *L, p_socket ps); | ||||
| int opt_ip_multicast_loop(lua_State *L, p_socket ps); | ||||
| int opt_ip_add_membership(lua_State *L, p_socket ps); | ||||
| int opt_ip_drop_membersip(lua_State *L, p_socket ps); | ||||
|  | ||||
| /* supported options for setoption */ | ||||
| int opt_set_dontroute(lua_State *L, p_socket ps); | ||||
| int opt_set_broadcast(lua_State *L, p_socket ps); | ||||
| int opt_set_reuseaddr(lua_State *L, p_socket ps); | ||||
| int opt_set_tcp_nodelay(lua_State *L, p_socket ps); | ||||
| int opt_set_keepalive(lua_State *L, p_socket ps); | ||||
| int opt_set_linger(lua_State *L, p_socket ps); | ||||
| int opt_set_reuseaddr(lua_State *L, p_socket ps); | ||||
| int opt_set_reuseport(lua_State *L, p_socket ps); | ||||
| int opt_set_ip_multicast_if(lua_State *L, p_socket ps); | ||||
| int opt_set_ip_multicast_ttl(lua_State *L, p_socket ps); | ||||
| int opt_set_ip_multicast_loop(lua_State *L, p_socket ps); | ||||
| int opt_set_ip_add_membership(lua_State *L, p_socket ps); | ||||
| int opt_set_ip_drop_membersip(lua_State *L, p_socket ps); | ||||
| /* invokes the appropriate option handler */ | ||||
| int opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps); | ||||
|  | ||||
| /* supported options for getoption */ | ||||
| int opt_get_ip_multicast_loop(lua_State *L, p_socket ps); | ||||
| int opt_get_ip_multicast_if(lua_State *L, p_socket ps); | ||||
| /* invokes the appropriate option handler */ | ||||
| int opt_meth_getoption(lua_State *L, p_opt opt, p_socket ps); | ||||
|  | ||||
|  | ||||
| #endif | ||||
|   | ||||
							
								
								
									
										39
									
								
								src/select.c
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								src/select.c
									
									
									
									
									
								
							| @@ -18,8 +18,8 @@ | ||||
| \*=========================================================================*/ | ||||
| static t_socket getfd(lua_State *L); | ||||
| static int dirty(lua_State *L); | ||||
| static t_socket collect_fd(lua_State *L, int tab, t_socket max_fd,  | ||||
|         int itab, fd_set *set); | ||||
| static void collect_fd(lua_State *L, int tab, int itab,  | ||||
|         fd_set *set, t_socket *max_fd); | ||||
| static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set); | ||||
| static void return_fd(lua_State *L, fd_set *set, t_socket max_fd,  | ||||
|         int itab, int tab, int start); | ||||
| @@ -39,6 +39,9 @@ static luaL_reg func[] = { | ||||
| * Initializes module | ||||
| \*-------------------------------------------------------------------------*/ | ||||
| int select_open(lua_State *L) { | ||||
|     lua_pushstring(L, "_SETSIZE"); | ||||
|     lua_pushnumber(L, FD_SETSIZE); | ||||
|     lua_rawset(L, -3); | ||||
|     luaL_openlib(L, NULL, func, 0); | ||||
|     return 0; | ||||
| } | ||||
| @@ -51,7 +54,7 @@ int select_open(lua_State *L) { | ||||
| \*-------------------------------------------------------------------------*/ | ||||
| static int global_select(lua_State *L) { | ||||
|     int rtab, wtab, itab, ret, ndirty; | ||||
|     t_socket max_fd; | ||||
|     t_socket max_fd = SOCKET_INVALID; | ||||
|     fd_set rset, wset; | ||||
|     t_timeout tm; | ||||
|     double t = luaL_optnumber(L, 3, -1); | ||||
| @@ -60,12 +63,12 @@ static int global_select(lua_State *L) { | ||||
|     lua_newtable(L); itab = lua_gettop(L); | ||||
|     lua_newtable(L); rtab = lua_gettop(L); | ||||
|     lua_newtable(L); wtab = lua_gettop(L); | ||||
|     max_fd = collect_fd(L, 1, SOCKET_INVALID, itab, &rset); | ||||
|     collect_fd(L, 1, itab, &rset, &max_fd); | ||||
|     collect_fd(L, 2, itab, &wset, &max_fd); | ||||
|     ndirty = check_dirty(L, 1, rtab, &rset); | ||||
|     t = ndirty > 0? 0.0: t; | ||||
|     timeout_init(&tm, t, -1); | ||||
|     timeout_markstart(&tm); | ||||
|     max_fd = collect_fd(L, 2, max_fd, itab, &wset); | ||||
|     ret = socket_select(max_fd+1, &rset, &wset, NULL, &tm); | ||||
|     if (ret > 0 || ndirty > 0) { | ||||
|         return_fd(L, &rset, max_fd+1, itab, rtab, ndirty); | ||||
| @@ -77,7 +80,7 @@ static int global_select(lua_State *L) { | ||||
|         lua_pushstring(L, "timeout"); | ||||
|         return 3; | ||||
|     } else { | ||||
|         lua_pushstring(L, "error"); | ||||
|         luaL_error(L, "select failed"); | ||||
|         return 3; | ||||
|     } | ||||
| } | ||||
| @@ -112,11 +115,13 @@ static int dirty(lua_State *L) { | ||||
|     return is; | ||||
| } | ||||
|  | ||||
| static t_socket collect_fd(lua_State *L, int tab, t_socket max_fd,  | ||||
|         int itab, fd_set *set) { | ||||
|     int i = 1; | ||||
|     if (lua_isnil(L, tab))  | ||||
|         return max_fd; | ||||
| static void collect_fd(lua_State *L, int tab, int itab,  | ||||
|         fd_set *set, t_socket *max_fd) { | ||||
|     int i = 1, n = 0; | ||||
|     /* nil is the same as an empty table */ | ||||
|     if (lua_isnil(L, tab)) return; | ||||
|     /* otherwise we need it to be a table */ | ||||
|     luaL_checktype(L, tab, LUA_TTABLE); | ||||
|     while (1) { | ||||
|         t_socket fd; | ||||
|         lua_pushnumber(L, i); | ||||
| @@ -125,11 +130,18 @@ static t_socket collect_fd(lua_State *L, int tab, t_socket max_fd, | ||||
|             lua_pop(L, 1); | ||||
|             break; | ||||
|         } | ||||
|         /* getfd figures out if this is a socket */ | ||||
|         fd = getfd(L); | ||||
|         if (fd != SOCKET_INVALID) { | ||||
|             /* make sure we don't overflow the fd_set */ | ||||
|             if (n >= FD_SETSIZE)  | ||||
|                 luaL_argerror(L, tab, "too many sockets"); | ||||
|             FD_SET(fd, set); | ||||
|             if (max_fd == SOCKET_INVALID || max_fd < fd)  | ||||
|                 max_fd = fd; | ||||
|             n++; | ||||
|             /* keep track of the largest descriptor so far */ | ||||
|             if (*max_fd == SOCKET_INVALID || *max_fd < fd)  | ||||
|                 *max_fd = fd; | ||||
|             /* make sure we can map back from descriptor to the object */ | ||||
|             lua_pushnumber(L, fd); | ||||
|             lua_pushvalue(L, -2); | ||||
|             lua_settable(L, itab); | ||||
| @@ -137,7 +149,6 @@ static t_socket collect_fd(lua_State *L, int tab, t_socket max_fd, | ||||
|         lua_pop(L, 1); | ||||
|         i = i + 1; | ||||
|     } | ||||
|     return max_fd; | ||||
| } | ||||
|  | ||||
| static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set) { | ||||
|   | ||||
| @@ -8,8 +8,6 @@ | ||||
| * method getfd() which returns the descriptor to be passed to the | ||||
| * underlying select function. Another method, dirty(), should return  | ||||
| * true if there is data ready for reading (required for buffered input). | ||||
| * | ||||
| * RCS ID: $Id$ | ||||
| \*=========================================================================*/ | ||||
|  | ||||
| int select_open(lua_State *L); | ||||
|   | ||||
| @@ -16,6 +16,7 @@ local os = require("os") | ||||
| local socket = require("socket") | ||||
| local tp = require("socket.tp") | ||||
| local ltn12 = require("ltn12") | ||||
| local headers = require("socket.headers") | ||||
| local mime = require("mime") | ||||
| module("socket.smtp") | ||||
|  | ||||
| @@ -146,10 +147,11 @@ end | ||||
| local send_message | ||||
|  | ||||
| -- yield the headers all at once, it's faster | ||||
| local function send_headers(headers) | ||||
| local function send_headers(tosend) | ||||
|     local canonic = headers.canonic | ||||
|     local h = "\r\n" | ||||
|     for i,v in base.pairs(headers) do | ||||
|         h = i .. ': ' .. v .. "\r\n" .. h | ||||
|     for f,v in base.pairs(tosend) do | ||||
|         h = (canonic[f] or f) .. ': ' .. v .. "\r\n" .. h | ||||
|     end | ||||
|     coroutine.yield(h) | ||||
| end | ||||
|   | ||||
| @@ -8,8 +8,6 @@ | ||||
| * differences. Also, not all *nix platforms behave the same. This module | ||||
| * (and the associated usocket.h and wsocket.h) factor these differences and | ||||
| * creates a interface compatible with the io.h module. | ||||
| * | ||||
| * RCS ID: $Id$ | ||||
| \*=========================================================================*/ | ||||
| #include "io.h" | ||||
|  | ||||
|   | ||||
							
								
								
									
										12
									
								
								src/tcp.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								src/tcp.c
									
									
									
									
									
								
							| @@ -64,11 +64,11 @@ static luaL_reg tcp[] = { | ||||
| }; | ||||
|  | ||||
| /* socket option handlers */ | ||||
| static t_opt opt[] = { | ||||
|     {"keepalive",   opt_keepalive}, | ||||
|     {"reuseaddr",   opt_reuseaddr}, | ||||
|     {"tcp-nodelay", opt_tcp_nodelay}, | ||||
|     {"linger",      opt_linger}, | ||||
| static t_opt optset[] = { | ||||
|     {"keepalive",   opt_set_keepalive}, | ||||
|     {"reuseaddr",   opt_set_reuseaddr}, | ||||
|     {"tcp-nodelay", opt_set_tcp_nodelay}, | ||||
|     {"linger",      opt_set_linger}, | ||||
|     {NULL,          NULL} | ||||
| }; | ||||
|  | ||||
| @@ -128,7 +128,7 @@ static int meth_setstats(lua_State *L) { | ||||
| static int meth_setoption(lua_State *L) | ||||
| { | ||||
|     p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, "tcp{any}", 1); | ||||
|     return opt_meth_setoption(L, opt, &tcp->sock); | ||||
|     return opt_meth_setoption(L, optset, &tcp->sock); | ||||
| } | ||||
|  | ||||
| /*-------------------------------------------------------------------------*\ | ||||
|   | ||||
| @@ -13,8 +13,6 @@ | ||||
| * objects are tcp objects bound to some local address. Client objects are | ||||
| * tcp objects either connected to some address or returned by the accept | ||||
| * method of a server object. | ||||
| * | ||||
| * RCS ID: $Id$ | ||||
| \*=========================================================================*/ | ||||
| #include "lua.h" | ||||
|  | ||||
|   | ||||
| @@ -5,6 +5,8 @@ | ||||
| * RCS ID: $Id$ | ||||
| \*=========================================================================*/ | ||||
| #include <stdio.h> | ||||
| #include <limits.h> | ||||
| #include <float.h> | ||||
|  | ||||
| #include "lua.h" | ||||
| #include "lauxlib.h" | ||||
| @@ -187,13 +189,23 @@ static int timeout_lua_gettime(lua_State *L) | ||||
| /*-------------------------------------------------------------------------*\ | ||||
| * Sleep for n seconds. | ||||
| \*-------------------------------------------------------------------------*/ | ||||
| #ifdef _WIN32 | ||||
| int timeout_lua_sleep(lua_State *L) | ||||
| { | ||||
|     double n = luaL_checknumber(L, 1); | ||||
| #ifdef _WIN32 | ||||
|     Sleep((int)(n*1000)); | ||||
|     if (n < 0.0) n = 0.0; | ||||
|     if (n < DBL_MAX/1000.0) n *= 1000.0; | ||||
|     if (n > INT_MAX) n = INT_MAX; | ||||
|     Sleep((int)n); | ||||
|     return 0; | ||||
| } | ||||
| #else | ||||
| int timeout_lua_sleep(lua_State *L) | ||||
| { | ||||
|     double n = luaL_checknumber(L, 1); | ||||
|     struct timespec t, r; | ||||
|     if (n < 0.0) n = 0.0; | ||||
|     if (n > INT_MAX) n = INT_MAX; | ||||
|     t.tv_sec = (int) n; | ||||
|     n -= t.tv_sec; | ||||
|     t.tv_nsec = (int) (n * 1000000000); | ||||
| @@ -202,6 +214,6 @@ int timeout_lua_sleep(lua_State *L) | ||||
|         t.tv_sec = r.tv_sec; | ||||
|         t.tv_nsec = r.tv_nsec; | ||||
|     } | ||||
| #endif | ||||
|     return 0; | ||||
| } | ||||
| #endif | ||||
|   | ||||
| @@ -3,8 +3,6 @@ | ||||
| /*=========================================================================*\ | ||||
| * Timeout management functions | ||||
| * LuaSocket toolkit | ||||
| * | ||||
| * RCS ID: $Id$ | ||||
| \*=========================================================================*/ | ||||
| #include "lua.h" | ||||
|  | ||||
|   | ||||
| @@ -64,6 +64,7 @@ function metat.__index:check(ok) | ||||
| end | ||||
|  | ||||
| function metat.__index:command(cmd, arg) | ||||
|     cmd = string.upper(cmd) | ||||
|     if arg then | ||||
|         return self.c:send(cmd .. " " .. arg.. "\r\n") | ||||
|     else | ||||
|   | ||||
							
								
								
									
										39
									
								
								src/udp.c
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								src/udp.c
									
									
									
									
									
								
							| @@ -37,6 +37,7 @@ static int meth_setsockname(lua_State *L); | ||||
| static int meth_setpeername(lua_State *L); | ||||
| static int meth_close(lua_State *L); | ||||
| static int meth_setoption(lua_State *L); | ||||
| static int meth_getoption(lua_State *L); | ||||
| static int meth_settimeout(lua_State *L); | ||||
| static int meth_getfd(lua_State *L); | ||||
| static int meth_setfd(lua_State *L); | ||||
| @@ -57,21 +58,31 @@ static luaL_reg udp[] = { | ||||
|     {"sendto",      meth_sendto}, | ||||
|     {"setfd",       meth_setfd}, | ||||
|     {"setoption",   meth_setoption}, | ||||
|     {"getoption",   meth_getoption}, | ||||
|     {"setpeername", meth_setpeername}, | ||||
|     {"setsockname", meth_setsockname}, | ||||
|     {"settimeout",  meth_settimeout}, | ||||
|     {NULL,          NULL} | ||||
| }; | ||||
|  | ||||
| /* socket options */ | ||||
| static t_opt opt[] = { | ||||
|     {"dontroute",          opt_dontroute}, | ||||
|     {"broadcast",          opt_broadcast}, | ||||
|     {"reuseaddr",          opt_reuseaddr}, | ||||
|     {"ip-multicast-ttl",   opt_ip_multicast_ttl}, | ||||
|     {"ip-multicast-loop",  opt_ip_multicast_loop}, | ||||
|     {"ip-add-membership",  opt_ip_add_membership}, | ||||
|     {"ip-drop-membership", opt_ip_drop_membersip}, | ||||
| /* socket options for setoption */ | ||||
| static t_opt optset[] = { | ||||
|     {"dontroute",          opt_set_dontroute}, | ||||
|     {"broadcast",          opt_set_broadcast}, | ||||
|     {"reuseaddr",          opt_set_reuseaddr}, | ||||
|     {"reuseport",          opt_set_reuseport}, | ||||
|     {"ip-multicast-if",    opt_set_ip_multicast_if}, | ||||
|     {"ip-multicast-ttl",   opt_set_ip_multicast_ttl}, | ||||
|     {"ip-multicast-loop",  opt_set_ip_multicast_loop}, | ||||
|     {"ip-add-membership",  opt_set_ip_add_membership}, | ||||
|     {"ip-drop-membership", opt_set_ip_drop_membersip}, | ||||
|     {NULL,                 NULL} | ||||
| }; | ||||
|  | ||||
| /* socket options for getoption */ | ||||
| static t_opt optget[] = { | ||||
|     {"ip-multicast-if",    opt_get_ip_multicast_if}, | ||||
|     {"ip-multicast-loop",  opt_get_ip_multicast_loop}, | ||||
|     {NULL,                 NULL} | ||||
| }; | ||||
|  | ||||
| @@ -247,7 +258,15 @@ static int meth_getsockname(lua_State *L) { | ||||
| \*-------------------------------------------------------------------------*/ | ||||
| static int meth_setoption(lua_State *L) { | ||||
|     p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1); | ||||
|     return opt_meth_setoption(L, opt, &udp->sock); | ||||
|     return opt_meth_setoption(L, optset, &udp->sock); | ||||
| } | ||||
|  | ||||
| /*-------------------------------------------------------------------------*\ | ||||
| * Just call option handler | ||||
| \*-------------------------------------------------------------------------*/ | ||||
| static int meth_getoption(lua_State *L) { | ||||
|     p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1); | ||||
|     return opt_meth_getoption(L, optget, &udp->sock); | ||||
| } | ||||
|  | ||||
| /*-------------------------------------------------------------------------*\ | ||||
|   | ||||
| @@ -11,8 +11,6 @@ | ||||
| * originally unconnected. They can be "connected" to a given address  | ||||
| * with a call to the setpeername function. The same function can be used to | ||||
| * break the connection. | ||||
| * | ||||
| * RCS ID: $Id$ | ||||
| \*=========================================================================*/ | ||||
| #include "lua.h" | ||||
|  | ||||
|   | ||||
							
								
								
									
										10
									
								
								src/unix.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/unix.c
									
									
									
									
									
								
							| @@ -63,10 +63,10 @@ static luaL_reg un[] = { | ||||
| }; | ||||
|  | ||||
| /* socket option handlers */ | ||||
| static t_opt opt[] = { | ||||
|     {"keepalive",   opt_keepalive}, | ||||
|     {"reuseaddr",   opt_reuseaddr}, | ||||
|     {"linger",      opt_linger}, | ||||
| static t_opt optset[] = { | ||||
|     {"keepalive",   opt_set_keepalive}, | ||||
|     {"reuseaddr",   opt_set_reuseaddr}, | ||||
|     {"linger",      opt_set_linger}, | ||||
|     {NULL,          NULL} | ||||
| }; | ||||
|  | ||||
| @@ -128,7 +128,7 @@ static int meth_setstats(lua_State *L) { | ||||
| \*-------------------------------------------------------------------------*/ | ||||
| static int meth_setoption(lua_State *L) { | ||||
|     p_unix un = (p_unix) auxiliar_checkgroup(L, "unix{any}", 1); | ||||
|     return opt_meth_setoption(L, opt, &un->sock); | ||||
|     return opt_meth_setoption(L, optset, &un->sock); | ||||
| } | ||||
|  | ||||
| /*-------------------------------------------------------------------------*\ | ||||
|   | ||||
| @@ -6,8 +6,6 @@ | ||||
| * | ||||
| * This module is just an example of how to extend LuaSocket with a new  | ||||
| * domain. | ||||
| * | ||||
| * RCS ID: $Id$ | ||||
| \*=========================================================================*/ | ||||
| #include "lua.h" | ||||
|  | ||||
| @@ -23,6 +21,6 @@ typedef struct t_unix_ { | ||||
| } t_unix; | ||||
| typedef t_unix *p_unix; | ||||
|  | ||||
| int luaopen_socketunix(lua_State *L); | ||||
| int luaopen_socket_unix(lua_State *L); | ||||
|  | ||||
| #endif /* UNIX_H */ | ||||
|   | ||||
| @@ -3,8 +3,6 @@ | ||||
| /*=========================================================================*\ | ||||
| * Socket compatibilization module for Unix | ||||
| * LuaSocket toolkit | ||||
| * | ||||
| * RCS ID: $Id$ | ||||
| \*=========================================================================*/ | ||||
|  | ||||
| /*=========================================================================*\ | ||||
| @@ -32,6 +30,10 @@ | ||||
| /* TCP options (nagle algorithm disable) */ | ||||
| #include <netinet/tcp.h> | ||||
|  | ||||
| #ifndef SO_REUSEPORT | ||||
| #define SO_REUSEPORT SO_REUSEADDR | ||||
| #endif | ||||
|  | ||||
| typedef int t_socket; | ||||
| typedef t_socket *p_socket; | ||||
|  | ||||
|   | ||||
| @@ -3,14 +3,13 @@ | ||||
| /*=========================================================================*\ | ||||
| * Socket compatibilization module for Win32 | ||||
| * LuaSocket toolkit | ||||
| * | ||||
| * RCS ID: $Id$ | ||||
| \*=========================================================================*/ | ||||
|  | ||||
| /*=========================================================================*\ | ||||
| * WinSock include files | ||||
| \*=========================================================================*/ | ||||
| #include <winsock.h> | ||||
| #include <winsock2.h> | ||||
| #include <ws2tcpip.h> | ||||
|  | ||||
| typedef int socklen_t; | ||||
| typedef SOCKET t_socket; | ||||
| @@ -18,4 +17,8 @@ typedef t_socket *p_socket; | ||||
|  | ||||
| #define SOCKET_INVALID (INVALID_SOCKET) | ||||
|  | ||||
| #ifndef SO_REUSEPORT | ||||
| #define SO_REUSEPORT SO_REUSEADDR | ||||
| #endif | ||||
|  | ||||
| #endif /* WSOCKET_H */ | ||||
|   | ||||
| @@ -8,5 +8,7 @@ The files provided are: | ||||
|  | ||||
| To run these tests, just run lua on the server and then on the client.  | ||||
|  | ||||
|     hello.lua               -- run to verify if installation worked | ||||
|  | ||||
| Good luck, | ||||
| Diego. | ||||
|   | ||||
							
								
								
									
										3
									
								
								test/hello.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								test/hello.lua
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| require"socket" | ||||
| require"mime" | ||||
| print("Hello from " .. socket._VERSION .. " and " .. mime._VERSION .. "!") | ||||
| @@ -420,17 +420,17 @@ print("ok") | ||||
| io.write("testing HEAD method: ") | ||||
| local r, c, h = http.request { | ||||
|   method = "HEAD", | ||||
|   url = "http://www.cs.princeton.edu/~diego/" | ||||
|   url = "http://www.tecgraf.puc-rio.br/~diego/" | ||||
| } | ||||
| assert(r and h and (c == 200), c) | ||||
| print("ok") | ||||
|  | ||||
| ------------------------------------------------------------------------ | ||||
| io.write("testing host not found: ") | ||||
| local c, e = socket.connect("wronghost", 80) | ||||
| local r, re = http.request{url = "http://wronghost/does/not/exist"} | ||||
| assert(r == nil and e == re)  | ||||
| r, re = http.request("http://wronghost/does/not/exist") | ||||
| local c, e = socket.connect("example.invalid", 80) | ||||
| local r, re = http.request{url = "http://example.invalid/does/not/exist"} | ||||
| assert(r == nil and e == re, tostring(r) .. " " .. tostring(re))  | ||||
| r, re = http.request("http://example.invalid/does/not/exist") | ||||
| assert(r == nil and e == re)  | ||||
| print("ok") | ||||
|  | ||||
|   | ||||
| @@ -251,6 +251,28 @@ io.write("testing b64 padding: ") | ||||
|     print("ok") | ||||
| end | ||||
|  | ||||
| local function test_b64lowlevel() | ||||
| io.write("testing b64 low-level: ") | ||||
|     local a, b | ||||
|     a, b = mime.b64("", "") | ||||
|     assert(a == "" and b == "") | ||||
|     a, b = mime.b64(nil, "blablabla") | ||||
|     assert(a == nil and b == nil) | ||||
|     a, b = mime.b64("", nil) | ||||
|     assert(a == nil and b == nil) | ||||
|     a, b = mime.unb64("", "") | ||||
|     assert(a == "" and b == "") | ||||
|     a, b = mime.unb64(nil, "blablabla") | ||||
|     assert(a == nil and b == nil) | ||||
|     a, b = mime.unb64("", nil) | ||||
|     assert(a == nil and b == nil) | ||||
|     local binary=string.char(0x00,0x44,0x1D,0x14,0x0F,0xF4,0xDA,0x11,0xA9,0x78,0x00,0x14,0x38,0x50,0x60,0xCE) | ||||
|     local encoded = mime.b64(binary) | ||||
|     local decoded=mime.unb64(encoded) | ||||
|     assert(binary == decoded) | ||||
|     print("ok") | ||||
| end | ||||
|  | ||||
| local t = socket.gettime() | ||||
|  | ||||
| create_b64test() | ||||
| @@ -260,6 +282,7 @@ decode_b64test() | ||||
| compare_b64test() | ||||
| cleanup_b64test() | ||||
| padding_b64test() | ||||
| test_b64lowlevel() | ||||
|  | ||||
| create_qptest() | ||||
| encode_qptest() | ||||
| @@ -270,4 +293,5 @@ decode_qptest() | ||||
| compare_qptest() | ||||
| cleanup_qptest() | ||||
|  | ||||
|  | ||||
| print(string.format("done in %.2fs", socket.gettime() - t)) | ||||
|   | ||||
| @@ -342,6 +342,7 @@ end | ||||
| ------------------------------------------------------------------------ | ||||
| function test_selectbugs() | ||||
|     local r, s, e = socket.select(nil, nil, 0.1) | ||||
| print(r, s, e) | ||||
|     assert(type(r) == "table" and type(s) == "table" and  | ||||
|         (e == "timeout" or e == "error")) | ||||
|     pass("both nil: ok") | ||||
| @@ -352,10 +353,23 @@ function test_selectbugs() | ||||
|         (e == "timeout" or e == "error")) | ||||
|     pass("closed sockets: ok") | ||||
|     e = pcall(socket.select, "wrong", 1, 0.1) | ||||
|     assert(e == false) | ||||
|     assert(e == false, tostring(e)) | ||||
|     e = pcall(socket.select, {}, 1, 0.1) | ||||
|     assert(e == false) | ||||
|     assert(e == false, tostring(e)) | ||||
|     pass("invalid input: ok") | ||||
|     local toomany = {} | ||||
|     for i = 1, socket._SETSIZE+1 do | ||||
|         toomany[#toomany+1] = socket.udp() | ||||
|     end | ||||
|     if #toomany > socket._SETSIZE then | ||||
|         local e = pcall(socket.select, toomany, nil, 0.1) | ||||
|         assert(e == false, tostring(e)) | ||||
|         pass("too many sockets (" .. #toomany .. "): ok") | ||||
|     else | ||||
|         pass("unable to create enough sockets (max was "..#toomany..")") | ||||
|         pass("try using ulimit") | ||||
|     end | ||||
|     for _, c in ipairs(toomany) do c:close() end | ||||
| end | ||||
|  | ||||
| ------------------------------------------------------------------------ | ||||
| @@ -555,6 +569,25 @@ function test_readafterclose() | ||||
|     print("ok") | ||||
| end | ||||
|  | ||||
| ------------------------------------------------------------------------ | ||||
| function test_writeafterclose() | ||||
|     local str = 'little string' | ||||
|     reconnect() | ||||
|     remote (string.format ([[ | ||||
|         data:close() | ||||
|         data = nil | ||||
|     ]])) | ||||
|     local sent, err, errsent | ||||
|     while not err do  | ||||
|         sent, err, errsent, time = data:send(str) | ||||
|     end | ||||
|     print(sent, err, errsent, time) | ||||
|     print("ok") | ||||
| end | ||||
|  | ||||
| ------------------------------------------------------------------------ | ||||
| --test_writeafterclose() | ||||
|  | ||||
| test("method registration") | ||||
| test_methods(socket.tcp(), { | ||||
|     "accept", | ||||
| @@ -596,12 +629,12 @@ test_methods(socket.udp(), { | ||||
|     "settimeout" | ||||
| }) | ||||
|  | ||||
| test("testing read after close") | ||||
| test_readafterclose() | ||||
|  | ||||
| test("select function") | ||||
| test_selectbugs() | ||||
|  | ||||
| test("testing read after close") | ||||
| test_readafterclose() | ||||
|  | ||||
| test("connect function") | ||||
| connect_timeout() | ||||
| empty_connect() | ||||
|   | ||||
| @@ -32,6 +32,8 @@ r, e = smtp.send{ | ||||
|     port = 2525 | ||||
| } | ||||
|  | ||||
| print(r, e) | ||||
|  | ||||
| -- creates a source to send a message with two parts. The first part is  | ||||
| -- plain text, the second part is a PNG image, encoded as base64. | ||||
| source = smtp.message{ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user