]> git.meshlink.io Git - meshlink/blobdiff - src/tincctl.c
Merge branch 'master' of git://tinc-vpn.org/tinc into 1.1
[meshlink] / src / tincctl.c
index ebd2e1301887caca3d913f509726cfbdea136a2c..4f06daa63bce5d6e6506f761f3b2070ecbcb867d 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"
@@ -482,7 +481,42 @@ void pcap(int fd, FILE *out) {
        }
 }
 
-int main(int argc, char *argv[], char *envp[]) {
+#ifdef HAVE_MINGW
+static bool remove_service(void) {
+       SC_HANDLE manager = NULL;
+       SC_HANDLE service = NULL;
+       SERVICE_STATUS status = {0};
+
+       manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
+       if(!manager) {
+               fprintf(stderr, "Could not open service manager: %s\n", winerror(GetLastError()));
+               return false;
+       }
+
+       service = OpenService(manager, identname, SERVICE_ALL_ACCESS);
+
+       if(!service) {
+               fprintf(stderr, "Could not open %s service: %s\n", identname, winerror(GetLastError()));
+               return false;
+       }
+
+       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\n", identname);
+
+       if(!DeleteService(service)) {
+               fprintf(stderr, "Could not remove %s service: %s\n", identname, winerror(GetLastError()));
+               return false;
+       }
+
+       fprintf(stderr, "%s service removed\n", identname);
+
+       return true;
+}
+#endif
+
+int main(int argc, char *argv[]) {
        int fd;
        int result;
        char host[128];
@@ -534,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;
        }
 
@@ -622,11 +673,16 @@ int main(int argc, char *argv[], char *envp[]) {
        }
 
        if(!strcasecmp(argv[optind], "stop")) {
+#ifndef HAVE_MINGW
                sendline(fd, "%d %d", CONTROL, REQ_STOP);
                if(!recvline(fd, line, sizeof line) || sscanf(line, "%d %d %d", &code, &req, &result) != 3 || code != CONTROL || req != REQ_STOP || result) {
                        fprintf(stderr, "Could not stop tinc daemon\n");
                        return 1;
                }
+#else
+               if(!remove_service())
+                       return 1;
+#endif
                return 0;
        }