int lsp::luabag_run(LUABAG* luabag, FCGX_Request* r) { int handler_type = handler_type_unknown; char* handler = FCGX_GetParam("SCRIPT_NAME", r->envp); if(handler) { handler=strrchr(handler,'.'); if(!handler) { log(LOG_ERR, "%s", "Script name has no extension name"); return -1; } if(!strcmp(handler,".lsp") || !strcmp(handler,".lp") ) handler_type = handler_type_lsp; else if(!strcmp(handler,".lua")) { handler_type = handler_type_lua; log(LOG_ERR, "%s", "lua handler"); } else { log(LOG_ERR, "%s:%s", "Not correct extension name, valid extension are lp, lsp, lua", handler); return -1; } } else { log(LOG_ERR, "%s", "Not script name"); return -1; } lsp_io lio={r, lputs:io_def_puts, lputc:io_def_putc, lwrite:io_def_write}; luaL_lsp_set_io(luabag->L,&lio); char* p = FCGX_GetParam("REQUEST_METHOD", r->envp); if(p && !strcmp(p,"POST")) { int rc = read_request_data(luabag->L); if(rc!= 0) return rc; } p = FCGX_GetParam("QUERY_STRING", r->envp); luaL_lsp_setargs(luabag->L, p, p ? strlen(p) : 0); lua_getfield(luabag->L,LUA_GLOBALSINDEX,"env"); //luaL_lsp_setfield(luabag->L,"server_admin",r->server->server_admin); luaL_lsp_setfield(luabag->L,"server_hostname", FCGX_GetParam("SERVER_NAME", r->envp)); luaL_lsp_setfield(luabag->L,"remote_ip",FCGX_GetParam("REMOTE_ADDR", r->envp)); luaL_lsp_setfield(luabag->L,"remote_host",FCGX_GetParam("REMOTE_ADDR", r->envp)); luaL_lsp_setfield(luabag->L,"remote_port",FCGX_GetParam("REMOTE_PORT", r->envp)); luaL_lsp_setfield(luabag->L,"local_ip", FCGX_GetParam("SERVER_ADDR", r->envp)); luaL_lsp_setfield(luabag->L,"local_host",FCGX_GetParam("SERVER_NAME", r->envp)); luaL_lsp_setfield(luabag->L,"local_port",FCGX_GetParam("SERVER_PORT", r->envp)); char hostname[256]; if (0 == gethostname(hostname, 256)) { luaL_lsp_setfield(luabag->L,"local_host", hostname); luaL_lsp_setfield(luabag->L,"hostname", hostname); } luaL_lsp_setfield(luabag->L,"method", FCGX_GetParam("REQUEST_METHOD", r->envp)); luaL_lsp_setfield(luabag->L,"handler", handler); luaL_lsp_setfield(luabag->L,"uri", FCGX_GetParam("REQUEST_URI", r->envp)); luaL_lsp_setfield(luabag->L,"doc_uri", FCGX_GetParam("DOCUMENT_URI", r->envp)); luaL_lsp_setfield(luabag->L,"doc_root", FCGX_GetParam("DOCUMENT_ROOT", r->envp)); char* filename = FCGX_GetParam("SCRIPT_FILENAME", r->envp); luaL_lsp_setfield(luabag->L,"filename", filename); luaL_lsp_setfield(luabag->L,"accept_lang", FCGX_GetParam("HTTP_ACCEPT_LANGUAGE", r->envp)); lua_pop(luabag->L,1); luaL_lsp_chdir_to_file(luabag->L, filename); luaL_lsp_session_init(luabag->L, !g_conf->cookie_name.empty() ? g_conf->cookie_name.c_str() : "LSPSESSID", g_conf->cookie_days > 0 ? g_conf->cookie_days : 7, !g_conf->cookie_path.empty() ? g_conf->cookie_path.c_str() : "/"); int status=0; switch(handler_type) { case handler_type_lsp: status=luaL_load_lsp_file(luabag->L, filename); header_table_set(r, "CONTENT-TYPE", "text/html"); break; case handler_type_lua: status=luaL_loadfile(luabag->L, filename); header_table_set(r, "CONTENT-TYPE", "text/plain"); break; } if(status) { const char* e=lua_tostring(luabag->L,-1); FCGX_PutS(e, r->err); log(LOG_ERR, "%s", e); lua_pop(luabag->L,1); luaL_lsp_chdir_restore(luabag->L); return 500; } status=lua_pcall(luabag->L,0,LUA_MULTRET,0); // won't return other than 0, as the code has been excuted with outputs if(status) { const char* e=lua_tostring(luabag->L,-1); log(LOG_ERR, "%s", e); FCGX_PutS(e, r->err); if(g_conf->show_exception) // if not 0 FCGX_PutS(e, r->err); lua_pop(luabag->L,1); } int rnum=lua_gettop(luabag->L); int result = 0; if(rnum>0) { result = lua_tointeger(luabag->L,-1); if(!result || result==200) result = 0; lua_pop(luabag->L,rnum); } luaL_lsp_chdir_restore(luabag->L); /* if(result == 0) FCGX_FFlush(r->out); else FCGX_FFlush(r->err); */ return result; }
int luaL_do_lsp_file(lua_State* L,const char* filename) { int status; if(!llsplib::use_cache) { if((status=luaL_load_lsp_file(L,filename)) || (status=lua_pcall(L,0,0,0))) return status; return 0; } char cachefile[512]; int n=snprintf(cachefile,sizeof(cachefile),"%s.luac",filename); if(n<0 || n>=0) cachefile[sizeof(cachefile)-1]=0; time_t mtime1=0; time_t mtime2=0; { struct stat st; if(!lstat(filename,&st)) mtime1=st.st_mtime; if(!lstat(cachefile,&st)) mtime2=st.st_mtime; } if(llsplib::use_cache==1) { if(mtime2) { if((status=luaL_loadfile(L,cachefile)) || (status=lua_pcall(L,0,0,0))) return status; }else { if((status=luaL_load_lsp_file(L,filename)) || (status=lua_pcall(L,0,0,0))) return status; } return 0; } if(!mtime2 || mtime2<mtime1) { if((status=luaL_load_lsp_file(L,filename))) return status; char tmp[]="/tmp/lsp_cache.XXXXXX"; int fd=mkstemp(tmp); if(fd!=-1) { status=lua_dump(L,llsplib::lsp_writer,&fd); close(fd); if(!status) rename(tmp,cachefile); } if((status=lua_pcall(L,0,0,0))) return status; return 0; } if((status=luaL_loadfile(L,cachefile)) || (status=lua_pcall(L,0,0,0))) return status; return 0; }