+#ifdef LZ4_H
+#include LZ4_H
+#endif
+
+#ifndef HAVE_MINGW
+#include <pwd.h>
+#include <grp.h>
+#include <time.h>
+#endif
+
+#include "conf.h"
+#include "crypto.h"
+#include "event.h"
+#include "logger.h"
+#include "names.h"
+#include "net.h"
+#include "process.h"
+#include "protocol.h"
+#include "utils.h"
+#include "xalloc.h"
+#include "version.h"
+
+/* If nonzero, display usage information and exit. */
+static bool show_help = false;
+
+/* If nonzero, print the version on standard output and exit. */
+static bool show_version = false;
+
+/* If nonzero, use null ciphers and skip all key exchanges. */
+bool bypass_security = false;
+
+#ifdef HAVE_MLOCKALL
+/* If nonzero, disable swapping for this process. */
+static bool do_mlock = false;
+#endif
+
+#ifndef HAVE_MINGW
+/* If nonzero, chroot to netdir after startup. */
+static bool do_chroot = false;
+
+/* If !NULL, do setuid to given user after startup */
+static const char *switchuser = NULL;
+#endif
+
+/* If nonzero, write log entries to a separate file. */
+bool use_logfile = false;
+
+/* If nonzero, use syslog instead of stderr in no-detach mode. */
+bool use_syslog = false;
+
+char **g_argv; /* a copy of the cmdline arguments */
+
+static int status = 1;
+
+static struct option const long_options[] = {
+ {"config", required_argument, NULL, 'c'},
+ {"net", required_argument, NULL, 'n'},
+ {"help", no_argument, NULL, 1},
+ {"version", no_argument, NULL, 2},
+ {"no-detach", no_argument, NULL, 'D'},
+ {"debug", optional_argument, NULL, 'd'},
+ {"bypass-security", no_argument, NULL, 3},
+ {"mlock", no_argument, NULL, 'L'},
+ {"chroot", no_argument, NULL, 'R'},
+ {"user", required_argument, NULL, 'U'},
+ {"logfile", optional_argument, NULL, 4},
+ {"syslog", no_argument, NULL, 's'},
+ {"pidfile", required_argument, NULL, 5},
+ {"option", required_argument, NULL, 'o'},
+ {NULL, 0, NULL, 0}
+};
+
+#ifdef HAVE_MINGW
+static struct WSAData wsa_state;
+int main2(int argc, char **argv);
+#endif
+
+static void usage(bool status) {
+ if(status)
+ fprintf(stderr, "Try `%s --help\' for more information.\n",
+ program_name);
+ else {
+ static const char *message =
+ "Usage: %s [option]...\n"
+ "\n"
+ " -c, --config=DIR Read configuration options from DIR.\n"
+ " -D, --no-detach Don't fork and detach.\n"
+ " -d, --debug[=LEVEL] Increase debug level or set it to LEVEL.\n"
+ " -n, --net=NETNAME Connect to net NETNAME.\n"
+#ifdef HAVE_MLOCKALL
+ " -L, --mlock Lock tinc into main memory.\n"
+#endif
+ " --logfile[=FILENAME] Write log entries to a logfile.\n"
+ " -s --syslog Use syslog instead of stderr with --no-detach.\n"
+ " --pidfile=FILENAME Write PID and control socket cookie to FILENAME.\n"
+ " --bypass-security Disables meta protocol security, for debugging.\n"
+ " -o, --option[HOST.]KEY=VALUE Set global/host configuration value.\n"
+#ifndef HAVE_MINGW
+ " -R, --chroot chroot to NET dir at startup.\n"
+ " -U, --user=USER setuid to given USER at startup.\n"