131 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			131 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | /*=========================================================================*\
 | ||
|  | * LuaSocket toolkit | ||
|  | * Networking support for the Lua language | ||
|  | * Diego Nehab | ||
|  | * 26/11/1999 | ||
|  | * | ||
|  | * This library is part of an  effort to progressively increase the network | ||
|  | * connectivity  of  the Lua  language.  The  Lua interface  to  networking | ||
|  | * functions follows the Sockets API  closely, trying to simplify all tasks | ||
|  | * 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. | ||
|  | \*=========================================================================*/ | ||
|  | 
 | ||
|  | /*=========================================================================*\
 | ||
|  | * Standard include files | ||
|  | \*=========================================================================*/ | ||
|  | #include "lua.h"
 | ||
|  | #include "lauxlib.h"
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*=========================================================================*\
 | ||
|  | * LuaSocket includes | ||
|  | \*=========================================================================*/ | ||
|  | #include "luasocket.h"
 | ||
|  | #include "auxiliar.h"
 | ||
|  | #include "except.h"
 | ||
|  | #include "timeout.h"
 | ||
|  | #include "buffer.h"
 | ||
|  | #include "inet.h"
 | ||
|  | #include "tcp.h"
 | ||
|  | #include "udp.h"
 | ||
|  | #include "select.h"
 | ||
|  | 
 | ||
|  | namespace NS_SLUA {     | ||
|  | 
 | ||
|  | /*-------------------------------------------------------------------------*\
 | ||
|  | * Internal function prototypes | ||
|  | \*-------------------------------------------------------------------------*/ | ||
|  | static int global_skip(lua_State *L); | ||
|  | static int global_unload(lua_State *L); | ||
|  | static int base_open(lua_State *L); | ||
|  | 
 | ||
|  | /*-------------------------------------------------------------------------*\
 | ||
|  | * Modules and functions | ||
|  | \*-------------------------------------------------------------------------*/ | ||
|  | static const luaL_Reg luasocket_mod[] = { | ||
|  |     {"auxiliar", auxiliar_open}, | ||
|  |     {"except", except_open}, | ||
|  |     {"timeout", timeout_open}, | ||
|  |     {"buffer", buffer_open}, | ||
|  |     {"inet", inet_open}, | ||
|  |     {"tcp", tcp_open}, | ||
|  |     {"udp", udp_open}, | ||
|  |     {"select", select_open}, | ||
|  |     {NULL, NULL} | ||
|  | }; | ||
|  | 
 | ||
|  | static luaL_Reg luasocket_func[] = { | ||
|  |     {"skip",      global_skip}, | ||
|  |     {"__unload",  global_unload}, | ||
|  |     {NULL,        NULL} | ||
|  | }; | ||
|  | 
 | ||
|  | /*-------------------------------------------------------------------------*\
 | ||
|  | * Skip a few arguments | ||
|  | \*-------------------------------------------------------------------------*/ | ||
|  | static int global_skip(lua_State *L) { | ||
|  |     int amount = luaL_checkinteger(L, 1); | ||
|  |     int ret = lua_gettop(L) - amount - 1; | ||
|  |     return ret >= 0 ? ret : 0; | ||
|  | } | ||
|  | 
 | ||
|  | /*-------------------------------------------------------------------------*\
 | ||
|  | * Unloads the library | ||
|  | \*-------------------------------------------------------------------------*/ | ||
|  | static int global_unload(lua_State *L) { | ||
|  |     (void) L; | ||
|  |     socket_close(); | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | #if LUA_VERSION_NUM > 501
 | ||
|  | int luaL_typerror (lua_State *L, int narg, const char *tname) { | ||
|  |   const char *msg = lua_pushfstring(L, "%s expected, got %s", | ||
|  |                                     tname, luaL_typename(L, narg)); | ||
|  |   return luaL_argerror(L, narg, msg); | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | /*-------------------------------------------------------------------------*\
 | ||
|  | * Setup basic stuff. | ||
|  | \*-------------------------------------------------------------------------*/ | ||
|  | static int base_open(lua_State *L) { | ||
|  |     if (socket_open()) { | ||
|  |         /* export functions (and leave namespace table on top of stack) */ | ||
|  | #if LUA_VERSION_NUM > 501 && !defined(LUA_COMPAT_MODULE)
 | ||
|  |         lua_newtable(L); | ||
|  |         luaL_setfuncs(L, luasocket_func, 0); | ||
|  | #else
 | ||
|  |         luaL_openlib(L, "socket", luasocket_func, 0); | ||
|  | #endif
 | ||
|  | #ifdef LUASOCKET_DEBUG
 | ||
|  |         lua_pushstring(L, "_DEBUG"); | ||
|  |         lua_pushboolean(L, 1); | ||
|  |         lua_rawset(L, -3); | ||
|  | #endif
 | ||
|  |         /* make version string available to scripts */ | ||
|  |         lua_pushstring(L, "_VERSION"); | ||
|  |         lua_pushstring(L, LUASOCKET_VERSION); | ||
|  |         lua_rawset(L, -3); | ||
|  |         return 1; | ||
|  |     } else { | ||
|  |         lua_pushstring(L, "unable to initialize library"); | ||
|  |         lua_error(L); | ||
|  |         return 0; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | /*-------------------------------------------------------------------------*\
 | ||
|  | * Initializes all library modules. | ||
|  | \*-------------------------------------------------------------------------*/ | ||
|  | LUASOCKET_API int luaopen_socket_core(lua_State *L) { | ||
|  |     int i; | ||
|  |     base_open(L); | ||
|  |     for (i = 0; luasocket_mod[i].name; i++) luasocket_mod[i].func(L); | ||
|  |     return 1; | ||
|  | } | ||
|  | 
 | ||
|  | } // end NS_SLUA
 |