X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/blobdiff_plain/f98df54969e42ca1a89486ac41faf496d4e46ec6..f685e6923837d53fc3c7a1ae7c4e8f56f71bf000:/client/tripectl.c diff --git a/client/tripectl.c b/client/tripectl.c index 7386b304..13317047 100644 --- a/client/tripectl.c +++ b/client/tripectl.c @@ -1,13 +1,11 @@ /* -*-c-*- * - * $Id$ - * * Client for TrIPE * * (c) 2001 Straylight/Edgeware */ -/*----- Licensing notice --------------------------------------------------* +/*----- Licensing notice --------------------------------------------------* * * This file is part of Trivial IP Encryption (TrIPE). * @@ -15,12 +13,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * TrIPE is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with TrIPE; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. @@ -51,6 +49,7 @@ #include #include +#include #include #include #include @@ -60,6 +59,7 @@ #include #include #include +#include #include "util.h" @@ -120,10 +120,7 @@ static void checkbg(char **p) } static void checkfg(void) -{ - if (bgtag) - die(EXIT_FAILURE, "unexpected foreground response"); -} + { if (bgtag) die(EXIT_FAILURE, "unexpected foreground response"); } static void cline(char *p, size_t len, void *b) { @@ -163,6 +160,7 @@ static void cline(char *p, size_t len, void *b) } else if (strcmp(q, "INFO") == 0) { checkfg(); puts(p); + fflush(stdout); } else if (strcmp(q, "OK") == 0) { checkfg(); exit(0); @@ -176,11 +174,12 @@ static void cline(char *p, size_t len, void *b) } else if (strcmp(q, "BGINFO") == 0) { checkbg(&p); puts(p); + fflush(stdout); } else if (strcmp(q, "BGFAIL") == 0) { checkbg(&p); die(EXIT_FAILURE, "%s", p); } else - die(EXIT_FAILURE, "unexpected output `%s %s'", q, p); + die(EXIT_FAILURE, "unexpected output `%s %s'", q, p); } static void sline(char *p, size_t len, void *b) @@ -191,6 +190,7 @@ static void sline(char *p, size_t len, void *b) exit(0); } puts(p); + fflush(stdout); } static void uline(char *p, size_t len, void *b) @@ -270,17 +270,22 @@ static void logfile(const char *name) static void sighup(int sig, void *v) { logfile(logname); } -static void cleanup(void) -{ - if (pidfile) - unlink(pidfile); -} +static void cleanup(void) { if (pidfile) unlink(pidfile); } static void sigdie(int sig) + { cleanup(); signal(sig, SIG_DFL); raise(sig); } + +static void putarg(string_v *av, const char *fmt, ...) { - cleanup(); - signal(sig, SIG_DFL); - raise(sig); + va_list ap; + dstr d = DSTR_INIT; + + va_start(ap, fmt); + dstr_vputf(&d, fmt, &ap); + dstr_putz(&d); + va_end(ap); + DA_UNSHIFT(av, xstrdup(d.buf)); + dstr_destroy(&d); } static void version(FILE *fp) @@ -314,7 +319,7 @@ Options in full:\n\ -D, --daemon Become a background task after connecting.\n\ -d, --directory=DIR Select current directory [default " CONFIGDIR "].\n\ -a, --admin-socket=FILE Select socket to connect to\n\ - [default " SOCKETDIR "/tripesock].\n\ + [default " SOCKETDIR "/tripesock].\n\ -P, --pidfile=FILE Write process-id to FILE.\n\ \n\ -s, --spawn Start server rather than connecting.\n\ @@ -340,6 +345,8 @@ int main(int argc, char *argv[]) if ((p = getenv("TRIPEDIR")) != 0) dir = p; + if ((p = getenv("TRIPESOCK")) != 0) + sock = p; /* --- Parse the arguments --- */ @@ -453,11 +460,11 @@ int main(int argc, char *argv[]) #endif sigaction(SIGCHLD, &sa, 0); - DA_UNSHIFT(&spawnopts, (char *)sock); - DA_UNSHIFT(&spawnopts, "-a"); - DA_UNSHIFT(&spawnopts, "-d."); - DA_UNSHIFT(&spawnopts, (char *)spawnpath); DA_PUSH(&spawnopts, 0); + putarg(&spawnopts, "-a%s", sock); + putarg(&spawnopts, "-d."); + putarg(&spawnopts, "-F"); + putarg(&spawnopts, "%s", spawnpath); if (socketpair(PF_UNIX, SOCK_STREAM, 0, pfd)) die(EXIT_FAILURE, "error from socketpair: %s", strerror(errno)); sigemptyset(&newmask); @@ -468,15 +475,12 @@ int main(int argc, char *argv[]) if (!kid) { dup2(pfd[1], STDIN_FILENO); dup2(pfd[1], STDOUT_FILENO); - close(pfd[1]); close(pfd[0]); - if (logfp) - fclose(logfp); - if (pidfp) - fclose(pidfp); + close(pfd[1]); + if (logfp) fclose(logfp); + if (pidfp) fclose(pidfp); closelog(); - if (f & f_daemon) - u_detach(); + if (f & f_daemon) detachtty(); execvp(DA(&spawnopts)[0], DA(&spawnopts)); die(127, "couldn't exec `%s': %s", spawnpath, strerror(errno)); } @@ -501,7 +505,7 @@ int main(int argc, char *argv[]) } if (f & f_daemon) { - if (u_daemon()) + if (daemonize()) die(EXIT_FAILURE, "error becoming daemon: %s", strerror(errno)); } if (pidfp) { @@ -532,11 +536,8 @@ int main(int argc, char *argv[]) if (optind < argc) { dstr d = DSTR_INIT; setup((f & f_warn) ? "WATCH -A+w" : "WATCH -A"); - dstr_puts(&d, argv[optind++]); - while (optind < argc) { - dstr_putc(&d, ' '); - dstr_puts(&d, argv[optind++]); - } + while (optind < argc) + u_quotify(&d, argv[optind++]); dstr_putc(&d, '\n'); errno = EIO; if (write(fd, d.buf, d.len) != d.len || shutdown(fd, 1))