X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/2142964ccc7a8993a36959a0708c694e067ceeb6..211567363bd8bfbd70cef81e4208ea02d49ebb55:/lua/nterfacer_lua.c diff --git a/lua/nterfacer_lua.c b/lua/nterfacer_lua.c index 6fe3fb02..0fdb4629 100644 --- a/lua/nterfacer_lua.c +++ b/lua/nterfacer_lua.c @@ -7,15 +7,16 @@ #include "../lua/lua.h" -#include "../nterface/library.h" -#include "../nterface/nterfacer.h" +#include "../nterfacer/library.h" +#include "../nterfacer/nterfacer.h" -MODULE_VERSION("$Id") +MODULE_VERSION(""); #define ERR_SCRIPT_NOT_FOUND 0x01 #define ERR_SCRIPT_ERROR 0x02 #define ERR_NO_NTERFACER 0x03 #define ERR_SCRIPT_RETURN_ERROR 0x04 +#define ERR_DATA_INVALID 0x05 #define ERROR_SCRIPT_ERROR_OFFSET 1000 int handle_scriptcommand(struct rline *li, int argc, char **argv); @@ -40,8 +41,8 @@ int handle_scriptcommand(struct rline *li, int argc, char **argv) { lua_State *l; int top; int iresult = 0; - char *cresult; - int ret, i; + int ret = 0, i; + char *cresult = NULL; if(!l2) return ri_error(li, ERR_SCRIPT_NOT_FOUND, "Script not found."); @@ -66,20 +67,59 @@ int handle_scriptcommand(struct rline *li, int argc, char **argv) { return ret; } - if(!lua_isint(l, -2) || !lua_isstring(l, -1)) { + if(!lua_isint(l, -2) || (!lua_isstring(l, -1) && !lua_istable(l, -1))) { lua_settop(l, top); return ri_error(li, ERR_SCRIPT_RETURN_ERROR, "Script didn't return expected values."); } + if(lua_isstring(l, -1)) { + cresult = (char *)lua_tostring(l, -1); + if(!lua_lineok(cresult)) { + lua_settop(l, top); + return ri_error(li, ERR_DATA_INVALID, "Script returned bad data."); + } + } + iresult = lua_toint(l, -2); - cresult = (char *)lua_tostring(l, -1); if(iresult) { - ret = ri_error(li, iresult + ERROR_SCRIPT_ERROR_OFFSET, "Script error: %s", cresult); - lua_settop(l, top); - return ret; + if(!lua_isstring(l, -1)) { + lua_settop(l, top); + return ri_error(li, ERR_SCRIPT_RETURN_ERROR, "Script didn't return expected values."); + } else { + ret = ri_error(li, iresult + ERROR_SCRIPT_ERROR_OFFSET, "Script error: %s", cresult); + lua_settop(l, top); + return ret; + } + } + + if(lua_isstring(l, -1)) { + ret = ri_append(li, "%s", cresult); + } else { + lua_pushnil(l); + + while(lua_next(l, -2)) { + if(!lua_isstring(l, -1)) { + lua_pop(l, 1); + lua_settop(l, top); + return ri_error(li, ERR_SCRIPT_RETURN_ERROR, "Script didn't return expected values."); + } else { + cresult = (char *)lua_tostring(l, -1); + if(!lua_lineok(cresult)) { + lua_pop(l, 1); + lua_settop(l, top); + return ri_error(li, ERR_DATA_INVALID, "Script returned bad data."); + } else { + ret = ri_append(li, "%s", cresult); + } + } + + lua_pop(l, 1); + + if(ret == BF_OVER) + break; + } } - ret = ri_append(li, "%s", cresult); lua_settop(l, top); if(ret == BF_OVER)