immunio 0.15.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (157) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +234 -0
  3. data/README.md +147 -0
  4. data/bin/immunio +5 -0
  5. data/lib/immunio.rb +29 -0
  6. data/lib/immunio/agent.rb +260 -0
  7. data/lib/immunio/authentication.rb +96 -0
  8. data/lib/immunio/blocked_app.rb +38 -0
  9. data/lib/immunio/channel.rb +432 -0
  10. data/lib/immunio/cli.rb +39 -0
  11. data/lib/immunio/context.rb +114 -0
  12. data/lib/immunio/errors.rb +43 -0
  13. data/lib/immunio/immunio_ca.crt +45 -0
  14. data/lib/immunio/logger.rb +87 -0
  15. data/lib/immunio/plugins/action_dispatch.rb +45 -0
  16. data/lib/immunio/plugins/action_view.rb +431 -0
  17. data/lib/immunio/plugins/active_record.rb +707 -0
  18. data/lib/immunio/plugins/active_record_relation.rb +370 -0
  19. data/lib/immunio/plugins/authlogic.rb +80 -0
  20. data/lib/immunio/plugins/csrf.rb +24 -0
  21. data/lib/immunio/plugins/devise.rb +40 -0
  22. data/lib/immunio/plugins/environment_reporter.rb +69 -0
  23. data/lib/immunio/plugins/eval.rb +51 -0
  24. data/lib/immunio/plugins/exception_handler.rb +55 -0
  25. data/lib/immunio/plugins/gems_tracker.rb +5 -0
  26. data/lib/immunio/plugins/haml.rb +36 -0
  27. data/lib/immunio/plugins/http_finisher.rb +50 -0
  28. data/lib/immunio/plugins/http_tracker.rb +203 -0
  29. data/lib/immunio/plugins/io.rb +96 -0
  30. data/lib/immunio/plugins/redirect.rb +42 -0
  31. data/lib/immunio/plugins/warden.rb +66 -0
  32. data/lib/immunio/processor.rb +234 -0
  33. data/lib/immunio/rails.rb +26 -0
  34. data/lib/immunio/request.rb +139 -0
  35. data/lib/immunio/rufus_lua_ext/ref.rb +27 -0
  36. data/lib/immunio/rufus_lua_ext/state.rb +157 -0
  37. data/lib/immunio/rufus_lua_ext/table.rb +137 -0
  38. data/lib/immunio/rufus_lua_ext/utils.rb +13 -0
  39. data/lib/immunio/version.rb +5 -0
  40. data/lib/immunio/vm.rb +291 -0
  41. data/lua-hooks/ext/all.c +78 -0
  42. data/lua-hooks/ext/bitop/README +22 -0
  43. data/lua-hooks/ext/bitop/bit.c +189 -0
  44. data/lua-hooks/ext/extconf.rb +38 -0
  45. data/lua-hooks/ext/libinjection/COPYING +37 -0
  46. data/lua-hooks/ext/libinjection/libinjection.h +65 -0
  47. data/lua-hooks/ext/libinjection/libinjection_html5.c +847 -0
  48. data/lua-hooks/ext/libinjection/libinjection_html5.h +54 -0
  49. data/lua-hooks/ext/libinjection/libinjection_sqli.c +2301 -0
  50. data/lua-hooks/ext/libinjection/libinjection_sqli.h +295 -0
  51. data/lua-hooks/ext/libinjection/libinjection_sqli_data.h +9349 -0
  52. data/lua-hooks/ext/libinjection/libinjection_xss.c +531 -0
  53. data/lua-hooks/ext/libinjection/libinjection_xss.h +21 -0
  54. data/lua-hooks/ext/libinjection/lualib.c +109 -0
  55. data/lua-hooks/ext/lpeg/HISTORY +90 -0
  56. data/lua-hooks/ext/lpeg/lpcap.c +537 -0
  57. data/lua-hooks/ext/lpeg/lpcap.h +43 -0
  58. data/lua-hooks/ext/lpeg/lpcode.c +986 -0
  59. data/lua-hooks/ext/lpeg/lpcode.h +34 -0
  60. data/lua-hooks/ext/lpeg/lpeg-128.gif +0 -0
  61. data/lua-hooks/ext/lpeg/lpeg.html +1429 -0
  62. data/lua-hooks/ext/lpeg/lpprint.c +244 -0
  63. data/lua-hooks/ext/lpeg/lpprint.h +35 -0
  64. data/lua-hooks/ext/lpeg/lptree.c +1238 -0
  65. data/lua-hooks/ext/lpeg/lptree.h +77 -0
  66. data/lua-hooks/ext/lpeg/lptypes.h +149 -0
  67. data/lua-hooks/ext/lpeg/lpvm.c +355 -0
  68. data/lua-hooks/ext/lpeg/lpvm.h +58 -0
  69. data/lua-hooks/ext/lpeg/makefile +55 -0
  70. data/lua-hooks/ext/lpeg/re.html +498 -0
  71. data/lua-hooks/ext/lpeg/test.lua +1409 -0
  72. data/lua-hooks/ext/lua-cmsgpack/CMakeLists.txt +45 -0
  73. data/lua-hooks/ext/lua-cmsgpack/README.md +115 -0
  74. data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +957 -0
  75. data/lua-hooks/ext/lua-cmsgpack/test.lua +570 -0
  76. data/lua-hooks/ext/lua-snapshot/LICENSE +7 -0
  77. data/lua-hooks/ext/lua-snapshot/Makefile +12 -0
  78. data/lua-hooks/ext/lua-snapshot/README.md +18 -0
  79. data/lua-hooks/ext/lua-snapshot/dump.lua +15 -0
  80. data/lua-hooks/ext/lua-snapshot/snapshot.c +455 -0
  81. data/lua-hooks/ext/lua/COPYRIGHT +34 -0
  82. data/lua-hooks/ext/lua/lapi.c +1087 -0
  83. data/lua-hooks/ext/lua/lapi.h +16 -0
  84. data/lua-hooks/ext/lua/lauxlib.c +652 -0
  85. data/lua-hooks/ext/lua/lauxlib.h +174 -0
  86. data/lua-hooks/ext/lua/lbaselib.c +659 -0
  87. data/lua-hooks/ext/lua/lcode.c +831 -0
  88. data/lua-hooks/ext/lua/lcode.h +76 -0
  89. data/lua-hooks/ext/lua/ldblib.c +398 -0
  90. data/lua-hooks/ext/lua/ldebug.c +638 -0
  91. data/lua-hooks/ext/lua/ldebug.h +33 -0
  92. data/lua-hooks/ext/lua/ldo.c +519 -0
  93. data/lua-hooks/ext/lua/ldo.h +57 -0
  94. data/lua-hooks/ext/lua/ldump.c +164 -0
  95. data/lua-hooks/ext/lua/lfunc.c +174 -0
  96. data/lua-hooks/ext/lua/lfunc.h +34 -0
  97. data/lua-hooks/ext/lua/lgc.c +710 -0
  98. data/lua-hooks/ext/lua/lgc.h +110 -0
  99. data/lua-hooks/ext/lua/linit.c +38 -0
  100. data/lua-hooks/ext/lua/liolib.c +556 -0
  101. data/lua-hooks/ext/lua/llex.c +463 -0
  102. data/lua-hooks/ext/lua/llex.h +81 -0
  103. data/lua-hooks/ext/lua/llimits.h +128 -0
  104. data/lua-hooks/ext/lua/lmathlib.c +263 -0
  105. data/lua-hooks/ext/lua/lmem.c +86 -0
  106. data/lua-hooks/ext/lua/lmem.h +49 -0
  107. data/lua-hooks/ext/lua/loadlib.c +705 -0
  108. data/lua-hooks/ext/lua/loadlib_rel.c +760 -0
  109. data/lua-hooks/ext/lua/lobject.c +214 -0
  110. data/lua-hooks/ext/lua/lobject.h +381 -0
  111. data/lua-hooks/ext/lua/lopcodes.c +102 -0
  112. data/lua-hooks/ext/lua/lopcodes.h +268 -0
  113. data/lua-hooks/ext/lua/loslib.c +243 -0
  114. data/lua-hooks/ext/lua/lparser.c +1339 -0
  115. data/lua-hooks/ext/lua/lparser.h +82 -0
  116. data/lua-hooks/ext/lua/lstate.c +214 -0
  117. data/lua-hooks/ext/lua/lstate.h +169 -0
  118. data/lua-hooks/ext/lua/lstring.c +111 -0
  119. data/lua-hooks/ext/lua/lstring.h +31 -0
  120. data/lua-hooks/ext/lua/lstrlib.c +871 -0
  121. data/lua-hooks/ext/lua/ltable.c +588 -0
  122. data/lua-hooks/ext/lua/ltable.h +40 -0
  123. data/lua-hooks/ext/lua/ltablib.c +287 -0
  124. data/lua-hooks/ext/lua/ltm.c +75 -0
  125. data/lua-hooks/ext/lua/ltm.h +54 -0
  126. data/lua-hooks/ext/lua/lua.c +392 -0
  127. data/lua-hooks/ext/lua/lua.def +131 -0
  128. data/lua-hooks/ext/lua/lua.h +388 -0
  129. data/lua-hooks/ext/lua/lua.rc +28 -0
  130. data/lua-hooks/ext/lua/lua_dll.rc +26 -0
  131. data/lua-hooks/ext/lua/luac.c +200 -0
  132. data/lua-hooks/ext/lua/luac.rc +1 -0
  133. data/lua-hooks/ext/lua/luaconf.h +763 -0
  134. data/lua-hooks/ext/lua/luaconf.h.in +724 -0
  135. data/lua-hooks/ext/lua/luaconf.h.orig +763 -0
  136. data/lua-hooks/ext/lua/lualib.h +53 -0
  137. data/lua-hooks/ext/lua/lundump.c +227 -0
  138. data/lua-hooks/ext/lua/lundump.h +36 -0
  139. data/lua-hooks/ext/lua/lvm.c +767 -0
  140. data/lua-hooks/ext/lua/lvm.h +36 -0
  141. data/lua-hooks/ext/lua/lzio.c +82 -0
  142. data/lua-hooks/ext/lua/lzio.h +67 -0
  143. data/lua-hooks/ext/lua/print.c +227 -0
  144. data/lua-hooks/ext/luautf8/README.md +152 -0
  145. data/lua-hooks/ext/luautf8/lutf8lib.c +1274 -0
  146. data/lua-hooks/ext/luautf8/unidata.h +3064 -0
  147. data/lua-hooks/lib/boot.lua +254 -0
  148. data/lua-hooks/lib/encode.lua +4 -0
  149. data/lua-hooks/lib/lexers/LICENSE +21 -0
  150. data/lua-hooks/lib/lexers/bash.lua +134 -0
  151. data/lua-hooks/lib/lexers/bash_dqstr.lua +62 -0
  152. data/lua-hooks/lib/lexers/css.lua +216 -0
  153. data/lua-hooks/lib/lexers/html.lua +106 -0
  154. data/lua-hooks/lib/lexers/javascript.lua +68 -0
  155. data/lua-hooks/lib/lexers/lexer.lua +1575 -0
  156. data/lua-hooks/lib/lexers/markers.lua +33 -0
  157. metadata +308 -0
