chiark / gitweb /
client: Capture server stderr and send it to the logfile.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 20 Dec 2008 17:06:11 +0000 (17:06 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Mon, 29 Dec 2008 21:52:05 +0000 (21:52 +0000)
client/tripectl.c

index 4c8dde5a5a246f8375f54417981b4a066ecc9dfb..0daaacbad1b7ae401f05b3e10d970387a59234cc 100644 (file)
@@ -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;
@@ -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))