3 Copyright (C) 2006 Chris Porter.
6 #include "../lib/version.h"
8 #include "../lua/lua.h"
10 #include "../nterfacer/library.h"
11 #include "../nterfacer/nterfacer.h"
15 #define ERR_SCRIPT_NOT_FOUND 0x01
16 #define ERR_SCRIPT_ERROR 0x02
17 #define ERR_NO_NTERFACER 0x03
18 #define ERR_SCRIPT_RETURN_ERROR 0x04
19 #define ERR_DATA_INVALID 0x05
20 #define ERROR_SCRIPT_ERROR_OFFSET 1000
22 int handle_scriptcommand(struct rline
*li
, int argc
, char **argv
);
24 struct service_node
*u_node
;
27 u_node
= register_service("U");
31 register_handler(u_node
, "scriptcommand", 2, handle_scriptcommand
);
36 deregister_service(u_node
);
39 int handle_scriptcommand(struct rline
*li
, int argc
, char **argv
) {
40 lua_list
*l2
= lua_scriptloaded(argv
[0]);
48 return ri_error(li
, ERR_SCRIPT_NOT_FOUND
, "Script not found.");
54 lua_getglobal(l
, "scripterror");
55 lua_getglobal(l
, "onnterfacer");
56 if(!lua_isfunction(l
, -1)) {
58 return ri_error(li
, ERR_NO_NTERFACER
, "No nterfacer handler exists for this script.");
62 lua_pushstring(l
, argv
[i
]);
64 if(lua_debugpcall(l
, "onnterfacer", argc
- 1, 2, top
+ 1)) {
65 ret
= ri_error(li
, ERR_SCRIPT_ERROR
, "Script error: %s", lua_tostring(l
, -1));
70 if(!lua_isint(l
, -2) || (!lua_isstring(l
, -1) && !lua_istable(l
, -1))) {
72 return ri_error(li
, ERR_SCRIPT_RETURN_ERROR
, "Script didn't return expected values.");
75 if(lua_isstring(l
, -1)) {
76 cresult
= (char *)lua_tostring(l
, -1);
77 if(!lua_lineok(cresult
)) {
79 return ri_error(li
, ERR_DATA_INVALID
, "Script returned bad data.");
83 iresult
= lua_toint(l
, -2);
85 if(!lua_isstring(l
, -1)) {
87 return ri_error(li
, ERR_SCRIPT_RETURN_ERROR
, "Script didn't return expected values.");
89 ret
= ri_error(li
, iresult
+ ERROR_SCRIPT_ERROR_OFFSET
, "Script error: %s", cresult
);
95 if(lua_isstring(l
, -1)) {
96 ret
= ri_append(li
, "%s", cresult
);
100 while(lua_next(l
, -2)) {
101 if(!lua_isstring(l
, -1)) {
104 return ri_error(li
, ERR_SCRIPT_RETURN_ERROR
, "Script didn't return expected values.");
106 cresult
= (char *)lua_tostring(l
, -1);
107 if(!lua_lineok(cresult
)) {
110 return ri_error(li
, ERR_DATA_INVALID
, "Script returned bad data.");
112 ret
= ri_append(li
, "%s", cresult
);
126 return ri_error(li
, BF_OVER
, "Buffer overflow");