Merge branch 'master' of git://tinc-vpn.org/tinc into 1.1
[tinc] / src / tincctl.c
index f7f23c1..4f06daa 100644 (file)
@@ -76,7 +76,7 @@ static void usage(bool status) {
                                "  start                      Start tincd.\n"
                                "  stop                       Stop tincd.\n"
                                "  restart                    Restart tincd.\n"
-                               "  reload                     Reload configuration of running tincd.\n"
+                               "  reload                     Partially reload configuration of running tincd.\n"
                                "  pid                        Show PID of currently running tincd.\n"
                                "  generate-keys [bits]       Generate new RSA and ECDSA public/private keypairs.\n"
                                "  generate-rsa-keys [bits]   Generate a new RSA public/private keypair.\n"
@@ -90,7 +90,6 @@ static void usage(bool status) {
                                "  purge                      Purge unreachable nodes\n"
                                "  debug N                    Set debug level\n"
                                "  retry                      Retry all outgoing connections\n"
-                               "  reload                     Partial reload of configuration\n"
                                "  disconnect NODE            Close meta connection with NODE\n"
 #ifdef HAVE_CURSES
                                "  top                        Show real-time statistics\n"
@@ -504,7 +503,7 @@ static bool remove_service(void) {
        if(!ControlService(service, SERVICE_CONTROL_STOP, &status))
                fprintf(stderr, "Could not stop %s service: %s\n", identname, winerror(GetLastError()));
        else
-               fprintf(stderr, "%s service stopped", identname);
+               fprintf(stderr, "%s service stopped\n", identname);
 
        if(!DeleteService(service)) {
                fprintf(stderr, "Could not remove %s service: %s\n", identname, winerror(GetLastError()));
@@ -517,7 +516,7 @@ static bool remove_service(void) {
 }
 #endif
 
-int main(int argc, char *argv[], char *envp[]) {
+int main(int argc, char *argv[]) {
        int fd;
        int result;
        char host[128];
@@ -569,9 +568,26 @@ int main(int argc, char *argv[], char *envp[]) {
        }
 
        if(!strcasecmp(argv[optind], "start")) {
-               argv[optind] = NULL;
-               execve(SBINDIR "/tincd", argv, envp);
-               fprintf(stderr, "Could not start tincd: %s", strerror(errno));
+               int i, j;
+               char *c;
+               char *slash = strrchr(argv[0], '/');
+#ifdef HAVE_MINGW
+               if ((c = strrchr(argv[0], '\\')) > slash)
+                       slash = c;
+#endif
+               if (slash++) {
+                       c = xmalloc((slash - argv[0]) + sizeof("tincd"));
+                       sprintf(c, "%.*stincd", (int)(slash - argv[0]), argv[0]);
+               }
+               else
+                       c = "tincd";
+               argv[0] = c;
+               for(i = j = 1; argv[i]; ++i)
+                       if (i != optind && strcmp(argv[i], "--") != 0)
+                               argv[j++] = argv[i];
+               argv[j] = NULL;
+               execvp(c, argv);
+               fprintf(stderr, "Could not start %s: %s\n", c, strerror(errno));
                return 1;
        }