Annotation of 3BSD/lib/libNS/fopen.c, revision 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.