diff options
Diffstat (limited to 'src/openvpn/openvpn.c')
-rw-r--r-- | src/openvpn/openvpn.c | 384 |
1 files changed, 202 insertions, 182 deletions
diff --git a/src/openvpn/openvpn.c b/src/openvpn/openvpn.c index 5fb2fd9..888acda 100644 --- a/src/openvpn/openvpn.c +++ b/src/openvpn/openvpn.c @@ -5,7 +5,7 @@ * packet encryption, packet authentication, and * packet compression. * - * Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales@openvpn.net> + * Copyright (C) 2002-2017 OpenVPN Technologies, Inc. <sales@openvpn.net> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 @@ -39,13 +39,13 @@ #include "forward-inline.h" -#define P2P_CHECK_SIG() EVENT_LOOP_CHECK_SIGNAL (c, process_signal_p2p, c); +#define P2P_CHECK_SIG() EVENT_LOOP_CHECK_SIGNAL(c, process_signal_p2p, c); static bool -process_signal_p2p (struct context *c) +process_signal_p2p(struct context *c) { - remap_signal (c); - return process_signal (c); + remap_signal(c); + return process_signal(c); } @@ -59,49 +59,51 @@ process_signal_p2p (struct context *c) * @param c - The context structure of the single active VPN tunnel. */ static void -tunnel_point_to_point (struct context *c) +tunnel_point_to_point(struct context *c) { - context_clear_2 (c); + context_clear_2(c); - /* set point-to-point mode */ - c->mode = CM_P2P; + /* set point-to-point mode */ + c->mode = CM_P2P; - /* initialize tunnel instance */ - init_instance_handle_signals (c, c->es, CC_HARD_USR1_TO_HUP); - if (IS_SIG (c)) - return; + /* initialize tunnel instance */ + init_instance_handle_signals(c, c->es, CC_HARD_USR1_TO_HUP); + if (IS_SIG(c)) + { + return; + } - /* main event loop */ - while (true) + /* main event loop */ + while (true) { - perf_push (PERF_EVENT_LOOP); + perf_push(PERF_EVENT_LOOP); - /* process timers, TLS, etc. */ - pre_select (c); - P2P_CHECK_SIG(); + /* process timers, TLS, etc. */ + pre_select(c); + P2P_CHECK_SIG(); - /* set up and do the I/O wait */ - io_wait (c, p2p_iow_flags (c)); - P2P_CHECK_SIG(); + /* set up and do the I/O wait */ + io_wait(c, p2p_iow_flags(c)); + P2P_CHECK_SIG(); - /* timeout? */ - if (c->c2.event_set_status == ES_TIMEOUT) - { - perf_pop (); - continue; - } + /* timeout? */ + if (c->c2.event_set_status == ES_TIMEOUT) + { + perf_pop(); + continue; + } - /* process the I/O which triggered select */ - process_io (c); - P2P_CHECK_SIG(); + /* process the I/O which triggered select */ + process_io(c); + P2P_CHECK_SIG(); - perf_pop (); + perf_pop(); } - uninit_management_callback (); + uninit_management_callback(); - /* tear down tunnel instance (unless --persist-tun) */ - close_instance (c); + /* tear down tunnel instance (unless --persist-tun) */ + close_instance(c); } #undef PROCESS_SIGNAL_P2P @@ -129,219 +131,237 @@ tunnel_point_to_point (struct context *c) */ static int -openvpn_main (int argc, char *argv[]) +openvpn_main(int argc, char *argv[]) { - struct context c; + struct context c; #if PEDANTIC - fprintf (stderr, "Sorry, I was built with --enable-pedantic and I am incapable of doing any real work!\n"); - return 1; + fprintf(stderr, "Sorry, I was built with --enable-pedantic and I am incapable of doing any real work!\n"); + return 1; #endif #ifdef _WIN32 - SetConsoleOutputCP (CP_UTF8); + SetConsoleOutputCP(CP_UTF8); #endif - CLEAR (c); + CLEAR(c); - /* signify first time for components which can - only be initialized once per program instantiation. */ - c.first_time = true; + /* signify first time for components which can + * only be initialized once per program instantiation. */ + c.first_time = true; - /* initialize program-wide statics */ - if (init_static ()) + /* initialize program-wide statics */ + if (init_static()) { - /* - * This loop is initially executed on startup and then - * once per SIGHUP. - */ - do - { - /* enter pre-initialization mode with regard to signal handling */ - pre_init_signal_catch (); - - /* zero context struct but leave first_time member alone */ - context_clear_all_except_first_time (&c); - - /* static signal info object */ - CLEAR (siginfo_static); - c.sig = &siginfo_static; - - /* initialize garbage collector scoped to context object */ - gc_init (&c.gc); - - /* initialize environmental variable store */ - c.es = env_set_create (NULL); + /* + * This loop is initially executed on startup and then + * once per SIGHUP. + */ + do + { + /* enter pre-initialization mode with regard to signal handling */ + pre_init_signal_catch(); + + /* zero context struct but leave first_time member alone */ + context_clear_all_except_first_time(&c); + + /* static signal info object */ + CLEAR(siginfo_static); + c.sig = &siginfo_static; + + /* initialize garbage collector scoped to context object */ + gc_init(&c.gc); + + /* initialize environmental variable store */ + c.es = env_set_create(NULL); #ifdef _WIN32 - set_win_sys_path_via_env (c.es); + set_win_sys_path_via_env(c.es); #endif #ifdef ENABLE_MANAGEMENT - /* initialize management subsystem */ - init_management (&c); + /* initialize management subsystem */ + init_management(&c); #endif - /* initialize options to default state */ - init_options (&c.options, true); + /* initialize options to default state */ + init_options(&c.options, true); - /* parse command line options, and read configuration file */ - parse_argv (&c.options, argc, argv, M_USAGE, OPT_P_DEFAULT, NULL, c.es); + /* parse command line options, and read configuration file */ + parse_argv(&c.options, argc, argv, M_USAGE, OPT_P_DEFAULT, NULL, c.es); #ifdef ENABLE_PLUGIN - /* plugins may contribute options configuration */ - init_verb_mute (&c, IVM_LEVEL_1); - init_plugins (&c); - open_plugins (&c, true, OPENVPN_PLUGIN_INIT_PRE_CONFIG_PARSE); + /* plugins may contribute options configuration */ + init_verb_mute(&c, IVM_LEVEL_1); + init_plugins(&c); + open_plugins(&c, true, OPENVPN_PLUGIN_INIT_PRE_CONFIG_PARSE); #endif - /* init verbosity and mute levels */ - init_verb_mute (&c, IVM_LEVEL_1); + /* init verbosity and mute levels */ + init_verb_mute(&c, IVM_LEVEL_1); - /* set dev options */ - init_options_dev (&c.options); + /* set dev options */ + init_options_dev(&c.options); - /* openssl print info? */ - if (print_openssl_info (&c.options)) - break; + /* openssl print info? */ + if (print_openssl_info(&c.options)) + { + break; + } - /* --genkey mode? */ - if (do_genkey (&c.options)) - break; + /* --genkey mode? */ + if (do_genkey(&c.options)) + { + break; + } - /* tun/tap persist command? */ - if (do_persist_tuntap (&c.options)) - break; + /* tun/tap persist command? */ + if (do_persist_tuntap(&c.options)) + { + break; + } - /* sanity check on options */ - options_postprocess (&c.options); + /* sanity check on options */ + options_postprocess(&c.options); - /* show all option settings */ - show_settings (&c.options); + /* show all option settings */ + show_settings(&c.options); - /* print version number */ - msg (M_INFO, "%s", title_string); + /* print version number */ + msg(M_INFO, "%s", title_string); #ifdef _WIN32 - show_windows_version(M_INFO); + show_windows_version(M_INFO); #endif - show_library_versions(M_INFO); + show_library_versions(M_INFO); - /* misc stuff */ - pre_setup (&c.options); + /* misc stuff */ + pre_setup(&c.options); - /* test crypto? */ - if (do_test_crypto (&c.options)) - break; + /* test crypto? */ + if (do_test_crypto(&c.options)) + { + break; + } - /* Query passwords before becoming a daemon if we don't use the - * management interface to get them. */ + /* Query passwords before becoming a daemon if we don't use the + * management interface to get them. */ #ifdef ENABLE_MANAGEMENT - if (!(c.options.management_flags & MF_QUERY_PASSWORDS)) + if (!(c.options.management_flags & MF_QUERY_PASSWORDS)) #endif - init_query_passwords (&c); + init_query_passwords(&c); - /* become a daemon if --daemon */ - if (c.first_time) - { - c.did_we_daemonize = possibly_become_daemon (&c.options); - write_pid (c.options.writepid); - } + /* become a daemon if --daemon */ + if (c.first_time) + { + c.did_we_daemonize = possibly_become_daemon(&c.options); + write_pid(c.options.writepid); + } #ifdef ENABLE_MANAGEMENT - /* open management subsystem */ - if (!open_management (&c)) - break; - /* query for passwords through management interface, if needed */ - if (c.options.management_flags & MF_QUERY_PASSWORDS) - init_query_passwords (&c); + /* open management subsystem */ + if (!open_management(&c)) + { + break; + } + /* query for passwords through management interface, if needed */ + if (c.options.management_flags & MF_QUERY_PASSWORDS) + { + init_query_passwords(&c); + } #endif - /* set certain options as environmental variables */ - setenv_settings (c.es, &c.options); + /* set certain options as environmental variables */ + setenv_settings(c.es, &c.options); - /* finish context init */ - context_init_1 (&c); + /* finish context init */ + context_init_1(&c); + + do + { + /* run tunnel depending on mode */ + switch (c.options.mode) + { + case MODE_POINT_TO_POINT: + tunnel_point_to_point(&c); + break; - do - { - /* run tunnel depending on mode */ - switch (c.options.mode) - { - case MODE_POINT_TO_POINT: - tunnel_point_to_point (&c); - break; #if P2MP_SERVER - case MODE_SERVER: - tunnel_server (&c); - break; + case MODE_SERVER: + tunnel_server(&c); + break; + #endif - default: - ASSERT (0); - } - - /* indicates first iteration -- has program-wide scope */ - c.first_time = false; - - /* any signals received? */ - if (IS_SIG (&c)) - print_signal (c.sig, NULL, M_INFO); - - /* pass restart status to management subsystem */ - signal_restart_status (c.sig); - } - while (c.sig->signal_received == SIGUSR1); - - uninit_options (&c.options); - gc_reset (&c.gc); - } - while (c.sig->signal_received == SIGHUP); + default: + ASSERT(0); + } + + /* indicates first iteration -- has program-wide scope */ + c.first_time = false; + + /* any signals received? */ + if (IS_SIG(&c)) + { + print_signal(c.sig, NULL, M_INFO); + } + + /* pass restart status to management subsystem */ + signal_restart_status(c.sig); + } + while (c.sig->signal_received == SIGUSR1); + + uninit_options(&c.options); + gc_reset(&c.gc); + } + while (c.sig->signal_received == SIGHUP); } - context_gc_free (&c); + context_gc_free(&c); - env_set_destroy (c.es); + env_set_destroy(c.es); #ifdef ENABLE_MANAGEMENT - /* close management interface */ - close_management (); + /* close management interface */ + close_management(); #endif - /* uninitialize program-wide statics */ - uninit_static (); + /* uninitialize program-wide statics */ + uninit_static(); - openvpn_exit (OPENVPN_EXIT_STATUS_GOOD); /* exit point */ - return 0; /* NOTREACHED */ + openvpn_exit(OPENVPN_EXIT_STATUS_GOOD); /* exit point */ + return 0; /* NOTREACHED */ } #ifdef _WIN32 int -wmain (int argc, wchar_t *wargv[]) { - char **argv; - int ret; - int i; +wmain(int argc, wchar_t *wargv[]) { + char **argv; + int ret; + int i; - if ((argv = calloc(argc+1, sizeof(char*))) == NULL) - return 1; + if ((argv = calloc(argc+1, sizeof(char *))) == NULL) + { + return 1; + } - for (i = 0; i < argc; i++) + for (i = 0; i < argc; i++) { - int n = WideCharToMultiByte (CP_UTF8, 0, wargv[i], -1, NULL, 0, NULL, NULL); - argv[i] = malloc (n); - WideCharToMultiByte (CP_UTF8, 0, wargv[i], -1, argv[i], n, NULL, NULL); + int n = WideCharToMultiByte(CP_UTF8, 0, wargv[i], -1, NULL, 0, NULL, NULL); + argv[i] = malloc(n); + WideCharToMultiByte(CP_UTF8, 0, wargv[i], -1, argv[i], n, NULL, NULL); } - ret = openvpn_main(argc, argv); + ret = openvpn_main(argc, argv); - for (i=0; i < argc; i++ ) + for (i = 0; i < argc; i++) { - free (argv[i]); + free(argv[i]); } - free(argv); + free(argv); - return ret; + return ret; } -#else +#else /* ifdef _WIN32 */ int -main (int argc, char *argv[]) { - return openvpn_main(argc, argv); +main(int argc, char *argv[]) { + return openvpn_main(argc, argv); } -#endif +#endif /* ifdef _WIN32 */ |