|
|
1.1 ! root 1: /* ! 2: * Standard I/O library ! 3: * Make streams to or from a process. ! 4: */ ! 5: ! 6: #include <stdio.h> ! 7: #include <signal.h> ! 8: ! 9: #define R 0 /* Pipe read descriptor index */ ! 10: #define W 1 /* Pipe write descriptor index */ ! 11: ! 12: static int poppid[_NFILE]; ! 13: ! 14: FILE * ! 15: popen(command, type) ! 16: char *command, *type; ! 17: { ! 18: register mode; ! 19: register fd; ! 20: int pd[2]; ! 21: ! 22: if (pipe(pd) < 0) ! 23: return (NULL); ! 24: if (*type == 'w') { ! 25: mode = W; ! 26: fd = pd[W]; ! 27: } else { ! 28: mode = R; ! 29: fd = pd[R]; ! 30: } ! 31: if ((poppid[fd] = fork()) < 0) { ! 32: close(pd[R]); ! 33: close(pd[W]); ! 34: return (NULL); ! 35: } ! 36: if (poppid[fd] == 0) { /* Child */ ! 37: if (mode == W) { ! 38: close(pd[W]); ! 39: close(fileno(stdin)); ! 40: dup(pd[R]); ! 41: close(pd[R]); ! 42: } else { ! 43: close(pd[R]); ! 44: close(fileno(stdout)); ! 45: dup(pd[W]); ! 46: close(pd[W]); ! 47: } ! 48: execl("/bin/sh", "sh", "-c", command, NULL); ! 49: exit(1); ! 50: } ! 51: if (mode == W) { ! 52: close(pd[R]); ! 53: return (fdopen(pd[W], "w")); ! 54: } else { ! 55: close(pd[W]); ! 56: return (fdopen(pd[R], "r")); ! 57: } ! 58: } ! 59: ! 60: pclose(stream) ! 61: FILE *stream; ! 62: { ! 63: register fd; ! 64: register pid, wpid; ! 65: int status; ! 66: int (*hupfun)(), (*intfun)(), (*quitfun)(); ! 67: ! 68: fd = fileno(stream); ! 69: pid = poppid[fd]; ! 70: poppid[fd] = 0; ! 71: if (pid==0 || fclose(stream)==EOF) ! 72: return (-1); ! 73: hupfun = signal(SIGHUP, SIG_IGN); ! 74: intfun = signal(SIGINT, SIG_IGN); ! 75: quitfun = signal(SIGQUIT, SIG_IGN); ! 76: while ((wpid = wait(&status))!=pid && wpid>=0) ! 77: ; ! 78: if (wpid < 0) ! 79: status = -1; ! 80: signal(SIGHUP, hupfun); ! 81: signal(SIGINT, intfun); ! 82: signal(SIGQUIT, quitfun); ! 83: return (status); ! 84: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.