Annotation of 3BSD/lib/libNS/fopen.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1979 Regents of the University of California */
                      2: #include       <nstdio.h>
                      3: 
                      4: struct _iobuf *fopen(file, mode)
                      5: register char *mode;
                      6: {
                      7:        register f;
                      8:        register struct _iobuf *iop;
                      9:        int unixmode, a_flag, noclob;
                     10: 
                     11:        for (iop = _iob; iop->_flag&(_IOREAD|_IOWRT); iop++)
                     12:                if (iop >= _iob + _NFILE)
                     13:                        return(NULL);
                     14:        iop->_flag = 0;
                     15:        iop->_delta = 0;
                     16:        a_flag = 0;
                     17:        noclob = 0;
                     18:        for(;*mode;mode++) {
                     19:                switch(*mode) {
                     20: 
                     21:                case 'w':
                     22:                        iop->_flag |= _IOWRT;
                     23:                        break;
                     24: 
                     25:                case 'r':
                     26:                        iop->_flag |= _IOREAD;
                     27:                        break;
                     28: 
                     29:                case 'a':
                     30:                        a_flag = 1;
                     31:                        noclob = 1;
                     32:                        iop->_flag |= _IOWRT ;
                     33:                        break;
                     34: 
                     35:                case '+':
                     36:                        if (iop->_flag & _IOREAD)
                     37:                                noclob = 1;
                     38:                        iop->_flag |= (_IOREAD | _IOWRT);
                     39:                        break;
                     40:                }
                     41:        }
                     42:        if((unixmode = (iop->_flag & 3) - 1) < 0) {
                     43:                unixmode = 0;
                     44:                iop->_flag = 1;
                     45:        }
                     46:        if ((iop->_flag & _IOWRT) && noclob==0 ) {
                     47:                f = creat(file, 0644);
                     48:                if((iop->_flag &  _IOREAD) && (f>0)) {
                     49:                        close(f);
                     50:                        f = open(file,2);
                     51:                }
                     52:        }
                     53:        else
                     54:                if ((0 >(f = open(file, unixmode))) && (noclob || !(iop->_flag&_IOREAD))) {
                     55:                        f = creat(file, 0644);
                     56:                        close(f);
                     57:                        f = open(file,unixmode);
                     58:                }
                     59: 
                     60:        if (f < 0)
                     61:                return(NULL);
                     62:        if (a_flag)
                     63:                lseek(f, (long) 0, 2);
                     64:        iop->_file = f;
                     65:        return(iop);
                     66: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.