From b59af50aece804a8c22f7d71e0555f5fe574ac12 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sun, 28 Dec 2008 17:05:32 +0000 Subject: int main() is pretty finished now --- src/options.c | 13 +++++++ src/signal.c | 6 ++-- src/tun_helper.h | 4 ++- src/uanytun.c | 102 ++++++++++++++++++++++++++++++++++--------------------- 4 files changed, 83 insertions(+), 42 deletions(-) diff --git a/src/options.c b/src/options.c index 7dd25c9..d2540b1 100644 --- a/src/options.c +++ b/src/options.c @@ -172,6 +172,19 @@ int options_parse(options_t** opt, int argc, char* argv[]) return -1; } + if(!strcmp((*opt)->cipher_, "null") && !strcmp((*opt)->auth_algo_, "null")) { + if((*opt)->kd_prf_) free((*opt)->kd_prf_); + (*opt)->kd_prf_ = strdup("null"); + } + if((strcmp((*opt)->cipher_, "null") || strcmp((*opt)->auth_algo_, "null")) && + !strcmp((*opt)->kd_prf_, "null")) { + if((*opt)->kd_prf_) free((*opt)->kd_prf_); + (*opt)->kd_prf_ = strdup("aes-ctr"); + } + + if(!((*opt)->dev_name_) && !((*opt)->dev_type_)) + (*opt)->dev_type_ = strdup("tun"); + return 0; } diff --git a/src/signal.c b/src/signal.c index a34091f..1086969 100644 --- a/src/signal.c +++ b/src/signal.c @@ -64,9 +64,9 @@ void handle_signal(int sig) void handle_signal_exit(int sig) { switch(sig) { - case SIGINT: log_printf(NOTICE, "SIG-Int caught, exiting"); break; - case SIGQUIT: log_printf(NOTICE, "SIG-Quit caught, exiting"); break; - case SIGTERM: log_printf(NOTICE, "SIG-Term caught, exiting"); break; + case SIGINT: log_printf(NOTICE, "SIG-Int caught, exitting"); break; + case SIGQUIT: log_printf(NOTICE, "SIG-Quit caught, exitting"); break; + case SIGTERM: log_printf(NOTICE, "SIG-Term caught, exitting"); break; default: log_printf(NOTICE, "Signal %d caught, ignoring", sig); return; } diff --git a/src/tun_helper.h b/src/tun_helper.h index c403f28..b403891 100644 --- a/src/tun_helper.h +++ b/src/tun_helper.h @@ -55,7 +55,9 @@ void tun_conf(tun_device_t* dev, const char* dev_name, const char* dev_type, con else if(!strncmp(dev_name, "tap", 3)) dev->type_ = TYPE_TAP; } - + + dev->local_ = NULL; + dev->remote_netmask_ = NULL; if(ifcfg_lp) dev->local_ = strdup(ifcfg_lp); if(ifcfg_rnmp) diff --git a/src/uanytun.c b/src/uanytun.c index 53a6219..5ccab3b 100644 --- a/src/uanytun.c +++ b/src/uanytun.c @@ -51,7 +51,7 @@ #include "daemon.h" #include "sysexec.h" -void main_loop(tun_device_t* dev, udp_socket_t* sock) +void main_loop(tun_device_t* dev, udp_socket_t* sock, options_t* opt) { log_printf(INFO, "entering main loop"); @@ -88,8 +88,7 @@ void main_loop(tun_device_t* dev, udp_socket_t* sock) /* } */ /* tun_write(dev, plain_packet_get_payload(&plain_packet), plain_packet_get_payload_length(&plain_packet)); */ - - + sleep(1); } } @@ -117,45 +116,72 @@ int main(int argc, char* argv[]) int ret = options_parse(&opt, argc, argv); if(ret) { options_print_usage(); + log_printf(ERR, "error on options_parse, exitting"); exit(ret); } - options_print(opt); - -// chrootAndDrop("/var/run/", "nobody"); -// daemonize(); -// log_printf(INFO, "running in background now"); - -/* tun_device_t* dev; */ -/* tun_init(&dev, NULL, "tun", "192.168.23.1", "192.168.23.2"); */ -/* if(!dev) { */ -/* log_printf(ERR, "error on tun_init"); */ -/* exit(-1); */ -/* } */ - -/* int ret = exec_script("post-up.sh", dev->actual_name_); */ -/* log_printf(NOTICE, "post-up script returned %d", ret); */ - -/* udp_socket_t* sock; */ -/* udp_init(&sock, NULL, "4444"); */ -/* if(!sock) { */ -/* log_printf(ERR, "error on udp_init"); */ -/* exit(-1); */ -/* } */ -/* char* local_string = udp_get_local_end_string(sock); */ -/* log_printf(INFO, "listening on: %s", local_string); */ -/* free(local_string); */ - -/* udp_set_remote(sock, "1.2.3.4", "4444"); */ -/* char* remote_string = udp_get_remote_end_string(sock); */ -/* log_printf(INFO, "set remote end to: %s", remote_string); */ -/* free(remote_string); */ - -/* main_loop(dev, sock); */ - -/* tun_close(&dev); */ -/* udp_close(&sock); */ + + tun_device_t* dev; + tun_init(&dev, opt->dev_name_, opt->dev_type_, opt->ifconfig_param_local_, opt->ifconfig_param_remote_netmask_); + if(!dev) { + log_printf(ERR, "error on tun_init, exitting"); + exit(-1); + } + log_printf(NOTICE, "dev of type '%s' opened, actual name is '%s'", tun_get_type_string(dev), dev->actual_name_); + + if(opt->post_up_script_) { + int ret = exec_script(opt->post_up_script_, dev->actual_name_); + log_printf(NOTICE, "post-up script returned %d", ret); + } + + + udp_socket_t* sock; + udp_init(&sock, opt->local_addr_, opt->local_port_); + if(!sock) { + log_printf(ERR, "error on udp_init, exitting"); + exit(-1); + } + char* local_string = udp_get_local_end_string(sock); + log_printf(NOTICE, "listening on: %s", local_string); + free(local_string); + + if(opt->remote_addr_) { + udp_set_remote(sock, opt->remote_addr_, opt->remote_port_); + char* remote_string = udp_get_remote_end_string(sock); + log_printf(NOTICE, "set remote end to: %s", remote_string); + free(remote_string); + } + + + FILE* pid_file = NULL; + if(opt->pid_file_) { + pid_file = fopen(opt->pid_file_, "w"); + if(!pid_file) { + log_printf(WARNING, "unable to open pid file: %m"); + } + } + + if(opt->chroot_) + chrootAndDrop("/var/run/", "nobody"); + if(opt->daemonize_) { + pid_t oldpid = getpid(); + daemonize(); + log_printf(INFO, "running in background now (old pid: %d)", oldpid); + } + + if(pid_file) { + pid_t pid = getpid(); + fprintf(pid_file, "%d", pid); + fclose(pid_file); + } + + main_loop(dev, sock, opt); + + tun_close(&dev); + udp_close(&sock); options_clear(&opt); + log_printf(NOTICE, "normal shutdown"); + return 0; } -- cgit v1.2.3