#include "lib_acl.h"
#include "http_plugin.h"

char *var_cfg_log_name;
char *var_cfg_cgi_bin;

static ACL_CFG_STR_TABLE __conf_str_tab[] = {
	/* 配置项名称, 配置项缺省值, 存储配置项值的地址 */
	{ "logpath", "/tmp/cgifilter.log", &var_cfg_log_name },
	{ "cgi-bin", "/opt/jaws/www/cgi-bin", &var_cfg_cgi_bin },

	{ 0, 0, 0 }
};

int   var_cfg_data_clone;
static int   var_cfg_debug_mem;

static ACL_CFG_BOOL_TABLE __conf_bool_tab[] = {
	/* 配置项名称, 配置项缺省值, 存储配置项值的地址 */
	{ "data_clone", 0, &var_cfg_data_clone },
	{ "debug_mem", 0, &var_cfg_debug_mem },
	{ 0, 0 , 0 }
};

static int var_cfg_threads_limit;
static int var_cfg_threads_idle;

static ACL_CFG_INT_TABLE __conf_int_tab[] = {
	/* 配置项名称, 配置项缺省值, 存储配置项值的地址 */
	{ "threads_limit", 100, &var_cfg_threads_limit, 0, 0 },
	{ "threads_idle", 120, &var_cfg_threads_idle, 0, 0 },
	{ 0, 0 , 0, 0, 0 }
};

void http_conf_load(const char *cfg_dir)
{
	char *filepath;
	ACL_XINETD_CFG_PARSER *cfg;
	const ACL_ARRAY *cgi_maps;

	/* 读取配置文件 */

	filepath = acl_concatenate((cfg_dir && *cfg_dir)
			? cfg_dir : "/tmp", "/cgi.cf", NULL);
	cfg = acl_xinetd_cfg_load(filepath);
	if (cfg == NULL)
		acl_msg_warn("load cfg(%s) error(%s)",
			filepath, acl_last_serror());

	acl_xinetd_params_str_table(cfg, __conf_str_tab);
	acl_xinetd_params_int_table(cfg, __conf_int_tab);
	acl_xinetd_params_bool_table(cfg, __conf_bool_tab);

	cgi_maps = acl_xinetd_cfg_get_ex(cfg, "cgi-map");
	if (cgi_maps) {
		ACL_ITER iter;

		acl_foreach(iter, (ACL_ARRAY*) cgi_maps) {
			const char *cgi_map = (const char*) iter.data;
			ACL_ARGV *cgi_argv = acl_argv_split(cgi_map, "\t ");
			ACL_ITER iter2;

			if (cgi_argv->argc < 2) {
				acl_msg_warn("%s(%d): cgi-map(%s) invalid",
					__FUNCTION__, __LINE__, cgi_map);
				acl_argv_free(cgi_argv);
				continue;
			}
			acl_foreach(iter2, cgi_argv) {
				char *ptr = (char*) iter2.data;
				acl_lowercase(ptr);
			}
			http_cgi_add1(cgi_argv);
			acl_argv_free(cgi_argv);
		}
	}

	if (cfg)
		acl_xinetd_cfg_free(cfg);
	acl_myfree(filepath);

	/* 初始化CGI模块 */
	http_cgi_init();

	/* 创建线程池 */
	http_plugin_pool_create(var_cfg_threads_limit, var_cfg_threads_idle);

	http_plugin_debug_memory(var_cfg_debug_mem);
}
