X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/93917ccd04d478ba49810c6d67df16f8da45e984..7e032dc63479ed3d0b76fe71c05303fbe7dbc53a:/lua/lua.c diff --git a/lua/lua.c b/lua/lua.c index c23da67a..6cfde96c 100644 --- a/lua/lua.c +++ b/lua/lua.c @@ -4,6 +4,9 @@ /* ALL RIGHTS RESERVED. */ /* Don't put this into the SVN repo. */ +#define _POSIX_C_SOURCE 200112L +#include + #include "../core/config.h" #include "../core/error.h" #include "../core/hooks.h" @@ -11,10 +14,10 @@ #include "../lib/irc_string.h" #include "../core/schedule.h" #include "../lib/version.h" - +#include "../lib/strlfunc.h" #include "lua.h" -MODULE_VERSION(LUA_FULLVERSION); +MODULE_VERSION(LUA_SMALLVERSION); #ifdef LUA_DEBUGSOCKET @@ -45,7 +48,7 @@ void lua_destroycontrol(void); void lua_onunload(lua_State *l); void lua_onload(lua_State *l); -void lua_setpath(lua_State *l); +void lua_setpath(void); void lua_setupdebugsocket(void); void lua_freedebugsocket(void); @@ -54,8 +57,10 @@ void lua_deregisternicks(lua_list *l); void lua_registerlocalcommands(lua_State *ps); void lua_registerdebug(lua_State *ps); void lua_socket_closeall(lua_list *l); +void lua_scheduler_freeall(lua_list *l); void lua_registersocketcommands(lua_State *ps); void lua_registercryptocommands(lua_State *ps); +void lua_registerschedulercommands(lua_State *ps); #ifdef LUA_DEBUGSOCKET @@ -115,6 +120,8 @@ void _init() { return; } + lua_setpath(); + loaded = 1; startsched = scheduleoneshot(time(NULL) + 1, &lua_startup, NULL); @@ -151,6 +158,7 @@ void _fini() { freesstring(dummy.name); lua_freedebugsocket(); + nscheckfreeall(POOL_LUA); } void lua_loadscripts(void) { @@ -183,13 +191,16 @@ lua_State *lua_loadscript(char *file) { int top; lua_State *l; lua_list *n; + char buf[1024]; if(!cpath || !suffix) return NULL; - delchars(file, "./\\;"); + strlcpy(buf, file, sizeof(buf)); - if(lua_scriptloaded(file)) + delchars(buf, "./\\;"); + + if(lua_scriptloaded(buf)) return NULL; l = lua_newstate(lua_nsmalloc, NULL); @@ -198,13 +209,13 @@ lua_State *lua_loadscript(char *file) { n = (lua_list *)luamalloc(sizeof(lua_list));; if(!n) { - Error("lua", ERR_ERROR, "Error allocing list for %s.", file); + Error("lua", ERR_ERROR, "Error allocing list for %s.", buf); return NULL; } - n->name = getsstring(file, LUA_PATHLEN); + n->name = getsstring(buf, LUA_PATHLEN); if(!n->name) { - Error("lua", ERR_ERROR, "Error allocing name item for %s.", file); + Error("lua", ERR_ERROR, "Error allocing name item for %s.", buf); luafree(n); return NULL; } @@ -220,8 +231,7 @@ lua_State *lua_loadscript(char *file) { lua_registerdbcommands(l); lua_registersocketcommands(l); lua_registercryptocommands(l); - - lua_setpath(l); + lua_registerschedulercommands(l); #ifdef LUA_USEJIT lua_require(l, "lib/jit"); @@ -244,6 +254,7 @@ lua_State *lua_loadscript(char *file) { n->prev = lua_tail; n->nicks = NULL; n->sockets = NULL; + n->schedulers = NULL; if(!lua_head) { lua_head = n; @@ -259,6 +270,14 @@ lua_State *lua_loadscript(char *file) { Error("lua", ERR_ERROR, "Error pcalling: %s.", file); lua_close(l); freesstring(n->name); + + if(lua_head == n) + lua_head = NULL; + + lua_tail = n->prev; + if(lua_tail) + lua_tail->next = NULL; + luafree(n); return NULL; } @@ -275,6 +294,7 @@ void lua_unloadscript(lua_list *l) { lua_onunload(l->l); lua_deregisternicks(l); lua_socket_closeall(l); + lua_scheduler_freeall(l); lua_close(l->l); freesstring(l->name); @@ -304,43 +324,11 @@ void lua_unloadscript(lua_list *l) { luafree(l); } -void lua_setpath(lua_State *l) { - char fullpath[LUA_PATHLEN], *prev = NULL; - - int top = lua_gettop(l); - - lua_getglobal(l, "package"); - if(!lua_istable(l, 1)) { - Error("lua", ERR_ERROR, "Unable to set package.path (package is not a table)."); - return; - } - - lua_pushstring(l, "path"); - lua_gettable(l, -2); - - if(lua_isstring(l, -1)) - prev = (char *)lua_tostring(l, -1); - - if(prev) { - snprintf(fullpath, sizeof(fullpath), "%s;%s/?%s", prev, cpath->content, suffix->content); - } else { - snprintf(fullpath, sizeof(fullpath), "%s/?%s", cpath->content, suffix->content); - } - - /* pop broke! */ - - lua_getglobal(l, "package"); - if(!lua_istable(l, 1)) { - Error("lua", ERR_ERROR, "Unable to set package.path (package is not a table)."); - return; - } - - lua_pushstring(l, "path"); - - lua_pushstring(l, fullpath); - lua_settable(l, -3); +void lua_setpath(void) { + char fullpath[LUA_PATHLEN]; - lua_settop(l, top); + snprintf(fullpath, sizeof(fullpath), "%s/?%s", cpath->content, suffix->content); + setenv("LUA_PATH", fullpath, 1); } lua_list *lua_scriptloaded(char *name) { @@ -455,7 +443,7 @@ int lua_lineok(const char *data) { return 1; } -INLINE int lua_debugpcall(lua_State *l, char *message, int a, int b, int c) { +int lua_debugpcall(lua_State *l, char *message, int a, int b, int c) { lua_list *l2 = lua_listfromstate(l); int ret;