|
|
1.1 ! root 1: /* library:dospopen.c 1.2 */ ! 2: #include "sccsid.h" ! 3: VERSION(@(#)library:dospopen.c 1.2) ! 4: ! 5: /* popen/pclose: simple MS-DOS piping scheme to imitate UNIX pipes */ ! 6: ! 7: /* information needed between popen and pclose */ ! 8: #include <stdio.h> ! 9: ! 10: static char *prgname[32]; /* program name if write pipe */ ! 11: static int pipetype[32]; /* 1=read 2=write */ ! 12: ! 13: /* open a pipe */ ! 14: FILE *popen(prg,type) ! 15: char *prg,*type; ! 16: { FILE *p; ! 17: int ostdout, ostdin; ! 18: ! 19: switch(*type) { ! 20: ! 21: /* for write style pipe, pclose handles program execution */ ! 22: case 'w' : ! 23: if ((p= fopen("\\pipe.tmp","w")) != NULL) { ! 24: pipetype[fileno(p)]= 1; ! 25: prgname[fileno(p)]= prg; ! 26: } ! 27: return(p); ! 28: ! 29: /* read pipe must create tmp file, set up stdout to point to the temp ! 30: * file, and run the program. note that if the pipe file cannot be ! 31: * opened, it'll return a condition indicating pipe failure, which is ! 32: * fine. ! 33: */ ! 34: ! 35: case 'r' : ! 36: if ((p= fopen("\\pipe.tmp","w")) != NULL) { ! 37: pipetype[fileno(p)]= 2; ! 38: ostdout= dup(fileno(stdout)); /* we need this later */ ! 39: dup2(fileno(stdout),fileno(p)); /* substitute for stdout */ ! 40: system(prg); /* run the program */ ! 41: dup2(fileno(stdout),ostdout); /* repair stdout */ ! 42: fclose(p); /* close redirected stdout */ ! 43: return(fopen("\\pipe.tmp","r")); /* return pointer to tmp file */ ! 44: } ! 45: return(NULL); /* everyone has their problems */ ! 46: ! 47: /* screwy call or unsupported type */ ! 48: default : ! 49: printf("popen: unknown pipe style\n"); ! 50: exit(1); ! 51: } ! 52: } ! 53: ! 54: /* close a pipe */ ! 55: void pclose(p) ! 56: FILE *p; ! 57: { int n; ! 58: int ostdout, ostdin; ! 59: FILE *p2; ! 60: ! 61: switch(pipetype[fileno(p)]) { ! 62: ! 63: /* close the temp file, open again as read, redirect stdin from that ! 64: * file, run the program, then clean up. ! 65: */ ! 66: ! 67: case 1 : ! 68: n= fileno(p); ! 69: fclose(p); ! 70: if ((p2= fopen("\\pipe.tmp","r")) != NULL) { ! 71: ostdin= dup(fileno(stdin)); /* save stdin for later */ ! 72: dup2(fileno(stdin),fileno(p2)); /* redirect to tmp file */ ! 73: system(prgname[n]); /* run the program */ ! 74: dup2(fileno(stdin),ostdin); /* repair stdin */ ! 75: fclose(p2); ! 76: unlink("\\pipe.tmp"); /* erase tmp file */ ! 77: return; ! 78: } ! 79: printf("pclose: could not reopen temporary file\n"); ! 80: exit(1); ! 81: ! 82: /* close the temp file and remove it */ ! 83: case 2 : ! 84: n= fileno(p); /* get file number for unlink */ ! 85: fclose(p); /* close the file */ ! 86: unlink("\\pipe.tmp"); /* erase the file */ ! 87: return; ! 88: ! 89: /* if we're neither read nor write, we have problems */ ! 90: default : ! 91: printf("pclose: internal error\n"); ! 92: exit(1); ! 93: } ! 94: } ! 95:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.