X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe/blobdiff_plain/2b3ef39558d9aa6c187dc088c81a5b9872984d3c..ca3aaaeb369633cd65c8cc29dde88daff2c38e8c:/client/tripectl.c diff --git a/client/tripectl.c b/client/tripectl.c index 4c8dde5a..2df79358 100644 --- a/client/tripectl.c +++ b/client/tripectl.c @@ -132,14 +132,14 @@ static void dolog(int prio, const char *msg, ...) if (f & f_syslog) syslog(prio, "%s", d.buf); if (logfp) { switch (prio) { - case LOG_WARN: cat = "warning"; break; + case LOG_WARNING: cat = "warning"; break; case LOG_DEBUG: cat = "debug"; break; case LOG_ERR: cat = "error"; break; default: cat = "message"; break; } writelog(cat, d.buf); } - if (prio == LOG_WARN && (f & f_warn)) + if (prio == LOG_WARNING && (f & f_warn)) fprintf(stderr, "Warning: %s\n", d.buf); dstr_destroy(&d); } @@ -217,6 +217,16 @@ static void uline(char *p, size_t len, void *b) } } +static void eline(char *p, size_t len, void *b) +{ + if (p) + dolog(LOG_WARNING, "(stderr): %s", p); + else { + selbuf_destroy(b); + close(fd); + } +} + static void setup(const char *cmd) { dstr d = DSTR_INIT; @@ -273,7 +283,7 @@ static void logfile(const char *name) else if (logname) die(EXIT_FAILURE, d.buf); if (f & f_syslog) - syslog(LOG_ERR, d.buf); + syslog(LOG_ERR, "%s", d.buf); dstr_destroy(&d); } } @@ -356,12 +366,12 @@ int main(int argc, char *argv[]) size_t sz; uid_t u = -1; gid_t g = -1; - int pfd[2]; + int pfd[2], efd[2]; pid_t kid; struct sigaction sa; sigset_t newmask, oldmask; struct sockaddr_un sun; - selbuf bu, bs; + selbuf bu, bs, be; dstr d = DSTR_INIT; sig hup; @@ -498,7 +508,7 @@ int main(int argc, char *argv[]) putarg(&spawnopts, "-d."); putarg(&spawnopts, "-F"); putarg(&spawnopts, "%s", spawnpath); - if (socketpair(PF_UNIX, SOCK_STREAM, 0, pfd)) + if (socketpair(PF_UNIX, SOCK_STREAM, 0, pfd) || pipe(efd)) die(EXIT_FAILURE, "error from socketpair: %s", strerror(errno)); sigemptyset(&newmask); sigaddset(&newmask, SIGCHLD); @@ -508,8 +518,9 @@ int main(int argc, char *argv[]) if (!kid) { dup2(pfd[1], STDIN_FILENO); dup2(pfd[1], STDOUT_FILENO); - close(pfd[0]); - close(pfd[1]); + dup2(efd[1], STDERR_FILENO); + close(pfd[0]); close(pfd[1]); + close(efd[0]); close(efd[1]); if (logfp) fclose(logfp); if (pidfp) fclose(pidfp); closelog(); @@ -519,7 +530,8 @@ int main(int argc, char *argv[]) } sigprocmask(SIG_SETMASK, &oldmask, 0); fd = pfd[0]; - close(pfd[1]); + close(pfd[1]); close(efd[1]); + selbuf_init(&be, &sel, efd[0], eline, &be); } else { sz = strlen(sock) + 1; if (sz > sizeof(sun.sun_path))