|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)popen.c 1.7 (Berkeley) 8/13/83"; ! 3: #endif ! 4: ! 5: #include <stdio.h> ! 6: #include <signal.h> ! 7: #include <errno.h> ! 8: #define tst(a,b) (*mode == 'r'? (b) : (a)) ! 9: #define RDR 0 ! 10: #define WTR 1 ! 11: static int popen_pid[20]; ! 12: ! 13: #ifdef VMUNIX ! 14: #define mask(s) (1<<((s)-1)) ! 15: #else ! 16: #define vfork fork ! 17: #endif VMUNIX ! 18: #ifndef SIGRETRO ! 19: #define sigchild() ! 20: #endif ! 21: ! 22: FILE * ! 23: popen(cmd,mode) ! 24: char *cmd; ! 25: char *mode; ! 26: { ! 27: int p[2]; ! 28: register myside, hisside, pid; ! 29: ! 30: if(pipe(p) < 0) ! 31: return NULL; ! 32: myside = tst(p[WTR], p[RDR]); ! 33: hisside = tst(p[RDR], p[WTR]); ! 34: if((pid = vfork()) == 0) { ! 35: /* myside and hisside reverse roles in child */ ! 36: sigchild(); ! 37: close(myside); ! 38: dup2(hisside, tst(0, 1)); ! 39: close(hisside); ! 40: execl("/bin/csh", "sh", "-c", cmd, 0); ! 41: _exit(1); ! 42: } ! 43: if(pid == -1) ! 44: return NULL; ! 45: popen_pid[myside] = pid; ! 46: close(hisside); ! 47: return(fdopen(myside, mode)); ! 48: } ! 49: ! 50: pclose(ptr) ! 51: FILE *ptr; ! 52: { ! 53: register f, r; ! 54: int status, omask; ! 55: extern int errno; ! 56: ! 57: f = fileno(ptr); ! 58: fclose(ptr); ! 59: # ifdef VMUNIX ! 60: omask = sigblock(mask(SIGINT)|mask(SIGQUIT)|mask(SIGHUP)); ! 61: # endif VMUNIX ! 62: while((r = wait(&status)) != popen_pid[f] && r != -1 && errno != EINTR) ! 63: ; ! 64: if(r == -1) ! 65: status = -1; ! 66: # ifdef VMUNIX ! 67: sigsetmask(omask); ! 68: # endif VMUNIX ! 69: return(status); ! 70: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.