X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Ftincd.c;h=35a84be1230e9b74acbb4bd4f8d6ce99ec4622ca;hb=1545909dcb3ac618754486f4ccd4d8f237d64bb7;hp=ab4d92128725acdab52c41c1f130cf4d61d63da1;hpb=f6e87ab476a0faf8b124ecaaa27f967d825e6457;p=tinc diff --git a/src/tincd.c b/src/tincd.c index ab4d9212..35a84be1 100644 --- a/src/tincd.c +++ b/src/tincd.c @@ -1,7 +1,7 @@ /* tincd.c -- the main file for tincd Copyright (C) 1998-2005 Ivo Timmermans - 2000-2016 Guus Sliepen + 2000-2021 Guus Sliepen 2008 Max Rijevski 2009 Michael Tokarev 2010 Julien Muchembled @@ -37,6 +37,10 @@ #include LZO1X_H #endif +#ifdef LZ4_H +#include LZ4_H +#endif + #ifndef HAVE_MINGW #include #include @@ -44,14 +48,11 @@ #endif #include "conf.h" -#include "control.h" #include "crypto.h" -#include "device.h" #include "event.h" #include "logger.h" #include "names.h" #include "net.h" -#include "netutl.h" #include "process.h" #include "protocol.h" #include "utils.h" @@ -155,6 +156,7 @@ static bool parse_options(int argc, char **argv) { break; case 'c': /* config file */ + free(confbase); confbase = xstrdup(optarg); break; @@ -165,7 +167,7 @@ static bool parse_options(int argc, char **argv) { case 'L': /* no detach */ #ifndef HAVE_MLOCKALL logger(DEBUG_ALWAYS, LOG_ERR, "The %s option is not supported on this platform.", argv[optind - 1]); - return false; + goto exit_fail; #else do_mlock = true; break; @@ -185,6 +187,7 @@ static bool parse_options(int argc, char **argv) { break; case 'n': /* net name given */ + free(netname); netname = xstrdup(optarg); break; @@ -197,7 +200,7 @@ static bool parse_options(int argc, char **argv) { cfg = parse_config_line(optarg, NULL, ++lineno); if(!cfg) { - return false; + goto exit_fail; } list_insert_tail(cmdline_conf, cfg); @@ -208,7 +211,7 @@ static bool parse_options(int argc, char **argv) { case 'R': case 'U': logger(DEBUG_ALWAYS, LOG_ERR, "The %s option is not supported on this platform.", argv[optind - 1]); - return false; + goto exit_fail; #else case 'R': /* chroot to NETNAME dir */ @@ -241,18 +244,20 @@ static bool parse_options(int argc, char **argv) { } if(optarg) { + free(logfilename); logfilename = xstrdup(optarg); } break; case 5: /* open control socket here */ + free(pidfilename); pidfilename = xstrdup(optarg); break; case '?': /* wrong options */ usage(true); - return false; + goto exit_fail; default: break; @@ -262,7 +267,7 @@ static bool parse_options(int argc, char **argv) { if(optind < argc) { fprintf(stderr, "%s: unrecognized argument '%s'\n", argv[0], argv[optind]); usage(true); - return false; + goto exit_fail; } if(!netname && (netname = getenv("NETNAME"))) { @@ -278,7 +283,7 @@ static bool parse_options(int argc, char **argv) { if(netname && !check_netname(netname, false)) { fprintf(stderr, "Invalid character in netname!\n"); - return false; + goto exit_fail; } if(netname && !check_netname(netname, true)) { @@ -286,6 +291,12 @@ static bool parse_options(int argc, char **argv) { } return true; + +exit_fail: + free_names(); + list_delete_list(cmdline_conf); + cmdline_conf = NULL; + return false; } static bool drop_privs(void) { @@ -344,10 +355,15 @@ static bool drop_privs(void) { # define setpriority(level) !SetPriorityClass(GetCurrentProcess(), (level)) static void stop_handler(void *data, int flags) { + (void)data; + (void)flags; + event_exit(); } static BOOL WINAPI console_ctrl_handler(DWORD type) { + (void)type; + logger(DEBUG_ALWAYS, LOG_NOTICE, "Got console shutdown request"); if(WSASetEvent(stop_io.event) == FALSE) { @@ -363,6 +379,15 @@ static BOOL WINAPI console_ctrl_handler(DWORD type) { # define setpriority(level) (setpriority(PRIO_PROCESS, 0, (level))) #endif +static void cleanup() { + if(config_tree) { + exit_configuration(&config_tree); + } + + list_delete_list(cmdline_conf); + free_names(); +} + int main(int argc, char **argv) { program_name = argv[0]; @@ -370,13 +395,45 @@ int main(int argc, char **argv) { return 1; } - make_names(true); - chdir(confbase); - if(show_version) { printf("%s version %s (built %s %s, protocol %d.%d)\n", PACKAGE, BUILD_VERSION, BUILD_DATE, BUILD_TIME, PROT_MAJOR, PROT_MINOR); - printf("Copyright (C) 1998-2016 Ivo Timmermans, Guus Sliepen and others.\n" + printf("Features:" +#ifdef HAVE_OPENSSL + " openssl" +#endif +#ifdef HAVE_LIBGCRYPT + " libgcrypt" +#endif +#ifdef HAVE_LZO + " comp_lzo" +#endif +#ifdef HAVE_ZLIB + " comp_zlib" +#endif +#ifdef HAVE_LZ4 + " comp_lz4" +#endif +#ifndef DISABLE_LEGACY + " legacy_protocol" +#endif +#ifdef ENABLE_JUMBOGRAMS + " jumbograms" +#endif +#ifdef ENABLE_TUNEMU + " tunemu" +#endif +#ifdef HAVE_MINIUPNPC + " miniupnpc" +#endif +#ifdef ENABLE_UML + " uml" +#endif +#ifdef ENABLE_VDE + " vde" +#endif + "\n\n"); + printf("Copyright (C) 1998-2021 Ivo Timmermans, Guus Sliepen and others.\n" "See the AUTHORS file for a complete list.\n\n" "tinc comes with ABSOLUTELY NO WARRANTY. This is free software,\n" "and you are welcome to redistribute it under certain conditions;\n" @@ -390,6 +447,11 @@ int main(int argc, char **argv) { return 0; } + make_names(true); + atexit(cleanup); + + chdir(confbase); + #ifdef HAVE_MINGW if(WSAStartup(MAKEWORD(2, 2), &wsa_state)) { @@ -439,7 +501,7 @@ int main(int argc, char **argv) { srand(now.tv_sec + now.tv_usec); crypto_init(); - if(!read_server_config()) { + if(!read_server_config(config_tree)) { return 1; } @@ -481,6 +543,8 @@ int main(int argc, char **argv) { } int main2(int argc, char **argv) { + (void)argc; + (void)argv; #endif char *priority = NULL; @@ -561,9 +625,5 @@ end: crypto_exit(); - exit_configuration(&config_tree); - free(cmdline_conf); - free_names(); - return status; }