|
|
1.1 ! root 1: /* epopen.c ! 2: A version of popen that goes through ixsspawn. ! 3: ! 4: Copyright (C) 1992 Ian Lance Taylor ! 5: ! 6: This file is part of the Taylor UUCP package. ! 7: ! 8: This program is free software; you can redistribute it and/or ! 9: modify it under the terms of the GNU General Public License as ! 10: published by the Free Software Foundation; either version 2 of the ! 11: License, or (at your option) any later version. ! 12: ! 13: This program is distributed in the hope that it will be useful, but ! 14: WITHOUT ANY WARRANTY; without even the implied warranty of ! 15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! 16: General Public License for more details. ! 17: ! 18: You should have received a copy of the GNU General Public License ! 19: along with this program; if not, write to the Free Software ! 20: Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! 21: ! 22: The author of the program may be contacted at [email protected] or ! 23: c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254. ! 24: */ ! 25: ! 26: #include "uucp.h" ! 27: ! 28: #include "sysdep.h" ! 29: ! 30: #include <errno.h> ! 31: ! 32: /* A version of popen that goes through ixsspawn. This actually takes ! 33: an array of arguments rather than a string, and takes a boolean ! 34: read/write value rather than a string. It sets *pipid to the ! 35: process ID of the child. */ ! 36: ! 37: FILE * ! 38: espopen (pazargs, frd, pipid) ! 39: const char **pazargs; ! 40: boolean frd; ! 41: pid_t *pipid; ! 42: { ! 43: int aidescs[3]; ! 44: pid_t ipid; ! 45: FILE *eret; ! 46: ! 47: if (frd) ! 48: { ! 49: aidescs[0] = SPAWN_NULL; ! 50: aidescs[1] = SPAWN_READ_PIPE; ! 51: } ! 52: else ! 53: { ! 54: aidescs[0] = SPAWN_WRITE_PIPE; ! 55: aidescs[1] = SPAWN_NULL; ! 56: } ! 57: aidescs[2] = SPAWN_NULL; ! 58: ! 59: ipid = ixsspawn (pazargs, aidescs, FALSE, FALSE, ! 60: (const char *) NULL, FALSE, TRUE, ! 61: (const char *) NULL, (const char *) NULL, ! 62: (const char *) NULL); ! 63: if (ipid < 0) ! 64: return NULL; ! 65: ! 66: if (frd) ! 67: eret = fdopen (aidescs[1], (char *) "r"); ! 68: else ! 69: eret = fdopen (aidescs[0], (char *) "w"); ! 70: if (eret == NULL) ! 71: { ! 72: int ierr; ! 73: ! 74: ierr = errno; ! 75: (void) close (frd ? aidescs[1] : aidescs[0]); ! 76: (void) kill (ipid, SIGKILL); ! 77: (void) ixswait ((unsigned long) ipid, (const char *) NULL); ! 78: errno = ierr; ! 79: return NULL; ! 80: } ! 81: ! 82: *pipid = ipid; ! 83: ! 84: return eret; ! 85: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.