along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- $Id: tincd.c,v 1.10.4.76 2003/07/22 20:55:20 guus Exp $
+ $Id: tincd.c,v 1.10.4.81 2003/08/02 21:33:52 guus Exp $
*/
#include "system.h"
#include <lzo1x.h>
+#include <getopt.h>
+
#include "conf.h"
+#include "device.h"
#include "logger.h"
#include "net.h"
#include "netutl.h"
char *pidfilename = NULL; /* pid file location */
char *logfilename = NULL; /* log file location */
char **g_argv; /* a copy of the cmdline arguments */
-char **environment; /* A pointer to the environment on startup */
+
+int exitstatus = 0;
static struct option const long_options[] = {
{"config", required_argument, NULL, 'c'},
{NULL, 0, NULL, 0}
};
+#ifdef HAVE_MINGW
+static struct WSAData wsa_state;
+#endif
+
static void usage(bool status)
{
if(status)
" --version Output version information and exit.\n\n"));
printf(_("Report bugs to tinc@nl.linux.org.\n"));
}
-
- exit(status);
}
-static void parse_options(int argc, char **argv, char **envp)
+static bool parse_options(int argc, char **argv)
{
int r;
int option_index = 0;
break;
case 'k': /* kill old tincds */
+#ifndef HAVE_MINGW
if(optarg) {
if(!strcasecmp(optarg, "HUP"))
kill_tincd = SIGHUP;
fprintf(stderr, _("Invalid argument `%s'; SIGNAL must be a number or one of HUP, TERM, KILL, USR1, USR2, WINCH, INT or ALRM.\n"),
optarg);
usage(true);
+ return false;
}
}
} else
kill_tincd = SIGTERM;
+#else
+ kill_tincd = 1;
+#endif
break;
case 'n': /* net name given */
fprintf(stderr, _("Invalid argument `%s'; BITS must be a number equal to or greater than 512.\n"),
optarg);
usage(true);
+ return false;
}
generate_keys &= ~7; /* Round it to bytes */
case '?':
usage(true);
+ return false;
default:
break;
}
}
+
+ return true;
}
/* This function prettyprints the key generation process */
}
}
-int main(int argc, char **argv, char **envp)
+int main(int argc, char **argv)
{
program_name = argv[0];
bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE);
- environment = envp;
- parse_options(argc, argv, envp);
+ if(!parse_options(argc, argv))
+ return 1;
+
make_names();
if(show_version) {
return 0;
}
- if(show_help)
+ if(show_help) {
usage(false);
+ return 0;
+ }
if(kill_tincd)
- exit(!kill_other(kill_tincd));
+ return !kill_other(kill_tincd);
openlogger("tinc", LOGMODE_STDERR);
if(generate_keys) {
read_server_config();
- exit(!keygen(generate_keys));
+ return !keygen(generate_keys);
}
if(!read_server_config())
- exit(1);
+ return 1;
if(lzo_init() != LZO_E_OK) {
logger(LOG_ERR, _("Error initializing LZO compressor!"));
- exit(1);
+ return 1;
}
+#ifdef HAVE_MINGW
+ if(WSAStartup(MAKEWORD(2, 2), &wsa_state)) {
+ logger(LOG_ERR, _("System call `%s' failed: %s"), "WSAStartup", winerror(GetLastError()));
+ return 1;
+ }
+
+ if(!do_detach || !init_service())
+ return main2(argc, argv);
+ else
+ return 1;
+}
+
+int main2(int argc, char **argv)
+{
+#endif
+
if(!detach())
- exit(1);
+ return 1;
for(;;) {
if(setup_network_connections()) {
- main_loop();
- cleanup_and_exit(1);
+ int status;
+ status = main_loop();
+
+ close_network_connections();
+
+ ifdebug(CONNECTIONS)
+ dump_device_stats();
+
+ logger(LOG_NOTICE, _("Terminating"));
+ return status;
}
logger(LOG_ERR, _("Unrecoverable error"));
sleep(maxtimeout);
} else {
logger(LOG_ERR, _("Not restarting."));
- exit(1);
+ return 1;
}
}
}