From 11ee57d90c5dcd3bc98276d368fe1362ab7b22ce Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 5 Feb 2002 10:14:20 +0000 Subject: [PATCH] Really add readpipe to the repo. --- lib/readpipe.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 lib/readpipe.c diff --git a/lib/readpipe.c b/lib/readpipe.c new file mode 100644 index 00000000..217be476 --- /dev/null +++ b/lib/readpipe.c @@ -0,0 +1,96 @@ +/* Open a pipe to read from a program without intermediary sh. + Copyright (C) 1992, 1997 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by David MacKenzie. */ + +#if HAVE_CONFIG_H +# include +#endif + +#include + +#if __STDC__ +#include +#else +#include +#endif + +#if HAVE_UNISTD_H +# include +#endif + +/* Open a pipe to read from a program without intermediary sh. Checks + PATH. Sample use: + + stream = readpipe ("progname", "arg1", "arg2", (char *) 0); + + Return 0 on error. */ + +#if __STDC__ +FILE * +readpipe (char *progname, ...) +#else +FILE * +readpipe (va_alist) +#endif +{ +#if ! __STDC__ + char *progname; +#endif + int fds[2]; + va_list ap; + char *args[100]; + int argno = 0; + + /* Copy arguments into `args'. */ +#if __STDC__ + va_start (ap, progname); +#else + va_start (ap); + progname = va_arg (ap, char *); +#endif + args[argno++] = progname; + while ((args[argno++] = va_arg (ap, char *)) != NULL) + ; + va_end (ap); + + if (pipe (fds) == -1) + return 0; + + switch (fork ()) + { + case 0: /* Child. Write to pipe. */ + close (fds[0]); /* Not needed. */ + if (fds[1] != 1) /* Redirect 1 (stdout) only if needed. */ + { + close (1); /* We don't want the old stdout. */ + if (dup (fds[1]) == 0)/* Maybe stdin was closed. */ + { + dup (fds[1]); /* Guaranteed to dup to 1 (stdout). */ + close (0); + } + close (fds[1]); /* No longer needed. */ + } + execvp (args[0], args); + _exit (2); /* 2 for `cmp'. */ + case -1: /* Error. */ + return 0; + default: /* Parent. Read from pipe. */ + close (fds[1]); /* Not needed. */ + return fdopen (fds[0], "r"); + } +} -- 2.47.2