Annotation of researchv10no/ncurses/screen/select.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Code for various kinds of delays.  Most of this is nonportable and
        !             3:  * requires various enhancements to the operating system, so it won't
        !             4:  * work on all systems.  It is included in curses to provide a portable
        !             5:  * interface, and so curses itself can use it for function keys.
        !             6:  */
        !             7: 
        !             8: /*     @(#) select.c: 1.1 10/15/83     (1.10   3/6/83) */
        !             9: 
        !            10: #include "curses.ext"
        !            11: #include <signal.h>
        !            12: 
        !            13: #define NAPINTERVAL 100
        !            14: 
        !            15: /* From early specs - this may change by 4.2BSD */
        !            16: struct _timeval {
        !            17:        long tv_sec;
        !            18:        long tv_usec;
        !            19: };
        !            20: 
        !            21: #ifdef FIONREAD
        !            22: # ifndef TIOCREMOTE
        !            23: /*
        !            24:  * Decide if we can emulate select but don't have it.  This is
        !            25:  * intended to be true only on 4.1BSD, not 4.2BSD or USG.
        !            26:  */
        !            27: #  define NEEDSELECT
        !            28: # endif
        !            29: #endif
        !            30: 
        !            31: #ifdef NEEDSELECT
        !            32: /*
        !            33:  * Emulation of 4.2BSD select system call.  This is somewhat crude but
        !            34:  * better than nothing.  We do FIONREAD on each fd, and if we have to
        !            35:  * wait we use nap to avoid a busy wait.  The resolution of the nap
        !            36:  * will hurt response - so will the fact that we ignore the write fds.
        !            37:  * If we are simulating nap with a 1 second sleep, this will be very poor.
        !            38:  *
        !            39:  * nfds is the number of fds to check - this is usually 20.
        !            40:  * prfds is a pointer to a bit vector of file descriptors - in the case
        !            41:  *     where nfds < 32, prfds points to an integer, where bit 1<<fd
        !            42:  *     is 1 if we are supposed to check file descriptor fd.
        !            43:  * pwfds is like prfds but for write checks instead of read checks.
        !            44:  * ms is the max number of milliseconds to wait before returning failure.
        !            45:  * The value returned is the number of file descriptors ready for input.
        !            46:  * The bit vectors are updated in place.
        !            47:  */
        !            48: 
        !            49: int
        !            50: select(nfds, prfds, pwfds, pefds, timeout)
        !            51: register int nfds;
        !            52: int *prfds, *pwfds, *pefds;
        !            53: struct _timeval *timeout;
        !            54: {
        !            55:        register int fd;
        !            56:        register int rfds = *prfds;
        !            57:        register int n;
        !            58:        int nwaiting, rv = 0;
        !            59:        long ms = timeout->tv_sec * 1000 + timeout->tv_usec / 1000;
        !            60: 
        !            61:        for (;;) {
        !            62:                /* check the fds */
        !            63:                for (fd=0; fd<nfds; fd++)
        !            64:                        if (1<<fd & rfds) {
        !            65:                                ioctl(fd, FIONREAD, &nwaiting);
        !            66:                                if (nwaiting > 0) {
        !            67:                                        rv++;
        !            68:                                } else
        !            69:                                        *prfds &= ~(1<<fd);
        !            70:                        }
        !            71:                if (rv)
        !            72:                        return rv;
        !            73: 
        !            74:                /* Nothing ready.  Should we give up? */
        !            75:                if (ms <= 0)
        !            76:                        return 0;
        !            77: 
        !            78:                *prfds = rfds;  /* we clobbered it, so restore. */
        !            79: 
        !            80:                /* Wait a bit */
        !            81:                n = NAPINTERVAL;
        !            82:                if (ms < NAPINTERVAL)
        !            83:                        n = ms;
        !            84:                ms -= n;
        !            85:                napms(n);
        !            86:        }
        !            87: }
        !            88: #else
        !            89: #ifndef FIONREAD
        !            90: int
        !            91: select(nfds, prfds, pwfds, pefds, ms)
        !            92: register int nfds;
        !            93: int *prfds, *pwfds, *pefds;
        !            94: struct _timeval *ms;
        !            95: {
        !            96:        /* Can't do it, but at least compile right */
        !            97:        return ERR;
        !            98: }
        !            99: #endif FIONREAD
        !           100: #endif NEEDSELECT

unix.superglobalmegacorp.com

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