| 1 | /*=========================================================================*\ |
| 2 | * LuaSocket toolkit |
| 3 | * Networking support for the Lua language |
| 4 | * Diego Nehab |
| 5 | * 26/11/1999 |
| 6 | * |
| 7 | * This library is part of an effort to progressively increase the network |
| 8 | * connectivity of the Lua language. The Lua interface to networking |
| 9 | * functions follows the Sockets API closely, trying to simplify all tasks |
| 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 |
| 12 | * standard Lua read and write functions. |
| 13 | \*=========================================================================*/ |
| 14 | |
| 15 | /*=========================================================================*\ |
| 16 | * Standard include files |
| 17 | \*=========================================================================*/ |
| 18 | #include "lua.h" |
| 19 | #include "lauxlib.h" |
| 20 | #include "compat.h" |
| 21 | |
| 22 | /*=========================================================================*\ |
| 23 | * LuaSocket includes |
| 24 | \*=========================================================================*/ |
| 25 | #include "luasocket.h" |
| 26 | #include "auxiliar.h" |
| 27 | #include "except.h" |
| 28 | #include "timeout.h" |
| 29 | #include "buffer.h" |
| 30 | #include "inet.h" |
| 31 | #include "tcp.h" |
| 32 | #include "udp.h" |
| 33 | #include "select.h" |
| 34 | |
| 35 | /*-------------------------------------------------------------------------*\ |
| 36 | * Internal function prototypes |
| 37 | \*-------------------------------------------------------------------------*/ |
| 38 | static int global_skip(lua_State *L); |
| 39 | static int global_unload(lua_State *L); |
| 40 | static int base_open(lua_State *L); |
| 41 | |
| 42 | /*-------------------------------------------------------------------------*\ |
| 43 | * Modules and functions |
| 44 | \*-------------------------------------------------------------------------*/ |
| 45 | static const luaL_Reg mod[] = { |
| 46 | {"auxiliar" , auxiliar_open}, |
| 47 | {"except" , except_open}, |
| 48 | {"timeout" , timeout_open}, |
| 49 | {"buffer" , buffer_open}, |
| 50 | {"inet" , inet_open}, |
| 51 | {"tcp" , tcp_open}, |
| 52 | {"udp" , udp_open}, |
| 53 | {"select" , select_open}, |
| 54 | {NULL, NULL} |
| 55 | }; |
| 56 | |
| 57 | static luaL_Reg func[] = { |
| 58 | {"skip" , global_skip}, |
| 59 | {"__unload" , global_unload}, |
| 60 | {NULL, NULL} |
| 61 | }; |
| 62 | |
| 63 | /*-------------------------------------------------------------------------*\ |
| 64 | * Skip a few arguments |
| 65 | \*-------------------------------------------------------------------------*/ |
| 66 | static int global_skip(lua_State *L) { |
| 67 | int amount = luaL_checkinteger(L, 1); |
| 68 | int ret = lua_gettop(L) - amount - 1; |
| 69 | return ret >= 0 ? ret : 0; |
| 70 | } |
| 71 | |
| 72 | /*-------------------------------------------------------------------------*\ |
| 73 | * Unloads the library |
| 74 | \*-------------------------------------------------------------------------*/ |
| 75 | static int global_unload(lua_State *L) { |
| 76 | (void) L; |
| 77 | socket_close(); |
| 78 | return 0; |
| 79 | } |
| 80 | |
| 81 | /*-------------------------------------------------------------------------*\ |
| 82 | * Setup basic stuff. |
| 83 | \*-------------------------------------------------------------------------*/ |
| 84 | static int base_open(lua_State *L) { |
| 85 | if (socket_open()) { |
| 86 | /* export functions (and leave namespace table on top of stack) */ |
| 87 | lua_newtable(L); |
| 88 | luaL_setfuncs(L, func, 0); |
| 89 | #ifdef LUASOCKET_DEBUG |
| 90 | lua_pushstring(L, "_DEBUG" ); |
| 91 | lua_pushboolean(L, 1); |
| 92 | lua_rawset(L, -3); |
| 93 | #endif |
| 94 | /* make version string available to scripts */ |
| 95 | lua_pushstring(L, "_VERSION" ); |
| 96 | lua_pushstring(L, LUASOCKET_VERSION); |
| 97 | lua_rawset(L, -3); |
| 98 | return 1; |
| 99 | } else { |
| 100 | lua_pushstring(L, "unable to initialize library" ); |
| 101 | lua_error(L); |
| 102 | return 0; |
| 103 | } |
| 104 | } |
| 105 | |
| 106 | /*-------------------------------------------------------------------------*\ |
| 107 | * Initializes all library modules. |
| 108 | \*-------------------------------------------------------------------------*/ |
| 109 | LUASOCKET_API int luaopen_socket_core(lua_State *L) { |
| 110 | int i; |
| 111 | base_open(L); |
| 112 | for (i = 0; mod[i].name; i++) mod[i].func(L); |
| 113 | return 1; |
| 114 | } |
| 115 | |