Add routine to run daughter process and collect its output
authorH.G.Muller <hgm@hgm-xboard.(none)>
Tue, 15 Mar 2016 10:08:04 +0000 (11:08 +0100)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Tue, 29 Mar 2016 14:51:33 +0000 (16:51 +0200)
The routine BufferOutputCommand can run an arbitrary command in a
separate process, and collects its output in a buffer of the requested
size. It will kill the process when it doesn't terminate spontaneously,
and return the allocated buffer.

frontend.h
usystem.c

index bf79c67..b06484f 100644 (file)
@@ -142,6 +142,7 @@ void Wheel P((int dir, int x, int y));
 int StartChildProcess P((char *cmdLine, char *dir, ProcRef *pr));
 void DestroyChildProcess P((ProcRef pr, int/*boolean*/ signal));
 void InterruptChildProcess P((ProcRef pr));
+char *BufferCommandOutput P((char *command, int size));
 void RunCommand P((char *buf));
 
 int OpenTelnet P((char *host, char *port, ProcRef *pr));
index 23ba305..23b798b 100644 (file)
--- a/usystem.c
+++ b/usystem.c
@@ -516,6 +516,22 @@ DestroyChildProcess (ProcRef pr, int signalType)
     close(cp->fdTo);
 }
 
+char *
+BufferCommandOutput (char *command, int size)
+{
+    ChildProc *pr;
+    char *res = (char *) calloc(1, size);
+    if(res) {
+       int count;
+       StartChildProcess(command, ".", (ProcRef) &pr);    // run command in daughter process
+       count = read(pr->fdFrom, res, size-1);  // read its output
+       res[count > 0 ? count : 0] = NULLCHAR;  
+       DestroyChildProcess((ProcRef) pr, 9);
+       free(pr);
+    }
+    return res; // return buffer with output
+}
+
 void
 InterruptChildProcess (ProcRef pr)
 {