tincd.c -- the main file for tincd
Copyright (C) 1998-2005 Ivo Timmermans
2000-2009 Guus Sliepen <guus@tinc-vpn.org>
+ 2009 Michael Tokarev <mjt@tls.msk.ru>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#ifdef HAVE_MINGW
static struct WSAData wsa_state;
+CRITICAL_SECTION mutex;
#endif
static void usage(bool status)
generate_keys &= ~7; /* Round it to bytes */
} else
- generate_keys = 1024;
+ generate_keys = 2048;
break;
case 'R': /* chroot to NETNAME dir */
} else
fprintf(stderr, _("Done.\n"));
- asprintf(&filename, "%s/rsa_key.priv", confbase);
+ xasprintf(&filename, "%s/rsa_key.priv", confbase);
f = ask_and_open(filename, _("private RSA key"));
if(!f)
free(filename);
if(name)
- asprintf(&filename, "%s/hosts/%s", confbase, name);
+ xasprintf(&filename, "%s/hosts/%s", confbase, name);
else
- asprintf(&filename, "%s/rsa_key.pub", confbase);
+ xasprintf(&filename, "%s/rsa_key.pub", confbase);
f = ask_and_open(filename, _("public RSA key"));
#endif
if(netname)
- asprintf(&identname, "tinc.%s", netname);
+ xasprintf(&identname, "tinc.%s", netname);
else
identname = xstrdup("tinc");
if(!RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\tinc", 0, KEY_READ, &key)) {
if(!RegQueryValueEx(key, NULL, 0, 0, installdir, &len)) {
if(!logfilename)
- asprintf(&logfilename, "%s/log/%s.log", identname);
+ xasprintf(&logfilename, "%s/log/%s.log", identname);
if(!confbase) {
if(netname)
- asprintf(&confbase, "%s/%s", installdir, netname);
+ xasprintf(&confbase, "%s/%s", installdir, netname);
else
- asprintf(&confbase, "%s", installdir);
+ xasprintf(&confbase, "%s", installdir);
}
}
RegCloseKey(key);
#endif
if(!pidfilename)
- asprintf(&pidfilename, LOCALSTATEDIR "/run/%s.pid", identname);
+ xasprintf(&pidfilename, LOCALSTATEDIR "/run/%s.pid", identname);
if(!logfilename)
- asprintf(&logfilename, LOCALSTATEDIR "/log/%s.log", identname);
+ xasprintf(&logfilename, LOCALSTATEDIR "/log/%s.log", identname);
if(netname) {
if(!confbase)
- asprintf(&confbase, CONFDIR "/tinc/%s", netname);
+ xasprintf(&confbase, CONFDIR "/tinc/%s", netname);
else
logger(LOG_INFO, _("Both netname and configuration directory given, using the latter..."));
} else {
if(!confbase)
- asprintf(&confbase, CONFDIR "/tinc");
+ xasprintf(&confbase, CONFDIR "/tinc");
}
}
return true;
}
+#ifdef HAVE_MINGW
+# define setpriority(level) SetPriorityClass(GetCurrentProcess(), level)
+#else
+# define NORMAL_PRIORITY_CLASS 0
+# define BELOW_NORMAL_PRIORITY_CLASS 10
+# define HIGH_PRIORITY_CLASS -10
+# define setpriority(level) nice(level)
+#endif
+
int main(int argc, char **argv)
{
program_name = argv[0];
int main2(int argc, char **argv)
{
+ InitializeCriticalSection(&mutex);
+ EnterCriticalSection(&mutex);
#endif
if(!detach())
if(!setup_network())
goto end;
- /* Change process priority */
+ /* Initiate all outgoing connections. */
+
+ try_outgoing_connections();
+
+ /* Change process priority */
char *priority = 0;
if(get_config_string(lookup_config(config_tree, "ProcessPriority"), &priority)) {
- if(!strcasecmp(priority, "Normal")) {
-#ifdef HAVE_MINGW
- SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
-#else
- nice(0);
-#endif
- } else if(!strcasecmp(priority, "Low")) {
-#ifdef HAVE_MINGW
- SetPriorityClass(GetCurrentProcess(), BELOW_NORMAL_PRIORITY_CLASS);
-#else
- nice(10);
-#endif
- } else if(!strcasecmp(priority, "High")) {
-#ifdef HAVE_MINGW
- SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
-#else
- nice(-10);
-#endif
- } else {
+ if(!strcasecmp(priority, "Normal"))
+ setpriority(NORMAL_PRIORITY_CLASS);
+ else if(!strcasecmp(priority, "Low"))
+ setpriority(BELOW_NORMAL_PRIORITY_CLASS);
+ else if(!strcasecmp(priority, "High"))
+ setpriority(HIGH_PRIORITY_CLASS);
+ else {
logger(LOG_ERR, _("Invalid priority `%s`!"), priority);
goto end;
}
if (!drop_privs())
goto end;
- /* Initiate all outgoing connections. */
-
- try_outgoing_connections();
-
/* Start main loop. It only exits when tinc is killed. */
status = main_loop();