lua_State* pklua_get_lua(struct pk_manager* pkm) { lua_State* L = lua_open(); const luaL_Reg* reg; /* FIXME: We would rather not use luaL_openlibs(L), because we probably * want a stricter sandbox? */; luaL_openlibs(L); /* Load compiled-in pklua.lua + plugins */ if ((0 != luaL_loadstring(L, pklualua)) || (0 != lua_pcall(L, 0, LUA_MULTRET, 0))) { pk_log(PK_LOG_ERROR, "Lua init failed: %s", lua_tostring(L, -1)); return NULL; } else { /* Add some native methods, register as pklua */ for (reg = pklua_methods; reg->func != NULL; reg++) { luaL_register(L, NULL, reg); } lua_setglobal(L, "pklua"); lua_getfield(L, LUA_GLOBALSINDEX, "pklua"); lua_pushstring(L, PK_VERSION); lua_setfield(L, -2, "version"); lua_remove(L, -1); pklua_configure(L, pkm); luaL_dostring(L, "pklua:log('Loaded pklua.lua v' .. pklua.version);"); } return L; }
/* Returns the Lua object for this thread, or NULL if none exists. * If pkm != NULL, a new Lua object will be created and initialized * instead of returning NULL. */ pk_lua_t* pklua_get_unlocked_lua(struct pk_manager* pkm) { pk_lua_t* PL = get_thread_lua(); if ((PL != NULL) || (pkm == NULL)) return PL; /* No Lua object found, pkm != NULL => create new Lua state */ PL = pklua_new_thread_lua(NULL); lua_State* L = PL->lua; const luaL_Reg* reg; /* FIXME: We would rather not use luaL_openlibs(L), because we probably * want a stricter sandbox? */; luaL_openlibs(L); /* Load compiled-in pklua.lua + plugins */ if ((0 != luaL_loadstring(L, (const char*) pklualua)) || (0 != lua_pcall(L, 0, LUA_MULTRET, 0))) { pk_log(PK_LOG_ERROR, "Lua init failed: %s", lua_tostring(L, -1)); pklua_unlock_lua(PL); return NULL; } /* Add some native methods, register as pklua */ for (reg = pklua_methods; reg->func != NULL; reg++) { luaL_register(L, NULL, reg); } lua_setglobal(L, "pklua"); lua_getfield(L, LUA_GLOBALSINDEX, "pklua"); lua_pushstring(L, PK_VERSION); lua_setfield(L, -2, "version"); _pklua_wrap_pk_manager(L, pkm); lua_setfield(L, -2, "manager"); lua_remove(L, -1); pklua_configure(pklua_unlock_lua(PL), pkm); pklua_lock_lua(PL); luaL_dostring(L, "pklua:log('Loaded pklua.lua v' .. pklua.version);"); return pklua_unlock_lua(PL); }