示例#1
0
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;
}
示例#2
0
/* 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);
}