aboutsummaryrefslogtreecommitdiffstats
path: root/cmd/cmd_lua.c
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/cmd_lua.c')
-rw-r--r--cmd/cmd_lua.c263
1 files changed, 236 insertions, 27 deletions
diff --git a/cmd/cmd_lua.c b/cmd/cmd_lua.c
index a4d7573..105cb47 100644
--- a/cmd/cmd_lua.c
+++ b/cmd/cmd_lua.c
@@ -1,46 +1,255 @@
#include "cmd_lua.h"
-#define BILLION 1000000000L
+void fatal_error(lua_State *L, char *msg)
+{
+ fprintf(stderr, "\n FATAL ERROR:\n %s %s\n\n", msg, lua_tostring(L,-1));
+}
+
+int check_table_key_string(lua_State *L, const char *key, const char **value, size_t *size)
+{
+ const char *result;
+ size_t result_sz;
+ int t;
+
+ lua_pushstring(L, key);
+ lua_gettable(L,1);
+ t = lua_type(L,-1);
+ if (t == LUA_TSTRING)
+ {
+ result = luaL_checklstring(L,-1,&result_sz);
+ *value = result;
+ *size = result_sz;
+ return 0;
+ } else
+ {
+ *value = NULL;
+ *size = 0;
+ return -1;
+ }
+}
+
+int check_table_key_integer(lua_State *L, const char *key, int *value)
+{
+ int result;
+ int t;
+
+ lua_pushstring(L, key);
+ lua_gettable(L,1);
+ if ((t = lua_type(L, -1)) == LUA_TNUMBER)
+ {
+ result = luaL_checkinteger(L,-1);
+ *value = result;
+ return 0;
+ }
+
+ return -1;
+}
+
+int verify_name(const char *lua_name)
+{
+ int i;
+
+ //check if all symbols are alphanumeric
+ for (i=0;i<strlen(lua_name);i++)
+ {
+ if (!isdigit(lua_name[i]) && !isalpha(lua_name[i]))
+ {
+ return -1;
+ }
+ }
+ return 0;
+}
+
+int lua_excute(const char *fname, rpc_call_request *req, rpc_call_response **resp)
+{
+ lua_State *L;
+ sds lua_full_path = sdsempty();
+
+ L = luaL_newstate();
+ luaL_openlibs(L);
+
+ if (verify_name(fname) != 0)
+ {
+ return -1;
+ }
+
+ lua_full_path = sdscat(lua_full_path, "lua/");
+ lua_full_path = sdscat(lua_full_path, fname);
+ lua_full_path = sdscat(lua_full_path, ".lua");
+
+ if (luaL_loadfile(L,lua_full_path))
+ {
+ fatal_error(L, "load file failed");
+ sdsfree(lua_full_path);
+ return -1;
+ }
+ sdsfree(lua_full_path);
+
+ if (lua_pcall(L,0,0,0))
+ {
+ fatal_error(L, "lua_pcall failed");
+ return -1;
+ }
+
+ lua_getglobal(L, "callback");
+ lua_newtable(L);
+
+ lua_pushstring(L,"method");
+ lua_pushstring(L, req->method);
+ lua_settable(L,-3);
+
+ lua_pushstring(L,"params");
+ lua_pushstring(L, req->params);
+ lua_settable(L,-3);
+
+ lua_pushstring(L,"id");
+ lua_pushinteger(L, req->id);
+ lua_settable(L,-3);
+
+ lua_pushstring(L,"user");
+ lua_pushstring(L, req->user);
+ lua_settable(L,-3);
+
+ lua_pushstring(L,"mask");
+ lua_pushstring(L, req->mask);
+ lua_settable(L,-3);
+
+ lua_pushstring(L,"server");
+ lua_pushstring(L, req->server);
+ lua_settable(L,-3);
+
+ if (lua_pcall(L,1,1,0))
+ {
+ fatal_error(L, "cant call callback function from file");
+ return -1;
+ }
+
+ {
+ int t;
+ int top = lua_gettop(L);
+
+ if (top == 1)
+ {
+ t = lua_type(L,1);
+ if (t == LUA_TTABLE)
+ {
+ int j;
+ int len = lua_rawlen(L,1);
+ const char *r_result;
+ const char *r_error;
+ int r_id;
+ size_t sz;
+
+ check_table_key_string(L, "result", &r_result, &sz);
+ //resp->result = alloc_new_str(result);
+ printf("RESULT:%s\n", r_result);
+ check_table_key_integer(L, "id", &r_id);
+ //resp->id = result_i;
+ printf("ID:%d\n", r_id);
+ check_table_key_string(L, "error", &r_error, &sz);
+ //resp->error = alloc_new_str(result);
+ printf("ERROR:%s\n", r_error);
+
+ *resp = rpc_call_resp_new(alloc_new_str(r_result), alloc_new_str(r_error), 1);
+ (*resp)->user = alloc_new_str(" ");
+ (*resp)->server = alloc_new_str(" ");
+ (*resp)->mask = alloc_new_str(" ");
+
+ }
+ } else
+ {
+ fatal_error(L,"Some unexpected argumetns");
+ return -1;
+ }
+ }
+
+ lua_close(L);
+ return 0;
+}
void *cmd_lua(void *data)
{
char *ret = NULL;
- int fret=-1;
+ char *req_data = NULL;
+ int fret;
+ int rc;
+ int i;
- const int buf_size = 128;
- char buf[buf_size+1];
+ int count;
+ sds params = sdsempty();
+ sds out_result = sdsempty(), out_lua = sdsempty();
+ sds *tokens;
- struct timespec start;
- struct stat file_stat;
- uint64_t proc_sec;
+ rpc_call_request *req = NULL;
+ rpc_call_response *resp = NULL;
+ netbyte_store *nb_req = NULL, *nb_resp=NULL;
+ char *nb_buf = NULL;
- printf("BOTU\n");
+ PRINT("LUA\n");
- stat("/proc/self",&file_stat);
+ req_data = (char *)data;
+ if (!req_data)
+ {
+ PERM();
+ return NULL;
+ }
- /*
- CHECK PREDIFINED MACROSES IF SUCH FUNCTIONALITY EXCISTS OR NOT
- */
- #if _POSIX_C_SOURCE < 199309L
- ERROR("Dont have functionality\n");
- #endif
+ //----------------------------------------------------------------------------
+ //prepare request
+ nb_req = malloc(sizeof(netbyte_store));
+ nb_init(nb_req);
+ nb_load(nb_req, req_data);
- fret = clock_gettime(CLOCK_REALTIME, &start);
- if (fret<0)
+ if (nb_req == NULL)
{
- perror("clock gettime");
- ret = alloc_new_str("Can get clock thread uptime\n");
- return ret;
+ ERROR("implement response\n");
+ return NULL;
}
- proc_sec = start.tv_sec - file_stat.st_ctim.tv_sec;
+ fret = rpc_call_req_unmarsh(nb_req, &req);
+ if (fret != 0)
+ {
+ ERROR("Invalid request format\n");
+ return NULL;
+ }
+
+ //----------------------------------------------------------------------------
+ //main code
+
+
+ params = sdsnew(req->params);
+ tokens = sdssplitargs(params, &count);
+
+
+
+ if (-1 == lua_excute(tokens[1], req, &resp))
+ {
+ resp = rpc_call_resp_new(out_result,"None",1);
+ resp->user = alloc_new_str(" ");
+ resp->server = alloc_new_str(" ");
+ resp->mask = alloc_new_str(" ");
+ }
+
+ sdsfree(params);
+ sdsfreesplitres(tokens, count);
+
+ //----------------------------------------------------------------------------
+ //prepare response
+ nb_resp = malloc(sizeof(netbyte_store));
+ nb_init(nb_resp);
+
+ PNL();
+ rpc_call_resp_marsh(resp, &nb_resp);
+
+ PNL();
+ nb_buf = (char *)nb_create(nb_resp);
+ if (nb_buf)
+ {
+ ret = nb_buf;
+ }
- snprintf(buf, buf_size, "%lud %luh %lum %lus",
- (proc_sec/(3600*24)),
- (proc_sec/(3600))%24,
- (proc_sec/60)%60,
- proc_sec%60);
- ret = alloc_new_str(buf);
+ nb_free(nb_resp);
+ rpc_call_resp_free(resp);
return ret;
}