Releasing 1.1pre12.
[tinc] / src / tincd.c
index d497bcc..4da9bd5 100644 (file)
@@ -1,7 +1,7 @@
 /*
     tincd.c -- the main file for tincd
     Copyright (C) 1998-2005 Ivo Timmermans
-                  2000-2014 Guus Sliepen <guus@tinc-vpn.org>
+                  2000-2016 Guus Sliepen <guus@tinc-vpn.org>
                   2008      Max Rijevski <maksuf@gmail.com>
                   2009      Michael Tokarev <mjt@tls.msk.ru>
                   2010      Julien Muchembled <jm@jmuchemb.eu>
@@ -43,8 +43,6 @@
 #include <time.h>
 #endif
 
-#include <getopt.h>
-
 #include "conf.h"
 #include "control.h"
 #include "crypto.h"
@@ -263,11 +261,14 @@ static bool parse_options(int argc, char **argv) {
                netname = NULL;
        }
 
-       if(netname && (strpbrk(netname, "\\/") || *netname == '.')) {
+       if(netname && !check_netname(netname, false)) {
                fprintf(stderr, "Invalid character in netname!\n");
                return false;
        }
 
+       if(netname && !check_netname(netname, true))
+               fprintf(stderr, "Warning: unsafe character in netname!\n");
+
        return true;
 }
 
@@ -339,12 +340,13 @@ int main(int argc, char **argv) {
        if(!parse_options(argc, argv))
                return 1;
 
-       make_names();
+       make_names(true);
+       chdir(confbase);
 
        if(show_version) {
                printf("%s version %s (built %s %s, protocol %d.%d)\n", PACKAGE,
-                          VERSION, BUILD_DATE, BUILD_TIME, PROT_MAJOR, PROT_MINOR);
-               printf("Copyright (C) 1998-2014 Ivo Timmermans, Guus Sliepen and others.\n"
+                          BUILD_VERSION, BUILD_DATE, BUILD_TIME, PROT_MAJOR, PROT_MINOR);
+               printf("Copyright (C) 1998-2016 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"
@@ -363,6 +365,18 @@ int main(int argc, char **argv) {
                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);
@@ -466,6 +480,12 @@ int main2(int argc, char **argv) {
 
        logger(DEBUG_ALWAYS, LOG_NOTICE, "Ready");
 
+       if(umbilical) { // snip!
+               write(umbilical, "", 1);
+               close(umbilical);
+               umbilical = 0;
+       }
+
        try_outgoing_connections();
 
        status = main_loop();