Add support for preloading lua modules. This is useful both when
providing lua bindings to applications based on librazor and when
producing static binaries using librazor (where otherwise the lua
POSIX library would need to be included as an additional dynamic
object).
1.1 --- a/librazor/Makefile.am Wed Apr 22 16:27:11 2009 +0100
1.2 +++ b/librazor/Makefile.am Wed Apr 29 17:00:01 2009 +0100
1.3 @@ -49,7 +49,7 @@
1.4
1.5 if HAVE_LUA
1.6 test_lua_SOURCES = test-lua.c
1.7 - test_lua_LDADD = lua.lo util.lo $(LUA_LIBS) ../gl/libgnu.la \
1.8 + test_lua_LDADD = lua.lo util.lo types.lo $(LUA_LIBS) ../gl/libgnu.la \
1.9 $(EXTRA_LIBS)
1.10
1.11 TESTS += test-lua
2.1 --- a/librazor/lua.c Wed Apr 22 16:27:11 2009 +0100
2.2 +++ b/librazor/lua.c Wed Apr 29 17:00:01 2009 +0100
2.3 @@ -289,6 +289,66 @@
2.4 return retval;
2.5 }
2.6
2.7 +struct razor_lua_loader {
2.8 + uint32_t name;
2.9 + lua_CFunction func;
2.10 +};
2.11 +
2.12 +static struct razor_preload {
2.13 + int init;
2.14 + struct hashtable modules;
2.15 + struct array name_pool;
2.16 + struct array loaders;
2.17 +} razor_preload = {0};
2.18 +
2.19 +RAZOR_EXPORT void razor_set_lua_loader(const char *modname, void (*loader)())
2.20 +{
2.21 + uint32_t name;
2.22 + struct razor_lua_loader *ploader, *end;
2.23 +
2.24 + if (!razor_preload.init) {
2.25 + razor_preload.init = 1;
2.26 + array_init(&razor_preload.name_pool);
2.27 + array_init(&razor_preload.loaders);
2.28 + hashtable_init(&razor_preload.modules,
2.29 + &razor_preload.name_pool);
2.30 + }
2.31 +
2.32 + name = hashtable_tokenize(&razor_preload.modules, modname);
2.33 +
2.34 + end = razor_preload.loaders.data + razor_preload.loaders.size;
2.35 + for(ploader = razor_preload.loaders.data; ploader < end; ploader++)
2.36 + if (ploader->name == name) {
2.37 + ploader->func = loader;
2.38 + return;
2.39 + }
2.40 +
2.41 + ploader = array_add(&razor_preload.loaders, sizeof(*ploader));
2.42 + ploader->name = name;
2.43 + ploader->func = loader;
2.44 +}
2.45 +
2.46 +static void razor_lua_preload(lua_State *L)
2.47 +{
2.48 + struct razor_lua_loader *ploader, *end;
2.49 +
2.50 + if (!razor_preload.init)
2.51 + return;
2.52 +
2.53 + lua_getfield(L, LUA_GLOBALSINDEX, "package");
2.54 + lua_getfield(L, -1, "preload");
2.55 + lua_remove(L, -2);
2.56 +
2.57 + end = razor_preload.loaders.data + razor_preload.loaders.size;
2.58 + for(ploader = razor_preload.loaders.data; ploader < end; ploader++) {
2.59 + lua_pushcfunction(L, ploader->func);
2.60 + lua_setfield(L, -2,
2.61 + razor_preload.name_pool.data + ploader->name);
2.62 + }
2.63 +
2.64 + lua_pop(L, 1);
2.65 +}
2.66 +
2.67 int run_lua_script(const char *root, const char *name, const char *body,
2.68 ssize_t len)
2.69 {
2.70 @@ -303,6 +363,7 @@
2.71
2.72 L = lua_newstate(alloc_lua, &rl);
2.73 luaL_openlibs(L);
2.74 + razor_lua_preload(L);
2.75 lua_getglobal(L, "require");
2.76 lua_pushstring(L, "posix");
2.77 if (lua_pcall(L, 1, 1, 0)) {
3.1 --- a/librazor/razor.h Wed Apr 22 16:27:11 2009 +0100
3.2 +++ b/librazor/razor.h Wed Apr 29 17:00:01 2009 +0100
3.3 @@ -380,5 +380,7 @@
3.4
3.5 void razor_disable_root_name_checks(int disable);
3.6
3.7 +void razor_set_lua_loader(const char *modname, void (*loader)());
3.8 +
3.9
3.10 #endif /* _RAZOR_H_ */