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