home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Distributions / ucb / spencer_2bsd.tar.gz / 2bsd.tar / src / ex / popen.c < prev    next >
C/C++ Source or Header  |  1980-02-17  |  744b  |  43 lines

  1. /* Copyright (c) 1979 Regents of the University of California */
  2. #include    "stdio.h"
  3. #define tst(a,b) (*mode == 'r' ? (b) : (a))
  4.  
  5. FILE *
  6. popen(cmd,mode)
  7. char *cmd;
  8. char *mode;
  9. {
  10.     register i;
  11.     FILE *fptr;
  12.     struct pstruct {
  13.         int reader;
  14.         int writer;
  15.     } str;
  16.  
  17.     if (pipe(&str)<0) return NULL;
  18.     if ((i=fork())==0) {
  19.         close(tst(str.writer,str.reader));
  20.         close(tst(0,1));
  21.         dup(tst(str.reader,str.writer));
  22.         close(tst(str.reader,str.writer));
  23.         execl("/bin/sh","sh","-c",cmd,0);
  24.         exit(1);
  25.     }
  26.     if (i== -1) return NULL;
  27.     close(tst(str.reader,str.writer));
  28.     fptr=fopen("/dev/null",tst("w","r"));
  29.     setbuf(fptr,NULL);
  30.     fptr->_file=tst(str.writer,str.reader);
  31.     return fptr;
  32. }
  33.  
  34. pclose(ptr)
  35. FILE *ptr;
  36. {
  37.     int st;
  38.  
  39.     fclose(ptr);
  40.     wait(&st);
  41.     return st;
  42. }
  43.