From a7556a9d2c943a6317d2dab66d9f742997f0d47a Mon Sep 17 00:00:00 2001 From: Michael Tokarev Date: Sun, 7 Aug 2011 12:05:07 +0400 Subject: [PATCH] run tincd from the same directory as tincctl and pass all options to it For tincctl start, run tincd from dirname($0) not SBINDIR - this allows painless alternative directory installation and running from build directory too. Also while at it, pass the rest of command line to tincd, not only options before "start" argument. This way it's possible to pass options to tincd like this: tincctl -n net start -- -d 1 -R -U tincuser ... And also add missing newline at the end of error message there. Signed-Off-By: Michael Tokarev --- src/tincctl.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/tincctl.c b/src/tincctl.c index a7f6185f..b2e6e821 100644 --- a/src/tincctl.c +++ b/src/tincctl.c @@ -568,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", 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; + execve(c, argv, envp); + fprintf(stderr, "Could not start %s: %s\n", c, strerror(errno)); return 1; } -- 2.39.5