#include #include #include "main.h" struct global global; struct tcp_mode http, https; struct save_header *saveHdrs; char *default_ssl_request; int default_ssl_request_len; void *timeout_check(void *nullPtr) { while (1) { sleep(60); if (global.udp_listen_fd >= 0) udp_timeout_check(); } return NULL; } /* 初始化变量 */ static void initVariable() { memset(&global, 0, sizeof(global)); memset(&https, 0, sizeof(https)); memset(&udp, 0, sizeof(udp)); saveHdrs = NULL; http.dst.sin_family = https.dst.sin_family = udp.dst.sin_family = AF_INET; global.tcp_listen_fd = global.udp_listen_fd = global.uid = -1; } static void server_init() { /* 忽略PIPE信号 */ signal(SIGPIPE, SIG_IGN); //不能用setgid和setuid,这两个函数不能切换回root,可能导致HTTPUDP代理失败 if (global.uid > -1 && (setegid(global.uid) == -1 || seteuid(global.uid) == -1)) { perror("setegid(or seteuid)"); exit(1); } #ifndef DEBUG if (daemon(1, 1) == -1) { perror("daemon"); exit(1); } #endif /* 一个进程只开一个子进程, 程序结束时子进程先写入dns缓存, 之后主进程再写入, 否则可能导致缓存文件格式错误 */ //while (global.procs-- > 1 && (child_pid = fork()) == 0); } static void start_server_loop() { //printf("%s", udp.http_request); //printf("%d\n", udp.http_request_len); pthread_t thread_id; if (global.timeout_m) pthread_create(&thread_id, NULL, &timeout_check, NULL); udp_init(); udp_loop(NULL); } int main(int argc, char *argv[]) { initVariable(); read_conf(argv[1]); server_init(); start_server_loop(); return 0; }