|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 1848 (0x738) Types: TextFile Names: »popen.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦e7f64e0c0⟧ »EurOpenD3/mail/vmh.tar.Z« └─⟦dcb95597f⟧ └─⟦this⟧ »popen.c«
#ifndef lint static char rcsid[] = "$Header: popen.c,v 2.3 86/02/08 21:03:31 deboor Exp $"; static char notice[] = "This program is in the public domain and is available for unlimited \ distribution as long as this notice is enclosed."; #endif /* * Derived from std popen ... * csh instead of sh * send stderr to pipe in addition to stdout * * $Source: /c/support/deboor/usr/src/old/vmh/RCS/popen.c,v $ * $Revision: 2.3 $ * $Author: deboor $ * * FUNCTIONS: * popen open a pipe to a new shell-created process * pclose close a previously openned pipe */ #include <stdio.h> #include <signal.h> #include <sys/wait.h> #define tst(a,b) (*mode == 'r'? (b) : (a)) #define RDR 0 #define WTR 1 static int popen_pid[20]; FILE * popen(cmd,mode) char *cmd; char *mode; { int p[2]; register myside, hisside, pid; if(pipe(p) < 0) return NULL; myside = tst(p[WTR], p[RDR]); hisside = tst(p[RDR], p[WTR]); if((pid = fork()) == 0) { /* myside and hisside reverse roles in child */ (void) close(myside); (void) dup2(hisside, tst(0, 1)); (void) close(hisside); /*** New! Make stderr go to the pipe also (jdg) ***/ (void) dup2(1, 2); /* make stderr(2) same as stdout(1) */ execl("/bin/csh", "csh", "-c", cmd, 0); _exit(1); } if(pid == -1) return NULL; popen_pid[myside] = pid; (void) close(hisside); return(fdopen(myside, mode)); } pclose(ptr) FILE *ptr; { register f, r, (*hstat)(), (*istat)(), (*qstat)(); union wait status; f = fileno(ptr); (void) fclose(ptr); istat = signal(SIGINT, SIG_IGN); qstat = signal(SIGQUIT, SIG_IGN); hstat = signal(SIGHUP, SIG_IGN); while((r = wait(&status)) != popen_pid[f] && r != -1) ; if(r == -1) status.w_retcode = -1; (void) signal(SIGINT, istat); (void) signal(SIGQUIT, qstat); (void) signal(SIGHUP, hstat); return(status.w_retcode); }