Annotation of researchv10dc/libI77/notused/fopen.5.c, revision 1.1

1.1     ! root        1: /*     @(#)fopen.c     1.8     */
        !             2: /*LINTLIBRARY*/
        !             3: #include "stdio.h"
        !             4: #include <fcntl.h>
        !             5: 
        !             6: extern int open(), fclose();
        !             7: extern FILE *_findiop(), *_endopen();
        !             8: 
        !             9: FILE *
        !            10: fopen(file, mode)
        !            11: char   *file, *mode;
        !            12: {
        !            13:        return (_endopen(file, mode, _findiop()));
        !            14: }
        !            15: 
        !            16: FILE *
        !            17: freopen(file, mode, iop)
        !            18: char   *file, *mode;
        !            19: register FILE *iop;
        !            20: {
        !            21:        (void) fclose(iop); /* doesn't matter if this fails */
        !            22:        return (_endopen(file, mode, iop));
        !            23: }
        !            24: 
        !            25: static FILE *
        !            26: _endopen(file, mode, iop)
        !            27: char   *file, *mode;
        !            28: register FILE *iop;
        !            29: {
        !            30:        register int    plus, oflag, fd;
        !            31: 
        !            32:        if (iop == NULL || file == NULL || file[0] == '\0')
        !            33:                return (NULL);
        !            34:        plus = (mode[1] == '+');
        !            35:        switch (mode[0]) {
        !            36:        case 'w':
        !            37:                oflag = (plus ? O_RDWR : O_WRONLY) | O_TRUNC | O_CREAT;
        !            38:                break;
        !            39:        case 'a':
        !            40:                oflag = (plus ? O_RDWR : O_WRONLY) | O_APPEND | O_CREAT;
        !            41:                break;
        !            42:        case 'r':
        !            43:                oflag = plus ? O_RDWR : O_RDONLY;
        !            44:                break;
        !            45:        default:
        !            46:                return (NULL);
        !            47:        }
        !            48:        if ((fd = open(file, oflag, 0666)) < 0)
        !            49:                return (NULL);
        !            50:        iop->_cnt = 0;
        !            51:        iop->_file = fd;
        !            52:        iop->_flag = plus ? _IORW : (mode[0] == 'r') ? _IOREAD : _IOWRT;
        !            53:        if (mode[0] == 'a')   {
        !            54:                if (!plus)  {
        !            55:                        /* if update only mode, move file pointer to the end
        !            56:                           of the file */
        !            57:                        if ((lseek(fd,0L,2)) < 0)  {
        !            58:                                return NULL;
        !            59:                        }
        !            60:                }
        !            61:        }
        !            62:        _bufend(iop) = iop->_base = iop->_ptr = NULL;
        !            63:        return (iop);
        !            64: }

unix.superglobalmegacorp.com

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