|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 1462 (0x5b6) Types: TextFile Notes: UNIX file Names: »popen.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code └─⟦f4b8d8c84⟧ UNIX Filesystem └─⟦this⟧ »libc/stdio/popen.c«
/* * Standard I/O library * Make streams to or from a process. */ #include <stdio.h> #include <signal.h> #define R 0 /* Pipe read descriptor index */ #define W 1 /* Pipe write descriptor index */ static int poppid[_NFILE]; FILE * popen(command, type) char *command, *type; { register mode; register fd; int pd[2]; if (pipe(pd) < 0) return (NULL); if (*type == 'w') { mode = W; fd = pd[W]; } else { mode = R; fd = pd[R]; } if ((poppid[fd] = fork()) < 0) { close(pd[R]); close(pd[W]); return (NULL); } if (poppid[fd] == 0) { /* Child */ if (mode == W) { close(pd[W]); close(fileno(stdin)); dup(pd[R]); close(pd[R]); } else { close(pd[R]); close(fileno(stdout)); dup(pd[W]); close(pd[W]); } execl("/bin/sh", "sh", "-c", command, NULL); exit(1); } if (mode == W) { close(pd[R]); return (fdopen(pd[W], "w")); } else { close(pd[W]); return (fdopen(pd[R], "r")); } } pclose(stream) FILE *stream; { register fd; register pid, wpid; int status; int (*hupfun)(), (*intfun)(), (*quitfun)(); fd = fileno(stream); pid = poppid[fd]; poppid[fd] = 0; if (pid==0 || fclose(stream)==EOF) return (-1); hupfun = signal(SIGHUP, SIG_IGN); intfun = signal(SIGINT, SIG_IGN); quitfun = signal(SIGQUIT, SIG_IGN); while ((wpid = wait(&status))!=pid && wpid>=0) ; if (wpid < 0) status = -1; signal(SIGHUP, hupfun); signal(SIGINT, intfun); signal(SIGQUIT, quitfun); return (status); }