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 \*-------------------------------------------------------------------------*/
global_skip(lua_State * L)66 static int global_skip(lua_State *L) {
67     int amount = (int) 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 \*-------------------------------------------------------------------------*/
global_unload(lua_State * L)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 \*-------------------------------------------------------------------------*/
base_open(lua_State * L)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 \*-------------------------------------------------------------------------*/
luaopen_socket_core(lua_State * L)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