]> jfr.im git - irc/quakenet/newserv.git/blobdiff - lua/lua.c
Merge chanserv-live into default.
[irc/quakenet/newserv.git] / lua / lua.c
index 7681bf62a1e2e83b81b9f274f70a42ad223273f9..5263f26a02f504b39f4d24e687d421ad295982e7 100644 (file)
--- 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 <stdlib.h>
+
 #include "../core/config.h"
 #include "../core/error.h"
 #include "../core/hooks.h"
@@ -11,7 +14,7 @@
 #include "../lib/irc_string.h"
 #include "../core/schedule.h"
 #include "../lib/version.h"
-
+#include "../lib/strlfunc.h"
 #include "lua.h"
 
 MODULE_VERSION(LUA_SMALLVERSION);
@@ -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);
@@ -184,13 +191,17 @@ lua_State *lua_loadscript(char *file) {
   int top;
   lua_State *l;
   lua_list *n;
+  char buf[1024];
+  void *args[2];
 
   if(!cpath || !suffix)
     return NULL;
 
-  delchars(file, "./\\;");
+  strlcpy(buf, file, sizeof(buf));
+
+  delchars(buf, "./\\;");
 
-  if(lua_scriptloaded(file))
+  if(lua_scriptloaded(buf))
     return NULL;
 
   l = lua_newstate(lua_nsmalloc, NULL);
@@ -199,13 +210,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;
   }
@@ -221,8 +232,11 @@ lua_State *lua_loadscript(char *file) {
   lua_registerdbcommands(l);
   lua_registersocketcommands(l);
   lua_registercryptocommands(l);
+  lua_registerschedulercommands(l);
 
-  lua_setpath(l);
+  args[0] = file;
+  args[1] = l;
+  triggerhook(HOOK_LUA_LOADSCRIPT, args);
 
 #ifdef LUA_USEJIT
   lua_require(l, "lib/jit");
@@ -245,6 +259,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;
@@ -281,9 +296,12 @@ lua_State *lua_loadscript(char *file) {
 }
 
 void lua_unloadscript(lua_list *l) {
+  triggerhook(HOOK_LUA_UNLOADSCRIPT, l->l);
+
   lua_onunload(l->l);
   lua_deregisternicks(l);
   lua_socket_closeall(l);
+  lua_scheduler_freeall(l);
   lua_close(l->l);
   freesstring(l->name);
 
@@ -313,43 +331,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) {
@@ -464,7 +450,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;