@@ -0,0 +1,86 @@
1
+ /*
2
+ ** $Id: lmem.c,v 1.70.1.1 2007/12/27 13:02:25 roberto Exp $
3
+ ** Interface to Memory Manager
4
+ ** See Copyright Notice in lua.h
5
+ */
6
+
7
+
8
+ #include <stddef.h>
9
+
10
+ #define lmem_c
11
+ #define LUA_CORE
12
+
13
+ #include "lua.h"
14
+
15
+ #include "ldebug.h"
16
+ #include "ldo.h"
17
+ #include "lmem.h"
18
+ #include "lobject.h"
19
+ #include "lstate.h"
20
+
21
+
22
+
23
+ /*
24
+ ** About the realloc function:
25
+ ** void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize);
26
+ ** (`osize' is the old size, `nsize' is the new size)
27
+ **
28
+ ** Lua ensures that (ptr == NULL) iff (osize == 0).
29
+ **
30
+ ** * frealloc(ud, NULL, 0, x) creates a new block of size `x'
31
+ **
32
+ ** * frealloc(ud, p, x, 0) frees the block `p'
33
+ ** (in this specific case, frealloc must return NULL).
34
+ ** particularly, frealloc(ud, NULL, 0, 0) does nothing
35
+ ** (which is equivalent to free(NULL) in ANSI C)
36
+ **
37
+ ** frealloc returns NULL if it cannot create or reallocate the area
38
+ ** (any reallocation to an equal or smaller size cannot fail!)
39
+ */
40
+
41
+
42
+
43
+ #define MINSIZEARRAY 4
44
+
45
+
46
+ void *luaM_growaux_ (lua_State *L, void *block, int *size, size_t size_elems,
47
+ int limit, const char *errormsg) {
48
+ void *newblock;
49
+ int newsize;
50
+ if (*size >= limit/2) { /* cannot double it? */
51
+ if (*size >= limit) /* cannot grow even a little? */
52
+ luaG_runerror(L, errormsg);
53
+ newsize = limit; /* still have at least one free place */
54
+ }
55
+ else {
56
+ newsize = (*size)*2;
57
+ if (newsize < MINSIZEARRAY)
58
+ newsize = MINSIZEARRAY; /* minimum size */
59
+ }
60
+ newblock = luaM_reallocv(L, block, *size, newsize, size_elems);
61
+ *size = newsize; /* update only when everything else is OK */
62
+ return newblock;
63
+ }
64
+
65
+
66
+ void *luaM_toobig (lua_State *L) {
67
+ luaG_runerror(L, "memory allocation error: block too big");
68
+ return NULL; /* to avoid warnings */
69
+ }
70
+
71
+
72
+
73
+ /*
74
+ ** generic allocation routine.
75
+ */
76
+ void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) {
77
+ global_State *g = G(L);
78
+ lua_assert((osize == 0) == (block == NULL));
79
+ block = (*g->frealloc)(g->ud, block, osize, nsize);
80
+ if (block == NULL && nsize > 0)
81
+ luaD_throw(L, LUA_ERRMEM);
82
+ lua_assert((nsize == 0) == (block == NULL));
83
+ g->totalbytes = (g->totalbytes - osize) + nsize;
84
+ return block;
85
+ }
86
+
@@ -0,0 +1,49 @@
1
+ /*
2
+ ** $Id: lmem.h,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $
3
+ ** Interface to Memory Manager
4
+ ** See Copyright Notice in lua.h
5
+ */
6
+
7
+ #ifndef lmem_h
8
+ #define lmem_h
9
+
10
+
11
+ #include <stddef.h>
12
+
13
+ #include "llimits.h"
14
+ #include "lua.h"
15
+
16
+ #define MEMERRMSG "not enough memory"
17
+
18
+
19
+ #define luaM_reallocv(L,b,on,n,e) \
20
+ ((cast(size_t, (n)+1) <= MAX_SIZET/(e)) ? /* +1 to avoid warnings */ \
21
+ luaM_realloc_(L, (b), (on)*(e), (n)*(e)) : \
22
+ luaM_toobig(L))
23
+
24
+ #define luaM_freemem(L, b, s) luaM_realloc_(L, (b), (s), 0)
25
+ #define luaM_free(L, b) luaM_realloc_(L, (b), sizeof(*(b)), 0)
26
+ #define luaM_freearray(L, b, n, t) luaM_reallocv(L, (b), n, 0, sizeof(t))
27
+
28
+ #define luaM_malloc(L,t) luaM_realloc_(L, NULL, 0, (t))
29
+ #define luaM_new(L,t) cast(t *, luaM_malloc(L, sizeof(t)))
30
+ #define luaM_newvector(L,n,t) \
31
+ cast(t *, luaM_reallocv(L, NULL, 0, n, sizeof(t)))
32
+
33
+ #define luaM_growvector(L,v,nelems,size,t,limit,e) \
34
+ if ((nelems)+1 > (size)) \
35
+ ((v)=cast(t *, luaM_growaux_(L,v,&(size),sizeof(t),limit,e)))
36
+
37
+ #define luaM_reallocvector(L, v,oldn,n,t) \
38
+ ((v)=cast(t *, luaM_reallocv(L, v, oldn, n, sizeof(t))))
39
+
40
+
41
+ LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize,
42
+ size_t size);
43
+ LUAI_FUNC void *luaM_toobig (lua_State *L);
44
+ LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int *size,
45
+ size_t size_elem, int limit,
46
+ const char *errormsg);
47
+
48
+ #endif
49
+
@@ -0,0 +1,705 @@
1
+ /*
2
+ ** $Id: loadlib.c,v 1.52.1.4 2009/09/09 13:17:16 roberto Exp $
3
+ ** Dynamic library loader for Lua
4
+ ** See Copyright Notice in lua.h
5
+ **
6
+ ** This module contains an implementation of loadlib for Unix systems
7
+ ** that have dlfcn, an implementation for Darwin (Mac OS X), an
8
+ ** implementation for Windows, and a stub for other systems.
9
+ */
10
+
11
+
12
+ #include <stdlib.h>
13
+ #include <string.h>
14
+
15
+
16
+ #define loadlib_c
17
+ #define LUA_LIB
18
+
19
+ #include "lua.h"
20
+
21
+ #include "lauxlib.h"
22
+ #include "lualib.h"
23
+
24
+
25
+ /* prefix for open functions in C libraries */
26
+ #define LUA_POF "luaopen_"
27
+
28
+ /* separator for open functions in C libraries */
29
+ #define LUA_OFSEP "_"
30
+
31
+
32
+ #define LIBPREFIX "LOADLIB: "
33
+
34
+ #define POF LUA_POF
35
+ #define LIB_FAIL "open"
36
+
37
+
38
+ /* error codes for ll_loadfunc */
39
+ #define ERRLIB 1
40
+ #define ERRFUNC 2
41
+
42
+ #define setprogdir(L) ((void)0)
43
+
44
+
45
+ static void ll_unloadlib (void *lib);
46
+ static void *ll_load (lua_State *L, const char *path);
47
+ static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym);
48
+
49
+
50
+
51
+ #if defined(LUA_DL_DLOPEN)
52
+ /*
53
+ ** {========================================================================
54
+ ** This is an implementation of loadlib based on the dlfcn interface.
55
+ ** The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD,
56
+ ** NetBSD, AIX 4.2, HPUX 11, and probably most other Unix flavors, at least
57
+ ** as an emulation layer on top of native functions.
58
+ ** =========================================================================
59
+ */
60
+
61
+ #include <dlfcn.h>
62
+
63
+ static void ll_unloadlib (void *lib) {
64
+ dlclose(lib);
65
+ }
66
+
67
+
68
+ static void *ll_load (lua_State *L, const char *path) {
69
+ void *lib = dlopen(path, RTLD_NOW);
70
+ if (lib == NULL) lua_pushstring(L, dlerror());
71
+ return lib;
72
+ }
73
+
74
+
75
+ static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {
76
+ lua_CFunction f = (lua_CFunction)dlsym(lib, sym);
77
+ if (f == NULL) lua_pushstring(L, dlerror());
78
+ return f;
79
+ }
80
+
81
+ /* }====================================================== */
82
+
83
+
84
+
85
+ #elif defined(LUA_DL_DLL)
86
+ /*
87
+ ** {======================================================================
88
+ ** This is an implementation of loadlib for Windows using native functions.
89
+ ** =======================================================================
90
+ */
91
+
92
+ #include <windows.h>
93
+
94
+
95
+ #undef setprogdir
96
+
97
+ static void setprogdir (lua_State *L) {
98
+ char buff[MAX_PATH + 1];
99
+ char *lb;
100
+ DWORD nsize = sizeof(buff)/sizeof(char);
101
+ DWORD n = GetModuleFileNameA(NULL, buff, nsize);
102
+ if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL)
103
+ luaL_error(L, "unable to get ModuleFileName");
104
+ else {
105
+ *lb = '\0';
106
+ luaL_gsub(L, lua_tostring(L, -1), LUA_EXECDIR, buff);
107
+ lua_remove(L, -2); /* remove original string */
108
+ }
109
+ }
110
+
111
+
112
+ static void pusherror (lua_State *L) {
113
+ int error = GetLastError();
114
+ char buffer[128];
115
+ if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,
116
+ NULL, error, 0, buffer, sizeof(buffer), NULL))
117
+ lua_pushstring(L, buffer);
118
+ else
119
+ lua_pushfstring(L, "system error %d\n", error);
120
+ }
121
+
122
+ static void ll_unloadlib (void *lib) {
123
+ FreeLibrary((HINSTANCE)lib);
124
+ }
125
+
126
+
127
+ static void *ll_load (lua_State *L, const char *path) {
128
+ HINSTANCE lib = LoadLibraryA(path);
129
+ if (lib == NULL) pusherror(L);
130
+ return lib;
131
+ }
132
+
133
+
134
+ static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {
135
+ lua_CFunction f = (lua_CFunction)GetProcAddress((HINSTANCE)lib, sym);
136
+ if (f == NULL) pusherror(L);
137
+ return f;
138
+ }
139
+
140
+ /* }====================================================== */
141
+
142
+
143
+
144
+ #elif defined(LUA_DL_DYLD)
145
+ /*
146
+ ** {======================================================================
147
+ ** Native Mac OS X / Darwin Implementation
148
+ ** =======================================================================
149
+ */
150
+
151
+ #include <mach-o/dyld.h>
152
+
153
+
154
+ /* Mac appends a `_' before C function names */
155
+ #undef POF
156
+ #define POF "_" LUA_POF
157
+
158
+
159
+ static void pusherror (lua_State *L) {
160
+ const char *err_str;
161
+ const char *err_file;
162
+ NSLinkEditErrors err;
163
+ int err_num;
164
+ NSLinkEditError(&err, &err_num, &err_file, &err_str);
165
+ lua_pushstring(L, err_str);
166
+ }
167
+
168
+
169
+ static const char *errorfromcode (NSObjectFileImageReturnCode ret) {
170
+ switch (ret) {
171
+ case NSObjectFileImageInappropriateFile:
172
+ return "file is not a bundle";
173
+ case NSObjectFileImageArch:
174
+ return "library is for wrong CPU type";
175
+ case NSObjectFileImageFormat:
176
+ return "bad format";
177
+ case NSObjectFileImageAccess:
178
+ return "cannot access file";
179
+ case NSObjectFileImageFailure:
180
+ default:
181
+ return "unable to load library";
182
+ }
183
+ }
184
+
185
+
186
+ static void ll_unloadlib (void *lib) {
187
+ NSUnLinkModule((NSModule)lib, NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES);
188
+ }
189
+
190
+
191
+ static void *ll_load (lua_State *L, const char *path) {
192
+ NSObjectFileImage img;
193
+ NSObjectFileImageReturnCode ret;
194
+ /* this would be a rare case, but prevents crashing if it happens */
195
+ if(!_dyld_present()) {
196
+ lua_pushliteral(L, "dyld not present");
197
+ return NULL;
198
+ }
199
+ ret = NSCreateObjectFileImageFromFile(path, &img);
200
+ if (ret == NSObjectFileImageSuccess) {
201
+ NSModule mod = NSLinkModule(img, path, NSLINKMODULE_OPTION_PRIVATE |
202
+ NSLINKMODULE_OPTION_RETURN_ON_ERROR);
203
+ NSDestroyObjectFileImage(img);
204
+ if (mod == NULL) pusherror(L);
205
+ return mod;
206
+ }
207
+ lua_pushstring(L, errorfromcode(ret));
208
+ return NULL;
209
+ }
210
+
211
+
212
+ static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {
213
+ NSSymbol nss = NSLookupSymbolInModule((NSModule)lib, sym);
214
+ if (nss == NULL) {
215
+ lua_pushfstring(L, "symbol " LUA_QS " not found", sym);
216
+ return NULL;
217
+ }
218
+ return (lua_CFunction)NSAddressOfSymbol(nss);
219
+ }
220
+
221
+ /* }====================================================== */
222
+
223
+
224
+
225
+ #else
226
+ /*
227
+ ** {======================================================
228
+ ** Fallback for other systems
229
+ ** =======================================================
230
+ */
231
+
232
+ #undef LIB_FAIL
233
+ #define LIB_FAIL "absent"
234
+
235
+
236
+ #define DLMSG "dynamic libraries not enabled; check your Lua installation"
237
+
238
+
239
+ static void ll_unloadlib (void *lib) {
240
+ (void)lib; /* to avoid warnings */
241
+ }
242
+
243
+
244
+ static void *ll_load (lua_State *L, const char *path) {
245
+ (void)path; /* to avoid warnings */
246
+ lua_pushliteral(L, DLMSG);
247
+ return NULL;
248
+ }
249
+
250
+
251
+ static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {
252
+ (void)lib; (void)sym; /* to avoid warnings */
253
+ lua_pushliteral(L, DLMSG);
254
+ return NULL;
255
+ }
256
+
257
+ /* }====================================================== */
258
+ #endif
259
+
260
+
261
+
262
+ static void **ll_register (lua_State *L, const char *path) {
263
+ void **plib;
264
+ lua_pushfstring(L, "%s%s", LIBPREFIX, path);
265
+ lua_gettable(L, LUA_REGISTRYINDEX); /* check library in registry? */
266
+ if (!lua_isnil(L, -1)) /* is there an entry? */
267
+ plib = (void **)lua_touserdata(L, -1);
268
+ else { /* no entry yet; create one */
269
+ lua_pop(L, 1);
270
+ plib = (void **)lua_newuserdata(L, sizeof(const void *));
271
+ *plib = NULL;
272
+ luaL_getmetatable(L, "_LOADLIB");
273
+ lua_setmetatable(L, -2);
274
+ lua_pushfstring(L, "%s%s", LIBPREFIX, path);
275
+ lua_pushvalue(L, -2);
276
+ lua_settable(L, LUA_REGISTRYINDEX);
277
+ }
278
+ return plib;
279
+ }
280
+
281
+
282
+ /*
283
+ ** __gc tag method: calls library's `ll_unloadlib' function with the lib
284
+ ** handle
285
+ */
286
+ static int gctm (lua_State *L) {
287
+ void **lib = (void **)luaL_checkudata(L, 1, "_LOADLIB");
288
+ if (*lib) ll_unloadlib(*lib);
289
+ *lib = NULL; /* mark library as closed */
290
+ return 0;
291
+ }
292
+
293
+
294
+ static int ll_loadfunc (lua_State *L, const char *path, const char *sym) {
295
+ void **reg = ll_register(L, path);
296
+ if (*reg == NULL) *reg = ll_load(L, path);
297
+ if (*reg == NULL)
298
+ return ERRLIB; /* unable to load library */
299
+ else {
300
+ lua_CFunction f = ll_sym(L, *reg, sym);
301
+ if (f == NULL)
302
+ return ERRFUNC; /* unable to find function */
303
+ lua_pushcfunction(L, f);
304
+ return 0; /* return function */
305
+ }
306
+ }
307
+
308
+
309
+ static int ll_loadlib (lua_State *L) {
310
+ const char *path = luaL_checkstring(L, 1);
311
+ const char *init = luaL_checkstring(L, 2);
312
+ int stat = ll_loadfunc(L, path, init);
313
+ if (stat == 0) /* no errors? */
314
+ return 1; /* return the loaded function */
315
+ else { /* error; error message is on stack top */
316
+ lua_pushnil(L);
317
+ lua_insert(L, -2);
318
+ lua_pushstring(L, (stat == ERRLIB) ? LIB_FAIL : "init");
319
+ return 3; /* return nil, error message, and where */
320
+ }
321
+ }
322
+
323
+
324
+
325
+ /*
326
+ ** {======================================================
327
+ ** 'require' function
328
+ ** =======================================================
329
+ */
330
+
331
+
332
+ static int readable (const char *filename) {
333
+ FILE *f = fopen(filename, "r"); /* try to open file */
334
+ if (f == NULL) return 0; /* open failed */
335
+ fclose(f);
336
+ return 1;
337
+ }
338
+
339
+
340
+ static const char *pushnexttemplate (lua_State *L, const char *path) {
341
+ const char *l;
342
+ while (*path == *LUA_PATHSEP) path++; /* skip separators */
343
+ if (*path == '\0') return NULL; /* no more templates */
344
+ l = strchr(path, *LUA_PATHSEP); /* find next separator */
345
+ if (l == NULL) l = path + strlen(path);
346
+ lua_pushlstring(L, path, l - path); /* template */
347
+ return l;
348
+ }
349
+
350
+ // BACKPORT from lua 5.2 --ol
351
+ static const char *searchpath (lua_State *L, const char *name,
352
+ const char *path,
353
+ const char *sep,
354
+ const char *dirsep) {
355
+ luaL_Buffer msg; /* to build error message */
356
+ luaL_buffinit(L, &msg);
357
+ if (*sep != '\0') /* non-empty separator? */
358
+ name = luaL_gsub(L, name, sep, dirsep); /* replace it by 'dirsep' */
359
+ while ((path = pushnexttemplate(L, path)) != NULL) {
360
+ const char *filename = luaL_gsub(L, lua_tostring(L, -1),
361
+ LUA_PATH_MARK, name);
362
+ lua_remove(L, -2); /* remove path template */
363
+ if (readable(filename)) /* does file exist and is readable? */
364
+ return filename; /* return that file name */
365
+ lua_pushfstring(L, "\n\tno file " LUA_QS, filename);
366
+ lua_remove(L, -2); /* remove file name */
367
+ luaL_addvalue(&msg); /* concatenate error msg. entry */
368
+ }
369
+ luaL_pushresult(&msg); /* create error message */
370
+ return NULL; /* not found */
371
+ }
372
+
373
+
374
+ static int ll_searchpath (lua_State *L) {
375
+ const char *f = searchpath(L, luaL_checkstring(L, 1),
376
+ luaL_checkstring(L, 2),
377
+ luaL_optstring(L, 3, "."),
378
+ luaL_optstring(L, 4, LUA_DIRSEP));
379
+ if (f != NULL) return 1;
380
+ else { /* error message is on top of the stack */
381
+ lua_pushnil(L);
382
+ lua_insert(L, -2);
383
+ return 2; /* return nil + error message */
384
+ }
385
+ }
386
+ // END BACKPORT
387
+
388
+ static const char *findfile (lua_State *L, const char *name,
389
+ const char *pname) {
390
+ const char *path;
391
+ name = luaL_gsub(L, name, ".", LUA_DIRSEP);
392
+ lua_getfield(L, LUA_ENVIRONINDEX, pname);
393
+ path = lua_tostring(L, -1);
394
+ if (path == NULL)
395
+ luaL_error(L, LUA_QL("package.%s") " must be a string", pname);
396
+ lua_pushliteral(L, ""); /* error accumulator */
397
+ while ((path = pushnexttemplate(L, path)) != NULL) {
398
+ const char *filename;
399
+ filename = luaL_gsub(L, lua_tostring(L, -1), LUA_PATH_MARK, name);
400
+ lua_remove(L, -2); /* remove path template */
401
+ if (readable(filename)) /* does file exist and is readable? */
402
+ return filename; /* return that file name */
403
+ lua_pushfstring(L, "\n\tno file " LUA_QS, filename);
404
+ lua_remove(L, -2); /* remove file name */
405
+ lua_concat(L, 2); /* add entry to possible error message */
406
+ }
407
+ return NULL; /* not found */
408
+ }
409
+
410
+
411
+ static void loaderror (lua_State *L, const char *filename) {
412
+ luaL_error(L, "error loading module " LUA_QS " from file " LUA_QS ":\n\t%s",
413
+ lua_tostring(L, 1), filename, lua_tostring(L, -1));
414
+ }
415
+
416
+
417
+ static int loader_Lua (lua_State *L) {
418
+ const char *filename;
419
+ const char *name = luaL_checkstring(L, 1);
420
+ filename = findfile(L, name, "path");
421
+ if (filename == NULL) return 1; /* library not found in this path */
422
+ if (luaL_loadfile(L, filename) != 0)
423
+ loaderror(L, filename);
424
+ return 1; /* library loaded successfully */
425
+ }
426
+
427
+
428
+ static const char *mkfuncname (lua_State *L, const char *modname) {
429
+ const char *funcname;
430
+ const char *mark = strchr(modname, *LUA_IGMARK);
431
+ if (mark) modname = mark + 1;
432
+ funcname = luaL_gsub(L, modname, ".", LUA_OFSEP);
433
+ funcname = lua_pushfstring(L, POF"%s", funcname);
434
+ lua_remove(L, -2); /* remove 'gsub' result */
435
+ return funcname;
436
+ }
437
+
438
+
439
+ static int loader_C (lua_State *L) {
440
+ const char *funcname;
441
+ const char *name = luaL_checkstring(L, 1);
442
+ const char *filename = findfile(L, name, "cpath");
443
+ if (filename == NULL) return 1; /* library not found in this path */
444
+ funcname = mkfuncname(L, name);
445
+ if (ll_loadfunc(L, filename, funcname) != 0)
446
+ loaderror(L, filename);
447
+ return 1; /* library loaded successfully */
448
+ }
449
+
450
+
451
+ static int loader_Croot (lua_State *L) {
452
+ const char *funcname;
453
+ const char *filename;
454
+ const char *name = luaL_checkstring(L, 1);
455
+ const char *p = strchr(name, '.');
456
+ int stat;
457
+ if (p == NULL) return 0; /* is root */
458
+ lua_pushlstring(L, name, p - name);
459
+ filename = findfile(L, lua_tostring(L, -1), "cpath");
460
+ if (filename == NULL) return 1; /* root not found */
461
+ funcname = mkfuncname(L, name);
462
+ if ((stat = ll_loadfunc(L, filename, funcname)) != 0) {
463
+ if (stat != ERRFUNC) loaderror(L, filename); /* real error */
464
+ lua_pushfstring(L, "\n\tno module " LUA_QS " in file " LUA_QS,
465
+ name, filename);
466
+ return 1; /* function not found */
467
+ }
468
+ return 1;
469
+ }
470
+
471
+
472
+ static int loader_preload (lua_State *L) {
473
+ const char *name = luaL_checkstring(L, 1);
474
+ lua_getfield(L, LUA_ENVIRONINDEX, "preload");
475
+ if (!lua_istable(L, -1))
476
+ luaL_error(L, LUA_QL("package.preload") " must be a table");
477
+ lua_getfield(L, -1, name);
478
+ if (lua_isnil(L, -1)) /* not found? */
479
+ lua_pushfstring(L, "\n\tno field package.preload['%s']", name);
480
+ return 1;
481
+ }
482
+
483
+
484
+ static const int sentinel_ = 0;
485
+ #define sentinel ((void *)&sentinel_)
486
+
487
+
488
+ static int ll_require (lua_State *L) {
489
+ const char *name = luaL_checkstring(L, 1);
490
+ int i;
491
+ lua_settop(L, 1); /* _LOADED table will be at index 2 */
492
+ lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
493
+ lua_getfield(L, 2, name);
494
+ if (lua_toboolean(L, -1)) { /* is it there? */
495
+ if (lua_touserdata(L, -1) == sentinel) /* check loops */
496
+ luaL_error(L, "loop or previous error loading module " LUA_QS, name);
497
+ return 1; /* package is already loaded */
498
+ }
499
+ /* else must load it; iterate over available loaders */
500
+ lua_getfield(L, LUA_ENVIRONINDEX, "loaders");
501
+ if (!lua_istable(L, -1))
502
+ luaL_error(L, LUA_QL("package.loaders") " must be a table");
503
+ lua_pushliteral(L, ""); /* error message accumulator */
504
+ for (i=1; ; i++) {
505
+ lua_rawgeti(L, -2, i); /* get a loader */
506
+ if (lua_isnil(L, -1))
507
+ luaL_error(L, "module " LUA_QS " not found:%s",
508
+ name, lua_tostring(L, -2));
509
+ lua_pushstring(L, name);
510
+ lua_call(L, 1, 1); /* call it */
511
+ if (lua_isfunction(L, -1)) /* did it find module? */
512
+ break; /* module loaded successfully */
513
+ else if (lua_isstring(L, -1)) /* loader returned error message? */
514
+ lua_concat(L, 2); /* accumulate it */
515
+ else
516
+ lua_pop(L, 1);
517
+ }
518
+ lua_pushlightuserdata(L, sentinel);
519
+ lua_setfield(L, 2, name); /* _LOADED[name] = sentinel */
520
+ lua_pushstring(L, name); /* pass name as argument to module */
521
+ lua_call(L, 1, 1); /* run loaded module */
522
+ if (!lua_isnil(L, -1)) /* non-nil return? */
523
+ lua_setfield(L, 2, name); /* _LOADED[name] = returned value */
524
+ lua_getfield(L, 2, name);
525
+ if (lua_touserdata(L, -1) == sentinel) { /* module did not set a value? */
526
+ lua_pushboolean(L, 1); /* use true as result */
527
+ lua_pushvalue(L, -1); /* extra copy to be returned */
528
+ lua_setfield(L, 2, name); /* _LOADED[name] = true */
529
+ }
530
+ return 1;
531
+ }
532
+
533
+ /* }====================================================== */
534
+
535
+
536
+
537
+ /*
538
+ ** {======================================================
539
+ ** 'module' function
540
+ ** =======================================================
541
+ */
542
+
543
+
544
+ static void setfenv (lua_State *L) {
545
+ lua_Debug ar;
546
+ if (lua_getstack(L, 1, &ar) == 0 ||
547
+ lua_getinfo(L, "f", &ar) == 0 || /* get calling function */
548
+ lua_iscfunction(L, -1))
549
+ luaL_error(L, LUA_QL("module") " not called from a Lua function");
550
+ lua_pushvalue(L, -2);
551
+ lua_setfenv(L, -2);
552
+ lua_pop(L, 1);
553
+ }
554
+
555
+
556
+ static void dooptions (lua_State *L, int n) {
557
+ int i;
558
+ for (i = 2; i <= n; i++) {
559
+ lua_pushvalue(L, i); /* get option (a function) */
560
+ lua_pushvalue(L, -2); /* module */
561
+ lua_call(L, 1, 0);
562
+ }
563
+ }
564
+
565
+
566
+ static void modinit (lua_State *L, const char *modname) {
567
+ const char *dot;
568
+ lua_pushvalue(L, -1);
569
+ lua_setfield(L, -2, "_M"); /* module._M = module */
570
+ lua_pushstring(L, modname);
571
+ lua_setfield(L, -2, "_NAME");
572
+ dot = strrchr(modname, '.'); /* look for last dot in module name */
573
+ if (dot == NULL) dot = modname;
574
+ else dot++;
575
+ /* set _PACKAGE as package name (full module name minus last part) */
576
+ lua_pushlstring(L, modname, dot - modname);
577
+ lua_setfield(L, -2, "_PACKAGE");
578
+ }
579
+
580
+
581
+ static int ll_module (lua_State *L) {
582
+ const char *modname = luaL_checkstring(L, 1);
583
+ int loaded = lua_gettop(L) + 1; /* index of _LOADED table */
584
+ lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
585
+ lua_getfield(L, loaded, modname); /* get _LOADED[modname] */
586
+ if (!lua_istable(L, -1)) { /* not found? */
587
+ lua_pop(L, 1); /* remove previous result */
588
+ /* try global variable (and create one if it does not exist) */
589
+ if (luaL_findtable(L, LUA_GLOBALSINDEX, modname, 1) != NULL)
590
+ return luaL_error(L, "name conflict for module " LUA_QS, modname);
591
+ lua_pushvalue(L, -1);
592
+ lua_setfield(L, loaded, modname); /* _LOADED[modname] = new table */
593
+ }
594
+ /* check whether table already has a _NAME field */
595
+ lua_getfield(L, -1, "_NAME");
596
+ if (!lua_isnil(L, -1)) /* is table an initialized module? */
597
+ lua_pop(L, 1);
598
+ else { /* no; initialize it */
599
+ lua_pop(L, 1);
600
+ modinit(L, modname);
601
+ }
602
+ lua_pushvalue(L, -1);
603
+ setfenv(L);
604
+ dooptions(L, loaded - 1);
605
+ return 0;
606
+ }
607
+
608
+
609
+ static int ll_seeall (lua_State *L) {
610
+ luaL_checktype(L, 1, LUA_TTABLE);
611
+ if (!lua_getmetatable(L, 1)) {
612
+ lua_createtable(L, 0, 1); /* create new metatable */
613
+ lua_pushvalue(L, -1);
614
+ lua_setmetatable(L, 1);
615
+ }
616
+ lua_pushvalue(L, LUA_GLOBALSINDEX);
617
+ lua_setfield(L, -2, "__index"); /* mt.__index = _G */
618
+ return 0;
619
+ }
620
+
621
+
622
+ /* }====================================================== */
623
+
624
+
625
+
626
+ /* auxiliary mark (for internal use) */
627
+ #define AUXMARK "\1"
628
+
629
+ static void setpath (lua_State *L, const char *fieldname, const char *envname,
630
+ const char *def) {
631
+ const char *path = getenv(envname);
632
+ if (path == NULL) /* no environment variable? */
633
+ lua_pushstring(L, def); /* use default */
634
+ else {
635
+ /* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */
636
+ path = luaL_gsub(L, path, LUA_PATHSEP LUA_PATHSEP,
637
+ LUA_PATHSEP AUXMARK LUA_PATHSEP);
638
+ luaL_gsub(L, path, AUXMARK, def);
639
+ lua_remove(L, -2);
640
+ }
641
+ setprogdir(L);
642
+ lua_setfield(L, -2, fieldname);
643
+ }
644
+
645
+
646
+ static const luaL_Reg pk_funcs[] = {
647
+ {"loadlib", ll_loadlib},
648
+ // BACKPORT from 5.2 --ol
649
+ {"searchpath", ll_searchpath},
650
+ // END BACKPORT {"seeall", ll_seeall},
651
+ {NULL, NULL}
652
+ };
653
+
654
+
655
+ static const luaL_Reg ll_funcs[] = {
656
+ {"module", ll_module},
657
+ {"require", ll_require},
658
+ {NULL, NULL}
659
+ };
660
+
661
+
662
+ static const lua_CFunction loaders[] =
663
+ {loader_preload, loader_Lua, loader_C, loader_Croot, NULL};
664
+
665
+
666
+ LUALIB_API int luaopen_package (lua_State *L) {
667
+ int i;
668
+ /* create new type _LOADLIB */
669
+ luaL_newmetatable(L, "_LOADLIB");
670
+ lua_pushcfunction(L, gctm);
671
+ lua_setfield(L, -2, "__gc");
672
+ /* create `package' table */
673
+ luaL_register(L, LUA_LOADLIBNAME, pk_funcs);
674
+ #if defined(LUA_COMPAT_LOADLIB)
675
+ lua_getfield(L, -1, "loadlib");
676
+ lua_setfield(L, LUA_GLOBALSINDEX, "loadlib");
677
+ #endif
678
+ lua_pushvalue(L, -1);
679
+ lua_replace(L, LUA_ENVIRONINDEX);
680
+ /* create `loaders' table */
681
+ lua_createtable(L, sizeof(loaders)/sizeof(loaders[0]) - 1, 0);
682
+ /* fill it with pre-defined loaders */
683
+ for (i=0; loaders[i] != NULL; i++) {
684
+ lua_pushcfunction(L, loaders[i]);
685
+ lua_rawseti(L, -2, i+1);
686
+ }
687
+ lua_setfield(L, -2, "loaders"); /* put it in field `loaders' */
688
+ setpath(L, "path", LUA_PATH, LUA_PATH_DEFAULT); /* set field `path' */
689
+ setpath(L, "cpath", LUA_CPATH, LUA_CPATH_DEFAULT); /* set field `cpath' */
690
+ /* store config information */
691
+ lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATHSEP "\n" LUA_PATH_MARK "\n"
692
+ LUA_EXECDIR "\n" LUA_IGMARK);
693
+ lua_setfield(L, -2, "config");
694
+ /* set field `loaded' */
695
+ luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 2);
696
+ lua_setfield(L, -2, "loaded");
697
+ /* set field `preload' */
698
+ lua_newtable(L);
699
+ lua_setfield(L, -2, "preload");
700
+ lua_pushvalue(L, LUA_GLOBALSINDEX);
701
+ luaL_register(L, NULL, ll_funcs); /* open lib into global table */
702
+ lua_pop(L, 1);
703
+ return 1; /* return 'package' table */
704
+ }
705
+