static int _init(struct snlua *l, struct skynet_context *ctx, const char * args) { lua_State *L = l->L; l->ctx = ctx; luaL_init(L); lua_gc(L, LUA_GCSTOP, 0); luaL_openlibs(L); lua_pushlightuserdata(L, l); lua_setfield(L, LUA_REGISTRYINDEX, "skynet_lua"); #ifndef NOCODECACHE luaL_requiref(L, "skynet.codecache", luacode_lib , 0); lua_pop(L,1); #endif lua_gc(L, LUA_GCRESTART, 0); char tmp[strlen(args)+1]; char *parm = tmp; strcpy(parm,args); lua_pushcfunction(L, traceback); int traceback_index = lua_gettop(L); assert(traceback_index == 1); const char * filename = parm; int r = _load(L, &parm); if (r != 0) { if (r<0) { skynet_error(ctx, "lua parser [%s] load error", filename); } else { skynet_error(ctx, "lua parser [%s] error : %s", filename, lua_tostring(L,-1)); } _report_launcher_error(ctx); return 1; } int n=0; while(parm) { const char * arg = strsep(&parm, " \r\n"); if (arg && arg[0]!='\0') { lua_pushstring(L, arg); ++n; } } r = lua_pcall(L,n,0,traceback_index); if (r == LUA_OK) { r = lua_gc(L, LUA_GCCOLLECT, 0); if (r == LUA_OK) { return 0; } } _report_error(L, ctx, filename, r); _report_launcher_error(ctx); return 1; }
static int _init(struct snlua *l, struct skynet_context *ctx, const char * args, size_t sz) { lua_State *L = l->L; l->ctx = ctx; lua_gc(L, LUA_GCSTOP, 0); lua_pushboolean(L, 1); /* signal for libraries to ignore env. vars. */ lua_setfield(L, LUA_REGISTRYINDEX, "LUA_NOENV"); luaL_openlibs(L); lua_pushlightuserdata(L, ctx); lua_setfield(L, LUA_REGISTRYINDEX, "skynet_context"); luaL_requiref(L, "skynet.codecache", codecache , 0); lua_pop(L,1); const char *path = optstring(ctx, "lua_path","./lualib/?.lua;./lualib/?/init.lua"); lua_pushstring(L, path); lua_setglobal(L, "LUA_PATH"); const char *cpath = optstring(ctx, "lua_cpath","./luaclib/?.so"); lua_pushstring(L, cpath); lua_setglobal(L, "LUA_CPATH"); const char *service = optstring(ctx, "luaservice", "./service/?.lua"); lua_pushstring(L, service); lua_setglobal(L, "LUA_SERVICE"); const char *preload = skynet_command(ctx, "GETENV", "preload"); lua_pushstring(L, preload); lua_setglobal(L, "LUA_PRELOAD"); lua_pushcfunction(L, traceback); assert(lua_gettop(L) == 1); const char * loader = optstring(ctx, "lualoader", "./lualib/loader.lua"); int r = luaL_loadfile(L,loader); if (r != LUA_OK) { skynet_error(ctx, "Can't load %s : %s", loader, lua_tostring(L, -1)); _report_launcher_error(ctx); return 1; } lua_pushlstring(L, args, sz); r = lua_pcall(L,1,0,1); if (r != LUA_OK) { skynet_error(ctx, "lua loader error : %s", lua_tostring(L, -1)); _report_launcher_error(ctx); return 1; } lua_settop(L,0); lua_gc(L, LUA_GCRESTART, 0); return 0; }