diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/auxiliar.h | 2 | ||||
| -rw-r--r-- | src/buffer.c | 2 | ||||
| -rw-r--r-- | src/buffer.h | 2 | ||||
| -rw-r--r-- | src/except.h | 2 | ||||
| -rw-r--r-- | src/http.lua | 10 | ||||
| -rw-r--r-- | src/inet.h | 2 | ||||
| -rw-r--r-- | src/io.h | 2 | ||||
| -rw-r--r-- | src/luasocket.c | 2 | ||||
| -rw-r--r-- | src/luasocket.h | 6 | ||||
| -rw-r--r-- | src/makefile | 156 | ||||
| -rw-r--r-- | src/mime.c | 10 | ||||
| -rw-r--r-- | src/mime.h | 6 | ||||
| -rw-r--r-- | src/options.c | 86 | ||||
| -rw-r--r-- | src/options.h | 36 | ||||
| -rw-r--r-- | src/select.c | 39 | ||||
| -rw-r--r-- | src/select.h | 2 | ||||
| -rw-r--r-- | src/smtp.lua | 8 | ||||
| -rw-r--r-- | src/socket.h | 2 | ||||
| -rw-r--r-- | src/tcp.c | 12 | ||||
| -rw-r--r-- | src/tcp.h | 2 | ||||
| -rw-r--r-- | src/timeout.c | 18 | ||||
| -rw-r--r-- | src/timeout.h | 2 | ||||
| -rw-r--r-- | src/tp.lua | 1 | ||||
| -rw-r--r-- | src/udp.c | 41 | ||||
| -rw-r--r-- | src/udp.h | 2 | ||||
| -rw-r--r-- | src/unix.c | 10 | ||||
| -rw-r--r-- | src/unix.h | 4 | ||||
| -rw-r--r-- | src/usocket.h | 6 | ||||
| -rw-r--r-- | src/wsocket.h | 9 |
29 files changed, 334 insertions, 148 deletions
diff --git a/src/auxiliar.h b/src/auxiliar.h index 8a18bcf..57a2ecc 100644 --- a/src/auxiliar.h +++ b/src/auxiliar.h | |||
| @@ -27,8 +27,6 @@ | |||
| 27 | * | 27 | * |
| 28 | * The mapping from class name to the corresponding metatable and the | 28 | * The mapping from class name to the corresponding metatable and the |
| 29 | * reverse mapping are done using lauxlib. | 29 | * reverse mapping are done using lauxlib. |
| 30 | * | ||
| 31 | * RCS ID: $Id$ | ||
| 32 | \*=========================================================================*/ | 30 | \*=========================================================================*/ |
| 33 | 31 | ||
| 34 | #include "lua.h" | 32 | #include "lua.h" |
diff --git a/src/buffer.c b/src/buffer.c index de817b2..363da3d 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -166,7 +166,7 @@ static int sendraw(p_buffer buf, const char *data, size_t count, size_t *sent) { | |||
| 166 | size_t total = 0; | 166 | size_t total = 0; |
| 167 | int err = IO_DONE; | 167 | int err = IO_DONE; |
| 168 | while (total < count && err == IO_DONE) { | 168 | while (total < count && err == IO_DONE) { |
| 169 | size_t done; | 169 | size_t done = 0; |
| 170 | size_t step = (count-total <= STEPSIZE)? count-total: STEPSIZE; | 170 | size_t step = (count-total <= STEPSIZE)? count-total: STEPSIZE; |
| 171 | err = io->send(io->ctx, data+total, step, &done, tm); | 171 | err = io->send(io->ctx, data+total, step, &done, tm); |
| 172 | total += done; | 172 | total += done; |
diff --git a/src/buffer.h b/src/buffer.h index 0a4a335..58838d1 100644 --- a/src/buffer.h +++ b/src/buffer.h | |||
| @@ -14,8 +14,6 @@ | |||
| 14 | * | 14 | * |
| 15 | * The module is built on top of the I/O abstraction defined in io.h and the | 15 | * The module is built on top of the I/O abstraction defined in io.h and the |
| 16 | * timeout management is done with the timeout.h interface. | 16 | * timeout management is done with the timeout.h interface. |
| 17 | * | ||
| 18 | * RCS ID: $Id$ | ||
| 19 | \*=========================================================================*/ | 17 | \*=========================================================================*/ |
| 20 | #include "lua.h" | 18 | #include "lua.h" |
| 21 | 19 | ||
diff --git a/src/except.h b/src/except.h index 03e417d..1e7a245 100644 --- a/src/except.h +++ b/src/except.h | |||
| @@ -24,8 +24,6 @@ | |||
| 24 | * | 24 | * |
| 25 | * With these two function, it's easy to write functions that throw | 25 | * With these two function, it's easy to write functions that throw |
| 26 | * exceptions on error, but that don't interrupt the user script. | 26 | * exceptions on error, but that don't interrupt the user script. |
| 27 | * | ||
| 28 | * RCS ID: $Id$ | ||
| 29 | \*=========================================================================*/ | 27 | \*=========================================================================*/ |
| 30 | 28 | ||
| 31 | #include "lua.h" | 29 | #include "lua.h" |
diff --git a/src/http.lua b/src/http.lua index 3a386a6..4c27149 100644 --- a/src/http.lua +++ b/src/http.lua | |||
| @@ -13,6 +13,7 @@ local url = require("socket.url") | |||
| 13 | local ltn12 = require("ltn12") | 13 | local ltn12 = require("ltn12") |
| 14 | local mime = require("mime") | 14 | local mime = require("mime") |
| 15 | local string = require("string") | 15 | local string = require("string") |
| 16 | local headers = require("socket.headers") | ||
| 16 | local base = _G | 17 | local base = _G |
| 17 | local table = require("table") | 18 | local table = require("table") |
| 18 | module("socket.http") | 19 | module("socket.http") |
| @@ -123,10 +124,11 @@ function metat.__index:sendrequestline(method, uri) | |||
| 123 | return self.try(self.c:send(reqline)) | 124 | return self.try(self.c:send(reqline)) |
| 124 | end | 125 | end |
| 125 | 126 | ||
| 126 | function metat.__index:sendheaders(headers) | 127 | function metat.__index:sendheaders(tosend) |
| 128 | local canonic = headers.canonic | ||
| 127 | local h = "\r\n" | 129 | local h = "\r\n" |
| 128 | for i, v in base.pairs(headers) do | 130 | for f, v in base.pairs(tosend) do |
| 129 | h = i .. ": " .. v .. "\r\n" .. h | 131 | h = (canonic[f] or f) .. ": " .. v .. "\r\n" .. h |
| 130 | end | 132 | end |
| 131 | self.try(self.c:send(h)) | 133 | self.try(self.c:send(h)) |
| 132 | return 1 | 134 | return 1 |
| @@ -254,7 +256,7 @@ local function shouldredirect(reqt, code, headers) | |||
| 254 | return headers.location and | 256 | return headers.location and |
| 255 | string.gsub(headers.location, "%s", "") ~= "" and | 257 | string.gsub(headers.location, "%s", "") ~= "" and |
| 256 | (reqt.redirect ~= false) and | 258 | (reqt.redirect ~= false) and |
| 257 | (code == 301 or code == 302) and | 259 | (code == 301 or code == 302 or code == 303 or code == 307) and |
| 258 | (not reqt.method or reqt.method == "GET" or reqt.method == "HEAD") | 260 | (not reqt.method or reqt.method == "GET" or reqt.method == "HEAD") |
| 259 | and (not reqt.nredirects or reqt.nredirects < 5) | 261 | and (not reqt.nredirects or reqt.nredirects < 5) |
| 260 | end | 262 | end |
| @@ -13,8 +13,6 @@ | |||
| 13 | * getpeername and getsockname functions as seen by Lua programs. | 13 | * getpeername and getsockname functions as seen by Lua programs. |
| 14 | * | 14 | * |
| 15 | * The Lua functions toip and tohostname are also implemented here. | 15 | * The Lua functions toip and tohostname are also implemented here. |
| 16 | * | ||
| 17 | * RCS ID: $Id$ | ||
| 18 | \*=========================================================================*/ | 16 | \*=========================================================================*/ |
| 19 | #include "lua.h" | 17 | #include "lua.h" |
| 20 | #include "socket.h" | 18 | #include "socket.h" |
| @@ -11,8 +11,6 @@ | |||
| 11 | * | 11 | * |
| 12 | * The module socket.h implements this interface, and thus the module tcp.h | 12 | * The module socket.h implements this interface, and thus the module tcp.h |
| 13 | * is very simple. | 13 | * is very simple. |
| 14 | * | ||
| 15 | * RCS ID: $Id$ | ||
| 16 | \*=========================================================================*/ | 14 | \*=========================================================================*/ |
| 17 | #include <stdio.h> | 15 | #include <stdio.h> |
| 18 | #include "lua.h" | 16 | #include "lua.h" |
diff --git a/src/luasocket.c b/src/luasocket.c index 142aa95..3b29e8e 100644 --- a/src/luasocket.c +++ b/src/luasocket.c | |||
| @@ -10,8 +10,6 @@ | |||
| 10 | * involved in setting up both client and server connections. The provided | 10 | * involved in setting up both client and server connections. The provided |
| 11 | * IO routines, however, follow the Lua style, being very similar to the | 11 | * IO routines, however, follow the Lua style, being very similar to the |
| 12 | * standard Lua read and write functions. | 12 | * standard Lua read and write functions. |
| 13 | * | ||
| 14 | * RCS ID: $Id$ | ||
| 15 | \*=========================================================================*/ | 13 | \*=========================================================================*/ |
| 16 | 14 | ||
| 17 | /*=========================================================================*\ | 15 | /*=========================================================================*\ |
diff --git a/src/luasocket.h b/src/luasocket.h index 13134cf..d7a78bb 100644 --- a/src/luasocket.h +++ b/src/luasocket.h | |||
| @@ -5,16 +5,14 @@ | |||
| 5 | * Networking support for the Lua language | 5 | * Networking support for the Lua language |
| 6 | * Diego Nehab | 6 | * Diego Nehab |
| 7 | * 9/11/1999 | 7 | * 9/11/1999 |
| 8 | * | ||
| 9 | * RCS ID: $Id$ | ||
| 10 | \*=========================================================================*/ | 8 | \*=========================================================================*/ |
| 11 | #include "lua.h" | 9 | #include "lua.h" |
| 12 | 10 | ||
| 13 | /*-------------------------------------------------------------------------*\ | 11 | /*-------------------------------------------------------------------------*\ |
| 14 | * Current socket library version | 12 | * Current socket library version |
| 15 | \*-------------------------------------------------------------------------*/ | 13 | \*-------------------------------------------------------------------------*/ |
| 16 | #define LUASOCKET_VERSION "LuaSocket 2.0.2" | 14 | #define LUASOCKET_VERSION "LuaSocket 2.0.3" |
| 17 | #define LUASOCKET_COPYRIGHT "Copyright (C) 2004-2007 Diego Nehab" | 15 | #define LUASOCKET_COPYRIGHT "Copyright (C) 1999-2009 Diego Nehab" |
| 18 | #define LUASOCKET_AUTHORS "Diego Nehab" | 16 | #define LUASOCKET_AUTHORS "Diego Nehab" |
| 19 | 17 | ||
| 20 | /*-------------------------------------------------------------------------*\ | 18 | /*-------------------------------------------------------------------------*\ |
diff --git a/src/makefile b/src/makefile index b614f77..3351997 100644 --- a/src/makefile +++ b/src/makefile | |||
| @@ -1,39 +1,86 @@ | |||
| 1 | PLAT = none | ||
| 2 | INSTALL_DATA=cp | ||
| 3 | INSTALL_EXEC=cp | ||
| 4 | INSTALL_TOP= /opt/local | ||
| 5 | LUAINC= $(LUAINC_$(PLAT)) | ||
| 6 | |||
| 1 | #------ | 7 | #------ |
| 2 | # Load configuration | 8 | # Install directories |
| 3 | # | 9 | # |
| 4 | include ../config | 10 | INSTALL_TOP_SHARE=$(INSTALL_TOP)/share/lua/5.1 |
| 11 | INSTALL_TOP_LIB=$(INSTALL_TOP)/lib/lua/5.1 | ||
| 12 | INSTALL_SOCKET_SHARE=$(INSTALL_TOP_SHARE)/socket | ||
| 13 | INSTALL_SOCKET_LIB=$(INSTALL_TOP_LIB)/socket | ||
| 14 | INSTALL_MIME_SHARE=$(INSTALL_TOP_SHARE)/mime | ||
| 15 | INSTALL_MIME_LIB=$(INSTALL_TOP_LIB)/mime | ||
| 5 | 16 | ||
| 6 | #------ | 17 | #------ |
| 7 | # Hopefully no need to change anything below this line | 18 | # Output file names |
| 8 | # | 19 | # |
| 20 | EXT=so | ||
| 21 | SOCKET_V=2.0.3 | ||
| 22 | MIME_V=1.0.3 | ||
| 23 | SOCKET_SO=socket.$(EXT).$(SOCKET_V) | ||
| 24 | MIME_SO=mime.$(EXT).$(MIME_V) | ||
| 25 | UNIX_SO=unix.$(EXT) | ||
| 9 | 26 | ||
| 10 | #------ | 27 | #------ |
| 11 | # Modules belonging to socket-core | 28 | # Compiler and linker settings |
| 12 | # | 29 | # for Mac OS X |
| 30 | LUAINC_macosx= -I/opt/local/include | ||
| 31 | CC_macosx=gcc | ||
| 32 | DEF_macosx= -DLUASOCKET_DEBUG -DUNIX_HAS_SUN_LEN \ | ||
| 33 | -DLUASOCKET_API='__attribute__((visibility("default")))' \ | ||
| 34 | -DMIME_API='__attribute__((visibility("default")))' | ||
| 35 | CFLAGS_macosx= $(LUAINC) $(COMPAT) $(DEF) -pedantic -Wall -O2 -fno-common \ | ||
| 36 | -fvisibility=hidden | ||
| 37 | LDFLAGS_macosx= -bundle -undefined dynamic_lookup | ||
| 38 | LD_macosx= export MACOSX_DEPLOYMENT_TARGET="10.3"; gcc | ||
| 13 | 39 | ||
| 14 | #$(COMPAT)/compat-5.1.o \ | 40 | #------ |
| 41 | # Compiler and linker settings | ||
| 42 | # for Linux | ||
| 43 | LUAINC_linux= -I/usr/local/include/lua5.1 | ||
| 44 | CC_linux=gcc | ||
| 45 | DEF_linux=-DLUASOCKET_DEBUG \ | ||
| 46 | -DLUASOCKET_API='__attribute__((visibility("default")))' \ | ||
| 47 | -DMIME_API='__attribute__((visibility("default")))' | ||
| 48 | CFLAGS_linux= $(LUAINC) $(DEF) -pedantic -Wall -O2 -fpic \ | ||
| 49 | -fvisibility=hidden | ||
| 50 | LDFLAGS_linux=-O -shared -fpic | ||
| 51 | LD_linux= gcc | ||
| 15 | 52 | ||
| 16 | SOCKET_OBJS:= \ | 53 | #------ |
| 54 | # Settings selected for platform | ||
| 55 | # | ||
| 56 | CC=$(CC_$(PLAT)) | ||
| 57 | DEF=$(DEF_$(PLAT)) | ||
| 58 | CFLAGS=$(CFLAGS_$(PLAT)) | ||
| 59 | LDFLAGS=$(LDFLAGS_$(PLAT)) | ||
| 60 | LD=$(LD_$(PLAT)) | ||
| 61 | |||
| 62 | #------ | ||
| 63 | # Modules belonging to socket-core | ||
| 64 | # | ||
| 65 | SOCKET_OBJS= \ | ||
| 17 | luasocket.o \ | 66 | luasocket.o \ |
| 18 | timeout.o \ | 67 | timeout.o \ |
| 19 | buffer.o \ | 68 | buffer.o \ |
| 20 | io.o \ | 69 | io.o \ |
| 21 | auxiliar.o \ | 70 | auxiliar.o \ |
| 22 | options.o \ | 71 | options.o \ |
| 23 | inet.o \ | 72 | inet.o \ |
| 24 | tcp.o \ | 73 | usocket.o \ |
| 25 | udp.o \ | ||
| 26 | except.o \ | 74 | except.o \ |
| 27 | select.o \ | 75 | select.o \ |
| 28 | usocket.o | 76 | tcp.o \ |
| 77 | udp.o | ||
| 29 | 78 | ||
| 30 | #------ | 79 | #------ |
| 31 | # Modules belonging mime-core | 80 | # Modules belonging mime-core |
| 32 | # | 81 | # |
| 33 | #$(COMPAT)/compat-5.1.o \ | 82 | MIME_OBJS= \ |
| 34 | 83 | mime.o | |
| 35 | MIME_OBJS:=\ | ||
| 36 | mime.o | ||
| 37 | 84 | ||
| 38 | #------ | 85 | #------ |
| 39 | # Modules belonging unix (local domain sockets) | 86 | # Modules belonging unix (local domain sockets) |
| @@ -47,7 +94,35 @@ UNIX_OBJS:=\ | |||
| 47 | usocket.o \ | 94 | usocket.o \ |
| 48 | unix.o | 95 | unix.o |
| 49 | 96 | ||
| 50 | all: $(SOCKET_SO) $(MIME_SO) | 97 | #------ |
| 98 | # Files to install | ||
| 99 | # | ||
| 100 | TO_SOCKET_SHARE:= \ | ||
| 101 | http.lua \ | ||
| 102 | url.lua \ | ||
| 103 | tp.lua \ | ||
| 104 | ftp.lua \ | ||
| 105 | headers.lua \ | ||
| 106 | smtp.lua | ||
| 107 | |||
| 108 | TO_TOP_SHARE:= \ | ||
| 109 | ltn12.lua \ | ||
| 110 | socket.lua \ | ||
| 111 | mime.lua | ||
| 112 | |||
| 113 | default: $(PLAT) | ||
| 114 | |||
| 115 | macosx: | ||
| 116 | $(MAKE) all PLAT=macosx | ||
| 117 | |||
| 118 | linux: | ||
| 119 | $(MAKE) all PLAT=linux | ||
| 120 | |||
| 121 | none: | ||
| 122 | @echo "Please choose a platform:" | ||
| 123 | @echo " $(PLATS)" | ||
| 124 | |||
| 125 | all: $(SOCKET_SO) $(MIME_SO) | ||
| 51 | 126 | ||
| 52 | $(SOCKET_SO): $(SOCKET_OBJS) | 127 | $(SOCKET_SO): $(SOCKET_OBJS) |
| 53 | $(LD) $(LDFLAGS) -o $@ $(SOCKET_OBJS) | 128 | $(LD) $(LDFLAGS) -o $@ $(SOCKET_OBJS) |
| @@ -58,6 +133,25 @@ $(MIME_SO): $(MIME_OBJS) | |||
| 58 | $(UNIX_SO): $(UNIX_OBJS) | 133 | $(UNIX_SO): $(UNIX_OBJS) |
| 59 | $(LD) $(LDFLAGS) -o $@ $(UNIX_OBJS) | 134 | $(LD) $(LDFLAGS) -o $@ $(UNIX_OBJS) |
| 60 | 135 | ||
| 136 | install: | ||
| 137 | mkdir -p $(INSTALL_TOP_SHARE) | ||
| 138 | $(INSTALL_DATA) $(TO_TOP_SHARE) $(INSTALL_TOP_SHARE) | ||
| 139 | mkdir -p $(INSTALL_SOCKET_SHARE) | ||
| 140 | $(INSTALL_DATA) $(TO_SOCKET_SHARE) $(INSTALL_SOCKET_SHARE) | ||
| 141 | mkdir -p $(INSTALL_SOCKET_LIB) | ||
| 142 | $(INSTALL_EXEC) $(SOCKET_SO) $(INSTALL_SOCKET_LIB)/core.$(EXT) | ||
| 143 | mkdir -p $(INSTALL_MIME_LIB) | ||
| 144 | $(INSTALL_EXEC) $(MIME_SO) $(INSTALL_MIME_LIB)/core.$(EXT) | ||
| 145 | |||
| 146 | local: | ||
| 147 | $(MAKE) install INSTALL_TOP_LIB=.. INSTALL_TOP_SHARE=.. | ||
| 148 | |||
| 149 | clean: | ||
| 150 | rm -f $(SOCKET_SO) $(SOCKET_OBJS) | ||
| 151 | rm -f $(MIME_SO) $(UNIX_SO) $(MIME_OBJS) $(UNIX_OBJS) | ||
| 152 | |||
| 153 | .PHONY: all $(PLATS) default clean echo none | ||
| 154 | |||
| 61 | #------ | 155 | #------ |
| 62 | # List of dependencies | 156 | # List of dependencies |
| 63 | # | 157 | # |
| @@ -66,25 +160,19 @@ buffer.o: buffer.c buffer.h io.h timeout.h | |||
| 66 | except.o: except.c except.h | 160 | except.o: except.c except.h |
| 67 | inet.o: inet.c inet.h socket.h io.h timeout.h usocket.h | 161 | inet.o: inet.c inet.h socket.h io.h timeout.h usocket.h |
| 68 | io.o: io.c io.h timeout.h | 162 | io.o: io.c io.h timeout.h |
| 69 | luasocket.o: luasocket.c luasocket.h auxiliar.h except.h timeout.h \ | 163 | luasocket.o: luasocket.c luasocket.h auxiliar.h except.h \ |
| 70 | buffer.h io.h inet.h socket.h usocket.h tcp.h udp.h select.h | 164 | timeout.h buffer.h io.h inet.h socket.h usocket.h tcp.h \ |
| 165 | udp.h select.h | ||
| 71 | mime.o: mime.c mime.h | 166 | mime.o: mime.c mime.h |
| 72 | options.o: options.c auxiliar.h options.h socket.h io.h timeout.h \ | 167 | options.o: options.c auxiliar.h options.h socket.h io.h \ |
| 73 | usocket.h inet.h | 168 | timeout.h usocket.h inet.h |
| 74 | select.o: select.c socket.h io.h timeout.h usocket.h select.h | 169 | select.o: select.c socket.h io.h timeout.h usocket.h select.h |
| 75 | tcp.o: tcp.c auxiliar.h socket.h io.h timeout.h usocket.h inet.h \ | 170 | tcp.o: tcp.c auxiliar.h socket.h io.h timeout.h usocket.h \ |
| 76 | options.h tcp.h buffer.h | 171 | inet.h options.h tcp.h buffer.h |
| 77 | timeout.o: timeout.c auxiliar.h timeout.h | 172 | timeout.o: timeout.c auxiliar.h timeout.h |
| 78 | udp.o: udp.c auxiliar.h socket.h io.h timeout.h usocket.h inet.h \ | 173 | udp.o: udp.c auxiliar.h socket.h io.h timeout.h usocket.h \ |
| 79 | options.h udp.h | 174 | inet.h options.h udp.h |
| 80 | unix.o: unix.c auxiliar.h socket.h io.h timeout.h usocket.h options.h \ | 175 | unix.o: unix.c auxiliar.h socket.h io.h timeout.h usocket.h \ |
| 81 | unix.h buffer.h | 176 | options.h unix.h buffer.h |
| 82 | usocket.o: usocket.c socket.h io.h timeout.h usocket.h | 177 | usocket.o: usocket.c socket.h io.h timeout.h usocket.h |
| 83 | 178 | wsocket.o: wsocket.c socket.h io.h timeout.h usocket.h | |
| 84 | clean: | ||
| 85 | rm -f $(SOCKET_SO) $(SOCKET_OBJS) | ||
| 86 | rm -f $(MIME_SO) $(UNIX_SO) $(MIME_OBJS) $(UNIX_OBJS) | ||
| 87 | |||
| 88 | #------ | ||
| 89 | # End of makefile configuration | ||
| 90 | # | ||
| @@ -272,9 +272,12 @@ static int mime_global_b64(lua_State *L) | |||
| 272 | input = (UC *) luaL_optlstring(L, 2, NULL, &isize); | 272 | input = (UC *) luaL_optlstring(L, 2, NULL, &isize); |
| 273 | /* if second part is nil, we are done */ | 273 | /* if second part is nil, we are done */ |
| 274 | if (!input) { | 274 | if (!input) { |
| 275 | size_t osize = 0; | ||
| 275 | asize = b64pad(atom, asize, &buffer); | 276 | asize = b64pad(atom, asize, &buffer); |
| 276 | luaL_pushresult(&buffer); | 277 | luaL_pushresult(&buffer); |
| 277 | if (!(*lua_tostring(L, -1))) lua_pushnil(L); | 278 | /* if the output is empty and the input is nil, return nil */ |
| 279 | lua_tolstring(L, -1, &osize); | ||
| 280 | if (osize == 0) lua_pushnil(L); | ||
| 278 | lua_pushnil(L); | 281 | lua_pushnil(L); |
| 279 | return 2; | 282 | return 2; |
| 280 | } | 283 | } |
| @@ -313,8 +316,11 @@ static int mime_global_unb64(lua_State *L) | |||
| 313 | input = (UC *) luaL_optlstring(L, 2, NULL, &isize); | 316 | input = (UC *) luaL_optlstring(L, 2, NULL, &isize); |
| 314 | /* if second is nil, we are done */ | 317 | /* if second is nil, we are done */ |
| 315 | if (!input) { | 318 | if (!input) { |
| 319 | size_t osize = 0; | ||
| 316 | luaL_pushresult(&buffer); | 320 | luaL_pushresult(&buffer); |
| 317 | if (!(*lua_tostring(L, -1))) lua_pushnil(L); | 321 | /* if the output is empty and the input is nil, return nil */ |
| 322 | lua_tolstring(L, -1, &osize); | ||
| 323 | if (osize == 0) lua_pushnil(L); | ||
| 318 | lua_pushnil(L); | 324 | lua_pushnil(L); |
| 319 | return 2; | 325 | return 2; |
| 320 | } | 326 | } |
| @@ -7,16 +7,14 @@ | |||
| 7 | * This module provides functions to implement transfer content encodings | 7 | * This module provides functions to implement transfer content encodings |
| 8 | * and formatting conforming to RFC 2045. It is used by mime.lua, which | 8 | * and formatting conforming to RFC 2045. It is used by mime.lua, which |
| 9 | * provide a higher level interface to this functionality. | 9 | * provide a higher level interface to this functionality. |
| 10 | * | ||
| 11 | * RCS ID: $Id$ | ||
| 12 | \*=========================================================================*/ | 10 | \*=========================================================================*/ |
| 13 | #include "lua.h" | 11 | #include "lua.h" |
| 14 | 12 | ||
| 15 | /*-------------------------------------------------------------------------*\ | 13 | /*-------------------------------------------------------------------------*\ |
| 16 | * Current MIME library version | 14 | * Current MIME library version |
| 17 | \*-------------------------------------------------------------------------*/ | 15 | \*-------------------------------------------------------------------------*/ |
| 18 | #define MIME_VERSION "MIME 1.0.2" | 16 | #define MIME_VERSION "MIME 1.0.3" |
| 19 | #define MIME_COPYRIGHT "Copyright (C) 2004-2007 Diego Nehab" | 17 | #define MIME_COPYRIGHT "Copyright (C) 2004-2009 Diego Nehab" |
| 20 | #define MIME_AUTHORS "Diego Nehab" | 18 | #define MIME_AUTHORS "Diego Nehab" |
| 21 | 19 | ||
| 22 | /*-------------------------------------------------------------------------*\ | 20 | /*-------------------------------------------------------------------------*\ |
diff --git a/src/options.c b/src/options.c index a464a4b..1d4c950 100644 --- a/src/options.c +++ b/src/options.c | |||
| @@ -12,12 +12,12 @@ | |||
| 12 | #include "options.h" | 12 | #include "options.h" |
| 13 | #include "inet.h" | 13 | #include "inet.h" |
| 14 | 14 | ||
| 15 | |||
| 16 | /*=========================================================================*\ | 15 | /*=========================================================================*\ |
| 17 | * Internal functions prototypes | 16 | * Internal functions prototypes |
| 18 | \*=========================================================================*/ | 17 | \*=========================================================================*/ |
| 19 | static int opt_setmembership(lua_State *L, p_socket ps, int level, int name); | 18 | static int opt_setmembership(lua_State *L, p_socket ps, int level, int name); |
| 20 | static int opt_setboolean(lua_State *L, p_socket ps, int level, int name); | 19 | static int opt_setboolean(lua_State *L, p_socket ps, int level, int name); |
| 20 | static int opt_getboolean(lua_State *L, p_socket ps, int level, int name); | ||
| 21 | static int opt_set(lua_State *L, p_socket ps, int level, int name, | 21 | static int opt_set(lua_State *L, p_socket ps, int level, int name, |
| 22 | void *val, int len); | 22 | void *val, int len); |
| 23 | 23 | ||
| @@ -40,39 +40,63 @@ int opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps) | |||
| 40 | return opt->func(L, ps); | 40 | return opt->func(L, ps); |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | int opt_meth_getoption(lua_State *L, p_opt opt, p_socket ps) | ||
| 44 | { | ||
| 45 | const char *name = luaL_checkstring(L, 2); /* obj, name, ... */ | ||
| 46 | while (opt->name && strcmp(name, opt->name)) | ||
| 47 | opt++; | ||
| 48 | if (!opt->func) { | ||
| 49 | char msg[45]; | ||
| 50 | sprintf(msg, "unsupported option `%.35s'", name); | ||
| 51 | luaL_argerror(L, 2, msg); | ||
| 52 | } | ||
| 53 | return opt->func(L, ps); | ||
| 54 | } | ||
| 55 | |||
| 43 | /* enables reuse of local address */ | 56 | /* enables reuse of local address */ |
| 44 | int opt_reuseaddr(lua_State *L, p_socket ps) | 57 | int opt_set_reuseaddr(lua_State *L, p_socket ps) |
| 45 | { | 58 | { |
| 46 | return opt_setboolean(L, ps, SOL_SOCKET, SO_REUSEADDR); | 59 | return opt_setboolean(L, ps, SOL_SOCKET, SO_REUSEADDR); |
| 47 | } | 60 | } |
| 48 | 61 | ||
| 62 | /* enables reuse of local port */ | ||
| 63 | int opt_set_reuseport(lua_State *L, p_socket ps) | ||
| 64 | { | ||
| 65 | return opt_setboolean(L, ps, SOL_SOCKET, SO_REUSEPORT); | ||
| 66 | } | ||
| 67 | |||
| 49 | /* disables the Naggle algorithm */ | 68 | /* disables the Naggle algorithm */ |
| 50 | int opt_tcp_nodelay(lua_State *L, p_socket ps) | 69 | int opt_set_tcp_nodelay(lua_State *L, p_socket ps) |
| 51 | { | 70 | { |
| 52 | return opt_setboolean(L, ps, IPPROTO_TCP, TCP_NODELAY); | 71 | return opt_setboolean(L, ps, IPPROTO_TCP, TCP_NODELAY); |
| 53 | } | 72 | } |
| 54 | 73 | ||
| 55 | int opt_keepalive(lua_State *L, p_socket ps) | 74 | int opt_set_keepalive(lua_State *L, p_socket ps) |
| 56 | { | 75 | { |
| 57 | return opt_setboolean(L, ps, SOL_SOCKET, SO_KEEPALIVE); | 76 | return opt_setboolean(L, ps, SOL_SOCKET, SO_KEEPALIVE); |
| 58 | } | 77 | } |
| 59 | 78 | ||
| 60 | int opt_dontroute(lua_State *L, p_socket ps) | 79 | int opt_set_dontroute(lua_State *L, p_socket ps) |
| 61 | { | 80 | { |
| 62 | return opt_setboolean(L, ps, SOL_SOCKET, SO_DONTROUTE); | 81 | return opt_setboolean(L, ps, SOL_SOCKET, SO_DONTROUTE); |
| 63 | } | 82 | } |
| 64 | 83 | ||
| 65 | int opt_broadcast(lua_State *L, p_socket ps) | 84 | int opt_set_broadcast(lua_State *L, p_socket ps) |
| 66 | { | 85 | { |
| 67 | return opt_setboolean(L, ps, SOL_SOCKET, SO_BROADCAST); | 86 | return opt_setboolean(L, ps, SOL_SOCKET, SO_BROADCAST); |
| 68 | } | 87 | } |
| 69 | 88 | ||
| 70 | int opt_ip_multicast_loop(lua_State *L, p_socket ps) | 89 | int opt_set_ip_multicast_loop(lua_State *L, p_socket ps) |
| 71 | { | 90 | { |
| 72 | return opt_setboolean(L, ps, IPPROTO_IP, IP_MULTICAST_LOOP); | 91 | return opt_setboolean(L, ps, IPPROTO_IP, IP_MULTICAST_LOOP); |
| 73 | } | 92 | } |
| 74 | 93 | ||
| 75 | int opt_linger(lua_State *L, p_socket ps) | 94 | int opt_get_ip_multicast_loop(lua_State *L, p_socket ps) |
| 95 | { | ||
| 96 | return opt_getboolean(L, ps, IPPROTO_IP, IP_MULTICAST_LOOP); | ||
| 97 | } | ||
| 98 | |||
| 99 | int opt_set_linger(lua_State *L, p_socket ps) | ||
| 76 | { | 100 | { |
| 77 | struct linger li; /* obj, name, table */ | 101 | struct linger li; /* obj, name, table */ |
| 78 | if (!lua_istable(L, 3)) luaL_typerror(L, 3, lua_typename(L, LUA_TTABLE)); | 102 | if (!lua_istable(L, 3)) luaL_typerror(L, 3, lua_typename(L, LUA_TTABLE)); |
| @@ -89,18 +113,43 @@ int opt_linger(lua_State *L, p_socket ps) | |||
| 89 | return opt_set(L, ps, SOL_SOCKET, SO_LINGER, (char *) &li, sizeof(li)); | 113 | return opt_set(L, ps, SOL_SOCKET, SO_LINGER, (char *) &li, sizeof(li)); |
| 90 | } | 114 | } |
| 91 | 115 | ||
| 92 | int opt_ip_multicast_ttl(lua_State *L, p_socket ps) | 116 | int opt_set_ip_multicast_ttl(lua_State *L, p_socket ps) |
| 93 | { | 117 | { |
| 94 | int val = (int) luaL_checknumber(L, 3); /* obj, name, int */ | 118 | int val = (int) luaL_checknumber(L, 3); /* obj, name, int */ |
| 95 | return opt_set(L, ps, SOL_SOCKET, SO_LINGER, (char *) &val, sizeof(val)); | 119 | return opt_set(L, ps, IPPROTO_IP, IP_MULTICAST_TTL, |
| 120 | (char *) &val, sizeof(val)); | ||
| 121 | } | ||
| 122 | |||
| 123 | int opt_set_ip_multicast_if(lua_State *L, p_socket ps) | ||
| 124 | { | ||
| 125 | const char *address = luaL_checkstring(L, 3); /* obj, name, ip */ | ||
| 126 | struct in_addr val; | ||
| 127 | val.s_addr = htonl(INADDR_ANY); | ||
| 128 | if (strcmp(address, "*") && !inet_aton(address, &val)) | ||
| 129 | luaL_argerror(L, 3, "ip expected"); | ||
| 130 | return opt_set(L, ps, IPPROTO_IP, IP_MULTICAST_IF, | ||
| 131 | (char *) &val, sizeof(val)); | ||
| 132 | } | ||
| 133 | |||
| 134 | int opt_get_ip_multicast_if(lua_State *L, p_socket ps) | ||
| 135 | { | ||
| 136 | struct in_addr val; | ||
| 137 | socklen_t len = sizeof(val); | ||
| 138 | if (getsockopt(*ps, IPPROTO_IP, IP_MULTICAST_IF, (char *) &val, &len) < 0) { | ||
| 139 | lua_pushnil(L); | ||
| 140 | lua_pushstring(L, "getsockopt failed"); | ||
| 141 | return 2; | ||
| 142 | } | ||
| 143 | lua_pushstring(L, inet_ntoa(val)); | ||
| 144 | return 1; | ||
| 96 | } | 145 | } |
| 97 | 146 | ||
| 98 | int opt_ip_add_membership(lua_State *L, p_socket ps) | 147 | int opt_set_ip_add_membership(lua_State *L, p_socket ps) |
| 99 | { | 148 | { |
| 100 | return opt_setmembership(L, ps, IPPROTO_IP, IP_ADD_MEMBERSHIP); | 149 | return opt_setmembership(L, ps, IPPROTO_IP, IP_ADD_MEMBERSHIP); |
| 101 | } | 150 | } |
| 102 | 151 | ||
| 103 | int opt_ip_drop_membersip(lua_State *L, p_socket ps) | 152 | int opt_set_ip_drop_membersip(lua_State *L, p_socket ps) |
| 104 | { | 153 | { |
| 105 | return opt_setmembership(L, ps, IPPROTO_IP, IP_DROP_MEMBERSHIP); | 154 | return opt_setmembership(L, ps, IPPROTO_IP, IP_DROP_MEMBERSHIP); |
| 106 | } | 155 | } |
| @@ -141,6 +190,19 @@ int opt_set(lua_State *L, p_socket ps, int level, int name, void *val, int len) | |||
| 141 | return 1; | 190 | return 1; |
| 142 | } | 191 | } |
| 143 | 192 | ||
| 193 | static int opt_getboolean(lua_State *L, p_socket ps, int level, int name) | ||
| 194 | { | ||
| 195 | int val = 0; | ||
| 196 | socklen_t len = sizeof(val); | ||
| 197 | if (getsockopt(*ps, level, name, (char *) &val, &len) < 0) { | ||
| 198 | lua_pushnil(L); | ||
| 199 | lua_pushstring(L, "getsockopt failed"); | ||
| 200 | return 2; | ||
| 201 | } | ||
| 202 | lua_pushboolean(L, val); | ||
| 203 | return 1; | ||
| 204 | } | ||
| 205 | |||
| 144 | static int opt_setboolean(lua_State *L, p_socket ps, int level, int name) | 206 | static int opt_setboolean(lua_State *L, p_socket ps, int level, int name) |
| 145 | { | 207 | { |
| 146 | int val = auxiliar_checkboolean(L, 3); /* obj, name, bool */ | 208 | int val = auxiliar_checkboolean(L, 3); /* obj, name, bool */ |
diff --git a/src/options.h b/src/options.h index 900761e..aa43cab 100644 --- a/src/options.h +++ b/src/options.h | |||
| @@ -6,8 +6,6 @@ | |||
| 6 | * | 6 | * |
| 7 | * This module provides a common interface to socket options, used mainly by | 7 | * This module provides a common interface to socket options, used mainly by |
| 8 | * modules UDP and TCP. | 8 | * modules UDP and TCP. |
| 9 | * | ||
| 10 | * RCS ID: $Id$ | ||
| 11 | \*=========================================================================*/ | 9 | \*=========================================================================*/ |
| 12 | 10 | ||
| 13 | #include "lua.h" | 11 | #include "lua.h" |
| @@ -20,20 +18,28 @@ typedef struct t_opt { | |||
| 20 | } t_opt; | 18 | } t_opt; |
| 21 | typedef t_opt *p_opt; | 19 | typedef t_opt *p_opt; |
| 22 | 20 | ||
| 23 | /* supported options */ | 21 | /* supported options for setoption */ |
| 24 | int opt_dontroute(lua_State *L, p_socket ps); | 22 | int opt_set_dontroute(lua_State *L, p_socket ps); |
| 25 | int opt_broadcast(lua_State *L, p_socket ps); | 23 | int opt_set_broadcast(lua_State *L, p_socket ps); |
| 26 | int opt_reuseaddr(lua_State *L, p_socket ps); | 24 | int opt_set_reuseaddr(lua_State *L, p_socket ps); |
| 27 | int opt_tcp_nodelay(lua_State *L, p_socket ps); | 25 | int opt_set_tcp_nodelay(lua_State *L, p_socket ps); |
| 28 | int opt_keepalive(lua_State *L, p_socket ps); | 26 | int opt_set_keepalive(lua_State *L, p_socket ps); |
| 29 | int opt_linger(lua_State *L, p_socket ps); | 27 | int opt_set_linger(lua_State *L, p_socket ps); |
| 30 | int opt_reuseaddr(lua_State *L, p_socket ps); | 28 | int opt_set_reuseaddr(lua_State *L, p_socket ps); |
| 31 | int opt_ip_multicast_ttl(lua_State *L, p_socket ps); | 29 | int opt_set_reuseport(lua_State *L, p_socket ps); |
| 32 | int opt_ip_multicast_loop(lua_State *L, p_socket ps); | 30 | int opt_set_ip_multicast_if(lua_State *L, p_socket ps); |
| 33 | int opt_ip_add_membership(lua_State *L, p_socket ps); | 31 | int opt_set_ip_multicast_ttl(lua_State *L, p_socket ps); |
| 34 | int opt_ip_drop_membersip(lua_State *L, p_socket ps); | 32 | int opt_set_ip_multicast_loop(lua_State *L, p_socket ps); |
| 35 | 33 | int opt_set_ip_add_membership(lua_State *L, p_socket ps); | |
| 34 | int opt_set_ip_drop_membersip(lua_State *L, p_socket ps); | ||
| 36 | /* invokes the appropriate option handler */ | 35 | /* invokes the appropriate option handler */ |
| 37 | int opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps); | 36 | int opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps); |
| 38 | 37 | ||
| 38 | /* supported options for getoption */ | ||
| 39 | int opt_get_ip_multicast_loop(lua_State *L, p_socket ps); | ||
| 40 | int opt_get_ip_multicast_if(lua_State *L, p_socket ps); | ||
| 41 | /* invokes the appropriate option handler */ | ||
| 42 | int opt_meth_getoption(lua_State *L, p_opt opt, p_socket ps); | ||
| 43 | |||
| 44 | |||
| 39 | #endif | 45 | #endif |
diff --git a/src/select.c b/src/select.c index 99b59f5..8e47d0e 100644 --- a/src/select.c +++ b/src/select.c | |||
| @@ -18,8 +18,8 @@ | |||
| 18 | \*=========================================================================*/ | 18 | \*=========================================================================*/ |
| 19 | static t_socket getfd(lua_State *L); | 19 | static t_socket getfd(lua_State *L); |
| 20 | static int dirty(lua_State *L); | 20 | static int dirty(lua_State *L); |
| 21 | static t_socket collect_fd(lua_State *L, int tab, t_socket max_fd, | 21 | static void collect_fd(lua_State *L, int tab, int itab, |
| 22 | int itab, fd_set *set); | 22 | fd_set *set, t_socket *max_fd); |
| 23 | static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set); | 23 | static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set); |
| 24 | static void return_fd(lua_State *L, fd_set *set, t_socket max_fd, | 24 | static void return_fd(lua_State *L, fd_set *set, t_socket max_fd, |
| 25 | int itab, int tab, int start); | 25 | int itab, int tab, int start); |
| @@ -39,6 +39,9 @@ static luaL_reg func[] = { | |||
| 39 | * Initializes module | 39 | * Initializes module |
| 40 | \*-------------------------------------------------------------------------*/ | 40 | \*-------------------------------------------------------------------------*/ |
| 41 | int select_open(lua_State *L) { | 41 | int select_open(lua_State *L) { |
| 42 | lua_pushstring(L, "_SETSIZE"); | ||
| 43 | lua_pushnumber(L, FD_SETSIZE); | ||
| 44 | lua_rawset(L, -3); | ||
| 42 | luaL_openlib(L, NULL, func, 0); | 45 | luaL_openlib(L, NULL, func, 0); |
| 43 | return 0; | 46 | return 0; |
| 44 | } | 47 | } |
| @@ -51,7 +54,7 @@ int select_open(lua_State *L) { | |||
| 51 | \*-------------------------------------------------------------------------*/ | 54 | \*-------------------------------------------------------------------------*/ |
| 52 | static int global_select(lua_State *L) { | 55 | static int global_select(lua_State *L) { |
| 53 | int rtab, wtab, itab, ret, ndirty; | 56 | int rtab, wtab, itab, ret, ndirty; |
| 54 | t_socket max_fd; | 57 | t_socket max_fd = SOCKET_INVALID; |
| 55 | fd_set rset, wset; | 58 | fd_set rset, wset; |
| 56 | t_timeout tm; | 59 | t_timeout tm; |
| 57 | double t = luaL_optnumber(L, 3, -1); | 60 | double t = luaL_optnumber(L, 3, -1); |
| @@ -60,12 +63,12 @@ static int global_select(lua_State *L) { | |||
| 60 | lua_newtable(L); itab = lua_gettop(L); | 63 | lua_newtable(L); itab = lua_gettop(L); |
| 61 | lua_newtable(L); rtab = lua_gettop(L); | 64 | lua_newtable(L); rtab = lua_gettop(L); |
| 62 | lua_newtable(L); wtab = lua_gettop(L); | 65 | lua_newtable(L); wtab = lua_gettop(L); |
| 63 | max_fd = collect_fd(L, 1, SOCKET_INVALID, itab, &rset); | 66 | collect_fd(L, 1, itab, &rset, &max_fd); |
| 67 | collect_fd(L, 2, itab, &wset, &max_fd); | ||
| 64 | ndirty = check_dirty(L, 1, rtab, &rset); | 68 | ndirty = check_dirty(L, 1, rtab, &rset); |
| 65 | t = ndirty > 0? 0.0: t; | 69 | t = ndirty > 0? 0.0: t; |
| 66 | timeout_init(&tm, t, -1); | 70 | timeout_init(&tm, t, -1); |
| 67 | timeout_markstart(&tm); | 71 | timeout_markstart(&tm); |
| 68 | max_fd = collect_fd(L, 2, max_fd, itab, &wset); | ||
| 69 | ret = socket_select(max_fd+1, &rset, &wset, NULL, &tm); | 72 | ret = socket_select(max_fd+1, &rset, &wset, NULL, &tm); |
| 70 | if (ret > 0 || ndirty > 0) { | 73 | if (ret > 0 || ndirty > 0) { |
| 71 | return_fd(L, &rset, max_fd+1, itab, rtab, ndirty); | 74 | return_fd(L, &rset, max_fd+1, itab, rtab, ndirty); |
| @@ -77,7 +80,7 @@ static int global_select(lua_State *L) { | |||
| 77 | lua_pushstring(L, "timeout"); | 80 | lua_pushstring(L, "timeout"); |
| 78 | return 3; | 81 | return 3; |
| 79 | } else { | 82 | } else { |
| 80 | lua_pushstring(L, "error"); | 83 | luaL_error(L, "select failed"); |
| 81 | return 3; | 84 | return 3; |
| 82 | } | 85 | } |
| 83 | } | 86 | } |
| @@ -112,11 +115,13 @@ static int dirty(lua_State *L) { | |||
| 112 | return is; | 115 | return is; |
| 113 | } | 116 | } |
| 114 | 117 | ||
| 115 | static t_socket collect_fd(lua_State *L, int tab, t_socket max_fd, | 118 | static void collect_fd(lua_State *L, int tab, int itab, |
| 116 | int itab, fd_set *set) { | 119 | fd_set *set, t_socket *max_fd) { |
| 117 | int i = 1; | 120 | int i = 1, n = 0; |
| 118 | if (lua_isnil(L, tab)) | 121 | /* nil is the same as an empty table */ |
| 119 | return max_fd; | 122 | if (lua_isnil(L, tab)) return; |
| 123 | /* otherwise we need it to be a table */ | ||
| 124 | luaL_checktype(L, tab, LUA_TTABLE); | ||
| 120 | while (1) { | 125 | while (1) { |
| 121 | t_socket fd; | 126 | t_socket fd; |
| 122 | lua_pushnumber(L, i); | 127 | lua_pushnumber(L, i); |
| @@ -125,11 +130,18 @@ static t_socket collect_fd(lua_State *L, int tab, t_socket max_fd, | |||
| 125 | lua_pop(L, 1); | 130 | lua_pop(L, 1); |
| 126 | break; | 131 | break; |
| 127 | } | 132 | } |
| 133 | /* getfd figures out if this is a socket */ | ||
| 128 | fd = getfd(L); | 134 | fd = getfd(L); |
| 129 | if (fd != SOCKET_INVALID) { | 135 | if (fd != SOCKET_INVALID) { |
| 136 | /* make sure we don't overflow the fd_set */ | ||
| 137 | if (n >= FD_SETSIZE) | ||
| 138 | luaL_argerror(L, tab, "too many sockets"); | ||
| 130 | FD_SET(fd, set); | 139 | FD_SET(fd, set); |
| 131 | if (max_fd == SOCKET_INVALID || max_fd < fd) | 140 | n++; |
| 132 | max_fd = fd; | 141 | /* keep track of the largest descriptor so far */ |
| 142 | if (*max_fd == SOCKET_INVALID || *max_fd < fd) | ||
| 143 | *max_fd = fd; | ||
| 144 | /* make sure we can map back from descriptor to the object */ | ||
| 133 | lua_pushnumber(L, fd); | 145 | lua_pushnumber(L, fd); |
| 134 | lua_pushvalue(L, -2); | 146 | lua_pushvalue(L, -2); |
| 135 | lua_settable(L, itab); | 147 | lua_settable(L, itab); |
| @@ -137,7 +149,6 @@ static t_socket collect_fd(lua_State *L, int tab, t_socket max_fd, | |||
| 137 | lua_pop(L, 1); | 149 | lua_pop(L, 1); |
| 138 | i = i + 1; | 150 | i = i + 1; |
| 139 | } | 151 | } |
| 140 | return max_fd; | ||
| 141 | } | 152 | } |
| 142 | 153 | ||
| 143 | static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set) { | 154 | static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set) { |
diff --git a/src/select.h b/src/select.h index f2d2cc2..8750200 100644 --- a/src/select.h +++ b/src/select.h | |||
| @@ -8,8 +8,6 @@ | |||
| 8 | * method getfd() which returns the descriptor to be passed to the | 8 | * method getfd() which returns the descriptor to be passed to the |
| 9 | * underlying select function. Another method, dirty(), should return | 9 | * underlying select function. Another method, dirty(), should return |
| 10 | * true if there is data ready for reading (required for buffered input). | 10 | * true if there is data ready for reading (required for buffered input). |
| 11 | * | ||
| 12 | * RCS ID: $Id$ | ||
| 13 | \*=========================================================================*/ | 11 | \*=========================================================================*/ |
| 14 | 12 | ||
| 15 | int select_open(lua_State *L); | 13 | int select_open(lua_State *L); |
diff --git a/src/smtp.lua b/src/smtp.lua index 9a204d8..b39f5d6 100644 --- a/src/smtp.lua +++ b/src/smtp.lua | |||
| @@ -16,6 +16,7 @@ local os = require("os") | |||
| 16 | local socket = require("socket") | 16 | local socket = require("socket") |
| 17 | local tp = require("socket.tp") | 17 | local tp = require("socket.tp") |
| 18 | local ltn12 = require("ltn12") | 18 | local ltn12 = require("ltn12") |
| 19 | local headers = require("socket.headers") | ||
| 19 | local mime = require("mime") | 20 | local mime = require("mime") |
| 20 | module("socket.smtp") | 21 | module("socket.smtp") |
| 21 | 22 | ||
| @@ -146,10 +147,11 @@ end | |||
| 146 | local send_message | 147 | local send_message |
| 147 | 148 | ||
| 148 | -- yield the headers all at once, it's faster | 149 | -- yield the headers all at once, it's faster |
| 149 | local function send_headers(headers) | 150 | local function send_headers(tosend) |
| 151 | local canonic = headers.canonic | ||
| 150 | local h = "\r\n" | 152 | local h = "\r\n" |
| 151 | for i,v in base.pairs(headers) do | 153 | for f,v in base.pairs(tosend) do |
| 152 | h = i .. ': ' .. v .. "\r\n" .. h | 154 | h = (canonic[f] or f) .. ': ' .. v .. "\r\n" .. h |
| 153 | end | 155 | end |
| 154 | coroutine.yield(h) | 156 | coroutine.yield(h) |
| 155 | end | 157 | end |
diff --git a/src/socket.h b/src/socket.h index de5d79f..425628d 100644 --- a/src/socket.h +++ b/src/socket.h | |||
| @@ -8,8 +8,6 @@ | |||
| 8 | * differences. Also, not all *nix platforms behave the same. This module | 8 | * differences. Also, not all *nix platforms behave the same. This module |
| 9 | * (and the associated usocket.h and wsocket.h) factor these differences and | 9 | * (and the associated usocket.h and wsocket.h) factor these differences and |
| 10 | * creates a interface compatible with the io.h module. | 10 | * creates a interface compatible with the io.h module. |
| 11 | * | ||
| 12 | * RCS ID: $Id$ | ||
| 13 | \*=========================================================================*/ | 11 | \*=========================================================================*/ |
| 14 | #include "io.h" | 12 | #include "io.h" |
| 15 | 13 | ||
| @@ -64,11 +64,11 @@ static luaL_reg tcp[] = { | |||
| 64 | }; | 64 | }; |
| 65 | 65 | ||
| 66 | /* socket option handlers */ | 66 | /* socket option handlers */ |
| 67 | static t_opt opt[] = { | 67 | static t_opt optset[] = { |
| 68 | {"keepalive", opt_keepalive}, | 68 | {"keepalive", opt_set_keepalive}, |
| 69 | {"reuseaddr", opt_reuseaddr}, | 69 | {"reuseaddr", opt_set_reuseaddr}, |
| 70 | {"tcp-nodelay", opt_tcp_nodelay}, | 70 | {"tcp-nodelay", opt_set_tcp_nodelay}, |
| 71 | {"linger", opt_linger}, | 71 | {"linger", opt_set_linger}, |
| 72 | {NULL, NULL} | 72 | {NULL, NULL} |
| 73 | }; | 73 | }; |
| 74 | 74 | ||
| @@ -128,7 +128,7 @@ static int meth_setstats(lua_State *L) { | |||
| 128 | static int meth_setoption(lua_State *L) | 128 | static int meth_setoption(lua_State *L) |
| 129 | { | 129 | { |
| 130 | p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, "tcp{any}", 1); | 130 | p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, "tcp{any}", 1); |
| 131 | return opt_meth_setoption(L, opt, &tcp->sock); | 131 | return opt_meth_setoption(L, optset, &tcp->sock); |
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | /*-------------------------------------------------------------------------*\ | 134 | /*-------------------------------------------------------------------------*\ |
| @@ -13,8 +13,6 @@ | |||
| 13 | * objects are tcp objects bound to some local address. Client objects are | 13 | * objects are tcp objects bound to some local address. Client objects are |
| 14 | * tcp objects either connected to some address or returned by the accept | 14 | * tcp objects either connected to some address or returned by the accept |
| 15 | * method of a server object. | 15 | * method of a server object. |
| 16 | * | ||
| 17 | * RCS ID: $Id$ | ||
| 18 | \*=========================================================================*/ | 16 | \*=========================================================================*/ |
| 19 | #include "lua.h" | 17 | #include "lua.h" |
| 20 | 18 | ||
diff --git a/src/timeout.c b/src/timeout.c index 863546e..fb015f9 100644 --- a/src/timeout.c +++ b/src/timeout.c | |||
| @@ -5,6 +5,8 @@ | |||
| 5 | * RCS ID: $Id$ | 5 | * RCS ID: $Id$ |
| 6 | \*=========================================================================*/ | 6 | \*=========================================================================*/ |
| 7 | #include <stdio.h> | 7 | #include <stdio.h> |
| 8 | #include <limits.h> | ||
| 9 | #include <float.h> | ||
| 8 | 10 | ||
| 9 | #include "lua.h" | 11 | #include "lua.h" |
| 10 | #include "lauxlib.h" | 12 | #include "lauxlib.h" |
| @@ -187,13 +189,23 @@ static int timeout_lua_gettime(lua_State *L) | |||
| 187 | /*-------------------------------------------------------------------------*\ | 189 | /*-------------------------------------------------------------------------*\ |
| 188 | * Sleep for n seconds. | 190 | * Sleep for n seconds. |
| 189 | \*-------------------------------------------------------------------------*/ | 191 | \*-------------------------------------------------------------------------*/ |
| 192 | #ifdef _WIN32 | ||
| 190 | int timeout_lua_sleep(lua_State *L) | 193 | int timeout_lua_sleep(lua_State *L) |
| 191 | { | 194 | { |
| 192 | double n = luaL_checknumber(L, 1); | 195 | double n = luaL_checknumber(L, 1); |
| 193 | #ifdef _WIN32 | 196 | if (n < 0.0) n = 0.0; |
| 194 | Sleep((int)(n*1000)); | 197 | if (n < DBL_MAX/1000.0) n *= 1000.0; |
| 198 | if (n > INT_MAX) n = INT_MAX; | ||
| 199 | Sleep((int)n); | ||
| 200 | return 0; | ||
| 201 | } | ||
| 195 | #else | 202 | #else |
| 203 | int timeout_lua_sleep(lua_State *L) | ||
| 204 | { | ||
| 205 | double n = luaL_checknumber(L, 1); | ||
| 196 | struct timespec t, r; | 206 | struct timespec t, r; |
| 207 | if (n < 0.0) n = 0.0; | ||
| 208 | if (n > INT_MAX) n = INT_MAX; | ||
| 197 | t.tv_sec = (int) n; | 209 | t.tv_sec = (int) n; |
| 198 | n -= t.tv_sec; | 210 | n -= t.tv_sec; |
| 199 | t.tv_nsec = (int) (n * 1000000000); | 211 | t.tv_nsec = (int) (n * 1000000000); |
| @@ -202,6 +214,6 @@ int timeout_lua_sleep(lua_State *L) | |||
| 202 | t.tv_sec = r.tv_sec; | 214 | t.tv_sec = r.tv_sec; |
| 203 | t.tv_nsec = r.tv_nsec; | 215 | t.tv_nsec = r.tv_nsec; |
| 204 | } | 216 | } |
| 205 | #endif | ||
| 206 | return 0; | 217 | return 0; |
| 207 | } | 218 | } |
| 219 | #endif | ||
diff --git a/src/timeout.h b/src/timeout.h index a328bcc..6715ca7 100644 --- a/src/timeout.h +++ b/src/timeout.h | |||
| @@ -3,8 +3,6 @@ | |||
| 3 | /*=========================================================================*\ | 3 | /*=========================================================================*\ |
| 4 | * Timeout management functions | 4 | * Timeout management functions |
| 5 | * LuaSocket toolkit | 5 | * LuaSocket toolkit |
| 6 | * | ||
| 7 | * RCS ID: $Id$ | ||
| 8 | \*=========================================================================*/ | 6 | \*=========================================================================*/ |
| 9 | #include "lua.h" | 7 | #include "lua.h" |
| 10 | 8 | ||
| @@ -64,6 +64,7 @@ function metat.__index:check(ok) | |||
| 64 | end | 64 | end |
| 65 | 65 | ||
| 66 | function metat.__index:command(cmd, arg) | 66 | function metat.__index:command(cmd, arg) |
| 67 | cmd = string.upper(cmd) | ||
| 67 | if arg then | 68 | if arg then |
| 68 | return self.c:send(cmd .. " " .. arg.. "\r\n") | 69 | return self.c:send(cmd .. " " .. arg.. "\r\n") |
| 69 | else | 70 | else |
| @@ -37,6 +37,7 @@ static int meth_setsockname(lua_State *L); | |||
| 37 | static int meth_setpeername(lua_State *L); | 37 | static int meth_setpeername(lua_State *L); |
| 38 | static int meth_close(lua_State *L); | 38 | static int meth_close(lua_State *L); |
| 39 | static int meth_setoption(lua_State *L); | 39 | static int meth_setoption(lua_State *L); |
| 40 | static int meth_getoption(lua_State *L); | ||
| 40 | static int meth_settimeout(lua_State *L); | 41 | static int meth_settimeout(lua_State *L); |
| 41 | static int meth_getfd(lua_State *L); | 42 | static int meth_getfd(lua_State *L); |
| 42 | static int meth_setfd(lua_State *L); | 43 | static int meth_setfd(lua_State *L); |
| @@ -57,22 +58,32 @@ static luaL_reg udp[] = { | |||
| 57 | {"sendto", meth_sendto}, | 58 | {"sendto", meth_sendto}, |
| 58 | {"setfd", meth_setfd}, | 59 | {"setfd", meth_setfd}, |
| 59 | {"setoption", meth_setoption}, | 60 | {"setoption", meth_setoption}, |
| 61 | {"getoption", meth_getoption}, | ||
| 60 | {"setpeername", meth_setpeername}, | 62 | {"setpeername", meth_setpeername}, |
| 61 | {"setsockname", meth_setsockname}, | 63 | {"setsockname", meth_setsockname}, |
| 62 | {"settimeout", meth_settimeout}, | 64 | {"settimeout", meth_settimeout}, |
| 63 | {NULL, NULL} | 65 | {NULL, NULL} |
| 64 | }; | 66 | }; |
| 65 | 67 | ||
| 66 | /* socket options */ | 68 | /* socket options for setoption */ |
| 67 | static t_opt opt[] = { | 69 | static t_opt optset[] = { |
| 68 | {"dontroute", opt_dontroute}, | 70 | {"dontroute", opt_set_dontroute}, |
| 69 | {"broadcast", opt_broadcast}, | 71 | {"broadcast", opt_set_broadcast}, |
| 70 | {"reuseaddr", opt_reuseaddr}, | 72 | {"reuseaddr", opt_set_reuseaddr}, |
| 71 | {"ip-multicast-ttl", opt_ip_multicast_ttl}, | 73 | {"reuseport", opt_set_reuseport}, |
| 72 | {"ip-multicast-loop", opt_ip_multicast_loop}, | 74 | {"ip-multicast-if", opt_set_ip_multicast_if}, |
| 73 | {"ip-add-membership", opt_ip_add_membership}, | 75 | {"ip-multicast-ttl", opt_set_ip_multicast_ttl}, |
| 74 | {"ip-drop-membership", opt_ip_drop_membersip}, | 76 | {"ip-multicast-loop", opt_set_ip_multicast_loop}, |
| 75 | {NULL, NULL} | 77 | {"ip-add-membership", opt_set_ip_add_membership}, |
| 78 | {"ip-drop-membership", opt_set_ip_drop_membersip}, | ||
| 79 | {NULL, NULL} | ||
| 80 | }; | ||
| 81 | |||
| 82 | /* socket options for getoption */ | ||
| 83 | static t_opt optget[] = { | ||
| 84 | {"ip-multicast-if", opt_get_ip_multicast_if}, | ||
| 85 | {"ip-multicast-loop", opt_get_ip_multicast_loop}, | ||
| 86 | {NULL, NULL} | ||
| 76 | }; | 87 | }; |
| 77 | 88 | ||
| 78 | /* functions in library namespace */ | 89 | /* functions in library namespace */ |
| @@ -247,7 +258,15 @@ static int meth_getsockname(lua_State *L) { | |||
| 247 | \*-------------------------------------------------------------------------*/ | 258 | \*-------------------------------------------------------------------------*/ |
| 248 | static int meth_setoption(lua_State *L) { | 259 | static int meth_setoption(lua_State *L) { |
| 249 | p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1); | 260 | p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1); |
| 250 | return opt_meth_setoption(L, opt, &udp->sock); | 261 | return opt_meth_setoption(L, optset, &udp->sock); |
| 262 | } | ||
| 263 | |||
| 264 | /*-------------------------------------------------------------------------*\ | ||
| 265 | * Just call option handler | ||
| 266 | \*-------------------------------------------------------------------------*/ | ||
| 267 | static int meth_getoption(lua_State *L) { | ||
| 268 | p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1); | ||
| 269 | return opt_meth_getoption(L, optget, &udp->sock); | ||
| 251 | } | 270 | } |
| 252 | 271 | ||
| 253 | /*-------------------------------------------------------------------------*\ | 272 | /*-------------------------------------------------------------------------*\ |
| @@ -11,8 +11,6 @@ | |||
| 11 | * originally unconnected. They can be "connected" to a given address | 11 | * originally unconnected. They can be "connected" to a given address |
| 12 | * with a call to the setpeername function. The same function can be used to | 12 | * with a call to the setpeername function. The same function can be used to |
| 13 | * break the connection. | 13 | * break the connection. |
| 14 | * | ||
| 15 | * RCS ID: $Id$ | ||
| 16 | \*=========================================================================*/ | 14 | \*=========================================================================*/ |
| 17 | #include "lua.h" | 15 | #include "lua.h" |
| 18 | 16 | ||
| @@ -63,10 +63,10 @@ static luaL_reg un[] = { | |||
| 63 | }; | 63 | }; |
| 64 | 64 | ||
| 65 | /* socket option handlers */ | 65 | /* socket option handlers */ |
| 66 | static t_opt opt[] = { | 66 | static t_opt optset[] = { |
| 67 | {"keepalive", opt_keepalive}, | 67 | {"keepalive", opt_set_keepalive}, |
| 68 | {"reuseaddr", opt_reuseaddr}, | 68 | {"reuseaddr", opt_set_reuseaddr}, |
| 69 | {"linger", opt_linger}, | 69 | {"linger", opt_set_linger}, |
| 70 | {NULL, NULL} | 70 | {NULL, NULL} |
| 71 | }; | 71 | }; |
| 72 | 72 | ||
| @@ -128,7 +128,7 @@ static int meth_setstats(lua_State *L) { | |||
| 128 | \*-------------------------------------------------------------------------*/ | 128 | \*-------------------------------------------------------------------------*/ |
| 129 | static int meth_setoption(lua_State *L) { | 129 | static int meth_setoption(lua_State *L) { |
| 130 | p_unix un = (p_unix) auxiliar_checkgroup(L, "unix{any}", 1); | 130 | p_unix un = (p_unix) auxiliar_checkgroup(L, "unix{any}", 1); |
| 131 | return opt_meth_setoption(L, opt, &un->sock); | 131 | return opt_meth_setoption(L, optset, &un->sock); |
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | /*-------------------------------------------------------------------------*\ | 134 | /*-------------------------------------------------------------------------*\ |
| @@ -6,8 +6,6 @@ | |||
| 6 | * | 6 | * |
| 7 | * This module is just an example of how to extend LuaSocket with a new | 7 | * This module is just an example of how to extend LuaSocket with a new |
| 8 | * domain. | 8 | * domain. |
| 9 | * | ||
| 10 | * RCS ID: $Id$ | ||
| 11 | \*=========================================================================*/ | 9 | \*=========================================================================*/ |
| 12 | #include "lua.h" | 10 | #include "lua.h" |
| 13 | 11 | ||
| @@ -23,6 +21,6 @@ typedef struct t_unix_ { | |||
| 23 | } t_unix; | 21 | } t_unix; |
| 24 | typedef t_unix *p_unix; | 22 | typedef t_unix *p_unix; |
| 25 | 23 | ||
| 26 | int luaopen_socketunix(lua_State *L); | 24 | int luaopen_socket_unix(lua_State *L); |
| 27 | 25 | ||
| 28 | #endif /* UNIX_H */ | 26 | #endif /* UNIX_H */ |
diff --git a/src/usocket.h b/src/usocket.h index e1f7498..75bfe82 100644 --- a/src/usocket.h +++ b/src/usocket.h | |||
| @@ -3,8 +3,6 @@ | |||
| 3 | /*=========================================================================*\ | 3 | /*=========================================================================*\ |
| 4 | * Socket compatibilization module for Unix | 4 | * Socket compatibilization module for Unix |
| 5 | * LuaSocket toolkit | 5 | * LuaSocket toolkit |
| 6 | * | ||
| 7 | * RCS ID: $Id$ | ||
| 8 | \*=========================================================================*/ | 6 | \*=========================================================================*/ |
| 9 | 7 | ||
| 10 | /*=========================================================================*\ | 8 | /*=========================================================================*\ |
| @@ -32,6 +30,10 @@ | |||
| 32 | /* TCP options (nagle algorithm disable) */ | 30 | /* TCP options (nagle algorithm disable) */ |
| 33 | #include <netinet/tcp.h> | 31 | #include <netinet/tcp.h> |
| 34 | 32 | ||
| 33 | #ifndef SO_REUSEPORT | ||
| 34 | #define SO_REUSEPORT SO_REUSEADDR | ||
| 35 | #endif | ||
| 36 | |||
| 35 | typedef int t_socket; | 37 | typedef int t_socket; |
| 36 | typedef t_socket *p_socket; | 38 | typedef t_socket *p_socket; |
| 37 | 39 | ||
diff --git a/src/wsocket.h b/src/wsocket.h index e4f0e92..8e0f114 100644 --- a/src/wsocket.h +++ b/src/wsocket.h | |||
| @@ -3,14 +3,13 @@ | |||
| 3 | /*=========================================================================*\ | 3 | /*=========================================================================*\ |
| 4 | * Socket compatibilization module for Win32 | 4 | * Socket compatibilization module for Win32 |
| 5 | * LuaSocket toolkit | 5 | * LuaSocket toolkit |
| 6 | * | ||
| 7 | * RCS ID: $Id$ | ||
| 8 | \*=========================================================================*/ | 6 | \*=========================================================================*/ |
| 9 | 7 | ||
| 10 | /*=========================================================================*\ | 8 | /*=========================================================================*\ |
| 11 | * WinSock include files | 9 | * WinSock include files |
| 12 | \*=========================================================================*/ | 10 | \*=========================================================================*/ |
| 13 | #include <winsock.h> | 11 | #include <winsock2.h> |
| 12 | #include <ws2tcpip.h> | ||
| 14 | 13 | ||
| 15 | typedef int socklen_t; | 14 | typedef int socklen_t; |
| 16 | typedef SOCKET t_socket; | 15 | typedef SOCKET t_socket; |
| @@ -18,4 +17,8 @@ typedef t_socket *p_socket; | |||
| 18 | 17 | ||
| 19 | #define SOCKET_INVALID (INVALID_SOCKET) | 18 | #define SOCKET_INVALID (INVALID_SOCKET) |
| 20 | 19 | ||
| 20 | #ifndef SO_REUSEPORT | ||
| 21 | #define SO_REUSEPORT SO_REUSEADDR | ||
| 22 | #endif | ||
| 23 | |||
| 21 | #endif /* WSOCKET_H */ | 24 | #endif /* WSOCKET_H */ |
