From: H.G.Muller Date: Tue, 15 Mar 2016 10:08:04 +0000 (+0100) Subject: Add routine to run daughter process and collect its output X-Git-Url: http://winboard.nl/cgi-bin?p=xboard.git;a=commitdiff_plain;h=de1e5c90f7dc200af953878230331fefe4b38ed7 Add routine to run daughter process and collect its output 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. --- diff --git a/frontend.h b/frontend.h index bf79c67..b06484f 100644 --- a/frontend.h +++ b/frontend.h @@ -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)); diff --git a/usystem.c b/usystem.c index 23ba305..23b798b 100644 --- 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) {