Fork when using the "start" command in tincctl.
This allows the command to be given in its shell without immediatly exiting tincctl.
This commit is contained in:
parent
36c6afede3
commit
a57db1dfe0
1 changed files with 47 additions and 14 deletions
|
@ -44,6 +44,9 @@
|
||||||
/* The name this program was run with. */
|
/* The name this program was run with. */
|
||||||
static char *program_name = NULL;
|
static char *program_name = NULL;
|
||||||
|
|
||||||
|
static char **orig_argv;
|
||||||
|
static int orig_argc;
|
||||||
|
|
||||||
/* If nonzero, display usage information and exit. */
|
/* If nonzero, display usage information and exit. */
|
||||||
static bool show_help = false;
|
static bool show_help = false;
|
||||||
|
|
||||||
|
@ -708,33 +711,57 @@ static bool connect_tincd(bool verbose) {
|
||||||
|
|
||||||
|
|
||||||
static int cmd_start(int argc, char *argv[]) {
|
static int cmd_start(int argc, char *argv[]) {
|
||||||
int i, j;
|
if(connect_tincd(false)) {
|
||||||
char *c;
|
if(netname)
|
||||||
|
fprintf(stderr, "A tincd is already running for net `%s' with pid %d.\n", netname, pid);
|
||||||
|
else
|
||||||
|
fprintf(stderr, "A tincd is already running with pid %d.\n", pid);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
argc += optind;
|
char *c;
|
||||||
argv -= optind;
|
char *slash = strrchr(program_name, '/');
|
||||||
char *slash = strrchr(argv[0], '/');
|
|
||||||
|
|
||||||
#ifdef HAVE_MINGW
|
#ifdef HAVE_MINGW
|
||||||
if ((c = strrchr(argv[0], '\\')) > slash)
|
if ((c = strrchr(program_name, '\\')) > slash)
|
||||||
slash = c;
|
slash = c;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (slash++)
|
if (slash++)
|
||||||
xasprintf(&c, "%.*stincd", (int)(slash - argv[0]), argv[0]);
|
xasprintf(&c, "%.*stincd", (int)(slash - program_name), program_name);
|
||||||
else
|
else
|
||||||
c = "tincd";
|
c = "tincd";
|
||||||
|
|
||||||
argv[0] = c;
|
int nargc = 0;
|
||||||
|
char **nargv = xmalloc_and_zero((orig_argc + argc) * sizeof *nargv);
|
||||||
|
|
||||||
for(i = j = 1; argv[i]; ++i)
|
for(int i = 0; i < orig_argc; i++)
|
||||||
if (i != optind && strcmp(argv[i], "--") != 0)
|
nargv[nargc++] = orig_argv[i];
|
||||||
argv[j++] = argv[i];
|
for(int i = 1; i < argc; i++)
|
||||||
|
nargv[nargc++] = argv[i];
|
||||||
|
|
||||||
argv[j] = NULL;
|
#ifdef HAVE_MINGW
|
||||||
execvp(c, argv);
|
execvp(c, nargv);
|
||||||
fprintf(stderr, "Could not start %s: %s\n", c, strerror(errno));
|
fprintf(stderr, "Error starting %s: %s\n", c, strerror(errno));
|
||||||
return 1;
|
return 1;
|
||||||
|
#else
|
||||||
|
pid_t pid = fork();
|
||||||
|
if(pid == -1) {
|
||||||
|
fprintf(stderr, "Could not fork: %s\n", strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!pid)
|
||||||
|
exit(execvp(c, nargv));
|
||||||
|
|
||||||
|
int status = -1;
|
||||||
|
if(waitpid(pid, &status, 0) != pid || !WIFEXITED(status) || WEXITSTATUS(status)) {
|
||||||
|
fprintf(stderr, "Error starting %s\n", c);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cmd_stop(int argc, char *argv[]) {
|
static int cmd_stop(int argc, char *argv[]) {
|
||||||
|
@ -759,6 +786,10 @@ static int cmd_stop(int argc, char *argv[]) {
|
||||||
if(!remove_service())
|
if(!remove_service())
|
||||||
return 1;
|
return 1;
|
||||||
#endif
|
#endif
|
||||||
|
close(fd);
|
||||||
|
pid = 0;
|
||||||
|
fd = -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1949,6 +1980,8 @@ static int cmd_shell(int argc, char *argv[]) {
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
program_name = argv[0];
|
program_name = argv[0];
|
||||||
|
orig_argv = argv;
|
||||||
|
orig_argc = argc;
|
||||||
|
|
||||||
if(!parse_options(argc, argv))
|
if(!parse_options(argc, argv))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Reference in a new issue