|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that this notice is preserved and that due credit is given ! 7: * to the University of California at Berkeley. The name of the University ! 8: * may not be used to endorse or promote products derived from this ! 9: * software without specific prior written permission. This software ! 10: * is provided ``as is'' without express or implied warranty. ! 11: */ ! 12: ! 13: #ifdef notdef ! 14: static char sccsid[] = "@(#)popen.c 5.4 (Berkeley) 2/18/88"; ! 15: #endif /* notdef */ ! 16: ! 17: #include <stdio.h> ! 18: #include <sys/signal.h> ! 19: #include <sys/types.h> ! 20: #include <sys/wait.h> ! 21: #include <errno.h> ! 22: ! 23: #define tst(a,b) (*mode == 'r'? (b) : (a)) ! 24: #define RDR 0 ! 25: #define WTR 1 ! 26: static int popen_pid[20]; ! 27: ! 28: FILE * ! 29: popen(cmd,mode) ! 30: char *cmd; ! 31: char *mode; ! 32: { ! 33: int p[2]; ! 34: register myside, hisside, pid; ! 35: ! 36: if(pipe(p) < 0) ! 37: return NULL; ! 38: myside = tst(p[WTR], p[RDR]); ! 39: hisside = tst(p[RDR], p[WTR]); ! 40: if((pid = vfork()) == 0) { ! 41: /* myside and hisside reverse roles in child */ ! 42: close(myside); ! 43: dup2(hisside, tst(0, 1)); ! 44: close(hisside); ! 45: execl("/bin/csh", "sh", "-c", cmd, 0); ! 46: _exit(1); ! 47: } ! 48: if(pid == -1) ! 49: return NULL; ! 50: popen_pid[myside] = pid; ! 51: close(hisside); ! 52: return(fdopen(myside, mode)); ! 53: } ! 54: ! 55: pclose(ptr) ! 56: FILE *ptr; ! 57: { ! 58: register f, r; ! 59: int omask; ! 60: union wait status; ! 61: extern int errno; ! 62: ! 63: f = fileno(ptr); ! 64: fclose(ptr); ! 65: omask = sigblock(sigmask(SIGINT)|sigmask(SIGQUIT)|sigmask(SIGHUP)); ! 66: while((r = wait(&status)) != popen_pid[f] && r != -1 && errno != EINTR) ! 67: ; ! 68: if(r == -1) ! 69: status.w_status = -1; ! 70: sigsetmask(omask); ! 71: return (status.w_status); ! 72: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.