Annotation of 43BSD/lib/libc/stdio/findiop.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1983, 1985 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  */
        !             6: 
        !             7: #if defined(LIBC_SCCS) && !defined(lint)
        !             8: static char sccsid[] = "@(#)findiop.c  5.6 (Berkeley) 3/9/86";
        !             9: #endif LIBC_SCCS and not lint
        !            10: 
        !            11: #include <stdio.h>
        !            12: #include <errno.h>
        !            13: 
        !            14: extern int errno;
        !            15: 
        !            16: #define active(iop)    ((iop)->_flag & (_IOREAD|_IOWRT|_IORW))
        !            17: 
        !            18: #define NSTATIC        20      /* stdin + stdout + stderr + the usual */
        !            19: 
        !            20: FILE _iob[NSTATIC] = {
        !            21:        { 0, NULL, NULL, 0, _IOREAD,            0 },    /* stdin  */
        !            22:        { 0, NULL, NULL, 0, _IOWRT,             1 },    /* stdout */
        !            23:        { 0, NULL, NULL, 0, _IOWRT|_IONBF,      2 },    /* stderr */
        !            24: };
        !            25: 
        !            26: extern char    *calloc();
        !            27: 
        !            28: static char sbuf[NSTATIC];
        !            29: char   *_smallbuf = sbuf;
        !            30: static FILE    **iobglue;
        !            31: static FILE    **endglue;
        !            32: 
        !            33: /*
        !            34:  * Find a free FILE for fopen et al.
        !            35:  * We have a fixed static array of entries, and in addition
        !            36:  * may allocate additional entries dynamically, up to the kernel
        !            37:  * limit on the number of open files.
        !            38:  * At first just check for a free slot in the fixed static array.
        !            39:  * If none are available, then we allocate a structure to glue together
        !            40:  * the old and new FILE entries, which are then no longer contiguous.
        !            41:  */
        !            42: FILE *
        !            43: _findiop()
        !            44: {
        !            45:        register FILE **iov, *iop;
        !            46:        register FILE *fp;
        !            47: 
        !            48:        if (iobglue == 0) {
        !            49:                for (iop = _iob; iop < _iob + NSTATIC; iop++)
        !            50:                        if (!active(iop))
        !            51:                                return (iop);
        !            52: 
        !            53:                if (_f_morefiles() == 0) {
        !            54:                        errno = ENOMEM;
        !            55:                        return (NULL);
        !            56:                }
        !            57:        }
        !            58: 
        !            59:        iov = iobglue;
        !            60:        while (*iov != NULL && active(*iov))
        !            61:                if (++iov >= endglue) {
        !            62:                        errno = EMFILE;
        !            63:                        return (NULL);
        !            64:                }
        !            65: 
        !            66:        if (*iov == NULL)
        !            67:                *iov = (FILE *)calloc(1, sizeof **iov);
        !            68: 
        !            69:        return (*iov);
        !            70: }
        !            71: 
        !            72: _f_morefiles()
        !            73: {
        !            74:        register FILE **iov;
        !            75:        register FILE *fp;
        !            76:        register char *cp;
        !            77:        int nfiles;
        !            78: 
        !            79:        nfiles = getdtablesize();
        !            80: 
        !            81:        iobglue = (FILE **)calloc(nfiles, sizeof *iobglue);
        !            82:        if (iobglue == NULL)
        !            83:                return (0);
        !            84: 
        !            85:        endglue = iobglue + nfiles;
        !            86: 
        !            87:        for (fp = _iob, iov = iobglue; fp < &_iob[NSTATIC]; /* void */)
        !            88:                *iov++ = fp++;
        !            89: 
        !            90:        _smallbuf = calloc(nfiles, sizeof(*_smallbuf));
        !            91:        return (1);
        !            92: }
        !            93: 
        !            94: f_prealloc()
        !            95: {
        !            96:        register FILE **iov;
        !            97:        register FILE *fp;
        !            98: 
        !            99:        if (iobglue == NULL && _f_morefiles() == 0)
        !           100:                return;
        !           101: 
        !           102:        for (iov = iobglue; iov < endglue; iov++)
        !           103:                if (*iov == NULL)
        !           104:                        *iov = (FILE *)calloc(1, sizeof **iov);
        !           105: }
        !           106: 
        !           107: _fwalk(function)
        !           108:        register int (*function)();
        !           109: {
        !           110:        register FILE **iov;
        !           111:        register FILE *fp;
        !           112: 
        !           113:        if (iobglue == NULL) {
        !           114:                for (fp = _iob; fp < &_iob[NSTATIC]; fp++)
        !           115:                        if (active(fp))
        !           116:                                (*function)(fp);
        !           117:        } else {
        !           118:                for (iov = iobglue; iov < endglue; iov++)
        !           119:                        if (*iov && active(*iov))
        !           120:                                (*function)(*iov);
        !           121:        }
        !           122: }
        !           123: 
        !           124: _cleanup()
        !           125: {
        !           126:        extern int fclose();
        !           127: 
        !           128:        _fwalk(fclose);
        !           129: }

unix.superglobalmegacorp.com

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