home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / libc / stdio / endopen.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-05-05  |  854 b   |  69 lines

  1. #include    <stdio.h>
  2. #include    <errno.h>
  3.  
  4. FILE *
  5. _endopen(file, mode, iop)
  6.     char *file, *mode;
  7.     register FILE *iop;
  8. {
  9.     extern int errno;
  10.     register int rw, f;
  11.  
  12.     if (iop == NULL)
  13.         return(NULL);
  14.  
  15.     rw = mode[1] == '+';
  16.  
  17.     switch (*mode) {
  18.  
  19.     case 'w':
  20.         f = create(file, rw);
  21.         break;
  22.  
  23.     case 'a':
  24.         if ((f = open(file, rw? 2: 1)) < 0) {
  25.             if (errno == ENOENT)
  26.                 f = create(file, rw);
  27.         }
  28.         lseek(f, 0L, 2);
  29.         break;
  30.  
  31.     case 'r':
  32.         f = open(file, rw? 2: 0);
  33.         break;
  34.  
  35.     default:
  36.         return(NULL);
  37.     }
  38.  
  39.     if (f < 0)
  40.         return(NULL);
  41.  
  42.     iop->_cnt = 0;
  43.     iop->_file = f;
  44.  
  45.     if (rw)
  46.         iop->_flag |= _IORW;
  47.     else if(*mode == 'r')
  48.         iop->_flag |= _IOREAD;
  49.     else
  50.         iop->_flag |= _IOWRT;
  51.  
  52.     return(iop);
  53. }
  54.  
  55. static int
  56. create(file, rw)
  57.     register char *file;
  58.     int rw;
  59. {
  60.     register int f;
  61.  
  62.     f = creat(file, 0666);
  63.     if (rw && f>=0) {
  64.         close(f);
  65.         f = open(file, 2);
  66.     }
  67.     return(f);
  68. }
  69.