a sandboxed Lua backend for FastCGI
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
 
 
 

126 lines
2.4 KiB

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <lua5.1/lua.h>
#include <lua5.1/lauxlib.h>
#include <lua5.1/lualib.h>
#include "config.h"
// Checks if a file exists
static int LF_fileexists(char *path)
{
if(access(path, F_OK) == 0){ return 1; }
else { return 0; }
}
// Create configuration with default settings
LF_config *LF_createconfig()
{
LF_config *c = malloc(sizeof(LF_config));
if(c == NULL){ return NULL; }
// Default settings
c->listen = "127.0.0.1:9222";
c->backlog = 100;
c->threads = 1;
c->sandbox = 1;
c->mem_max = 65536;
c->output_max = 65536;
c->cpu_usec = 500000;
c->cpu_sec = 0;
return c;
}
// Load configuration
int LF_loadconfig(LF_config *cfg, char *path)
{
if(!LF_fileexists(path)){ return 1; }
lua_State *l = luaL_newstate();
if(luaL_loadfile(l, path) || lua_pcall(l,0,1,0)){
printf("%s\n", lua_tostring(l, -1));
lua_close(l);
return 1;
}
lua_settop(l, 1);
if(lua_istable(l, 1)){
lua_pushstring(l, "listen");
lua_rawget(l, 1);
if(lua_isstring(l, 2)){
size_t len = 0;
const char *str = lua_tolstring(l, 2, &len);
if(len > 0){
cfg->listen = malloc(len+1);
memcpy(cfg->listen, str, len+1);
}
}
lua_settop(l, 1);
lua_pushstring(l, "backlog");
lua_rawget(l, 1);
if(lua_isnumber(l, 2)){ cfg->backlog = lua_tonumber(l, 2); }
lua_settop(l, 1);
lua_pushstring(l, "threads");
lua_rawget(l, 1);
if(lua_isnumber(l, 2)){ cfg->threads = lua_tonumber(l, 2); }
lua_settop(l, 1);
lua_pushstring(l, "sandbox");
lua_rawget(l, 1);
if(lua_isboolean(l, 2)){ cfg->sandbox = lua_toboolean(l, 2); }
lua_settop(l, 1);
lua_pushstring(l, "mem_max");
lua_rawget(l, 1);
if(lua_isnumber(l, 2)){ cfg->mem_max = lua_tonumber(l, 2); }
lua_settop(l, 1);
lua_pushstring(l, "cpu_usec");
lua_rawget(l, 1);
if(lua_isnumber(l, 2)){ cfg->cpu_usec = lua_tonumber(l, 2); }
lua_settop(l, 1);
lua_pushstring(l, "cpu_sec");
lua_rawget(l, 1);
if(lua_isnumber(l, 2)){ cfg->cpu_sec = lua_tonumber(l, 2); }
lua_settop(l, 1);
lua_pushstring(l, "output_max");
lua_rawget(l, 1);
if(lua_isnumber(l, 2)){ cfg->output_max = lua_tonumber(l, 2); }
lua_settop(l, 1);
lua_pushstring(l, "content_type");
lua_rawget(l, 1);
if(lua_isstring(l, 2)){
size_t len = 0;
const char *str = lua_tolstring(l, 2, &len);
if(len > 0){
cfg->content_type = malloc(len+1);
memcpy(cfg->content_type, str, len+1);
}
}
}
lua_close(l);
return 0;
}