-/*
- Set all files and paths according to netname
-*/
-void make_names(void)
-{
- if(netname)
- {
- if(!pidfilename)
- asprintf(&pidfilename, LOCALSTATEDIR "/run/tinc.%s.pid", netname);
- if(!confbase)
- asprintf(&confbase, "%s/tinc/%s", CONFDIR, netname);
- else
- syslog(LOG_INFO, _("Both netname and configuration directory given, using the latter..."));
- if(!identname)
- asprintf(&identname, "tinc.%s", netname);
- }
- else
- {
- if(!pidfilename)
- pidfilename = LOCALSTATEDIR "/run/tinc.pid";
- if(!confbase)
- asprintf(&confbase, "%s/tinc", CONFDIR);
- if(!identname)
- identname = "tinc";
- }
+static BOOL WINAPI console_ctrl_handler(DWORD type) {
+ logger(DEBUG_ALWAYS, LOG_NOTICE, "Got console shutdown request");
+ if (WSASetEvent(stop_io.event) == FALSE)
+ abort();
+ return TRUE;
+}
+#else
+# define NORMAL_PRIORITY_CLASS 0
+# define BELOW_NORMAL_PRIORITY_CLASS 10
+# define HIGH_PRIORITY_CLASS -10
+# define setpriority(level) (setpriority(PRIO_PROCESS, 0, (level)))
+#endif
+
+int main(int argc, char **argv) {
+ program_name = argv[0];
+
+ if(!parse_options(argc, 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-2015 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"
+ "see the file COPYING for details.\n");
+
+ return 0;
+ }
+
+ if(show_help) {
+ usage(false);
+ return 0;
+ }
+
+#ifdef HAVE_MINGW
+ if(WSAStartup(MAKEWORD(2, 2), &wsa_state)) {
+ logger(DEBUG_ALWAYS, LOG_ERR, "System call `%s' failed: %s", "WSAStartup", winerror(GetLastError()));
+ return 1;
+ }
+#else
+ // Check if we got an umbilical fd from the process that started us
+ char *umbstr = getenv("TINC_UMBILICAL");
+ if(umbstr) {
+ umbilical = atoi(umbstr);
+ if(fcntl(umbilical, F_GETFL) < 0)
+ umbilical = 0;
+#ifdef FD_CLOEXEC
+ if(umbilical)
+ fcntl(umbilical, F_SETFD, FD_CLOEXEC);
+#endif
+ }
+#endif
+
+ openlogger("tinc", use_logfile?LOGMODE_FILE:LOGMODE_STDERR);
+
+ g_argv = argv;
+
+ if(getenv("LISTEN_PID") && atoi(getenv("LISTEN_PID")) == getpid())
+ do_detach = false;
+#ifdef HAVE_UNSETENV
+ unsetenv("LISTEN_PID");
+#endif
+
+ init_configuration(&config_tree);
+
+ /* Slllluuuuuuurrrrp! */
+
+ gettimeofday(&now, NULL);
+ srand(now.tv_sec + now.tv_usec);
+ crypto_init();
+
+ if(!read_server_config())
+ return 1;
+
+#ifdef HAVE_LZO
+ if(lzo_init() != LZO_E_OK) {
+ logger(DEBUG_ALWAYS, LOG_ERR, "Error initializing LZO compressor!");
+ return 1;
+ }
+#endif
+
+#ifdef HAVE_MINGW
+ io_add_event(&stop_io, stop_handler, NULL, WSACreateEvent());
+ if (stop_io.event == FALSE)
+ abort();
+
+ int result;
+ if(!do_detach || !init_service()) {
+ SetConsoleCtrlHandler(console_ctrl_handler, TRUE);
+ result = main2(argc, argv);
+ } else
+ result = 1;
+
+ if (WSACloseEvent(stop_io.event) == FALSE)
+ abort();
+ io_del(&stop_io);
+ return result;