1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
/* Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
*/
#include <stdio.h>
#include <errno.h>
#include <sys/poll.h>
#define import_spp
#define import_kernel
#define import_knames
#define import_fpoll
#include <iraf.h>
/* For compilation on systems with old and dev versions.
*/
#ifndef IRAF_POLLIN
#define IRAF_POLLIN 0x0001 /* There is data to read */
#define IRAF_POLLPRI 0x0002 /* There is urgent data to read */
#define IRAF_POLLOUT 0x0004 /* Writing now will not block */
#define IRAF_POLLERR 0x0008 /* Error condition */
#define IRAF_POLLHUP 0x0010 /* Hung up */
#define IRAF_POLLNVAL 0x0020 /* Invalid request: fd not open */
#endif
/* ZFPOLL -- Wait for events on a set of file descriptors. The 'pfds'
* array is passed in as an array of (nfd/3) integer triplets representing
* the (fd,events,revents) elements of the pollfd stucture. If the 'timeout'
* value is negative the poll will block until an event occurs, otherwise we
* will return after the specified number of milliseconds. Upon return,
* the 'pfds' array is overwritten with the return events.
*/
int
ZFPOLL (
XINT *pfds, /* pollfd array */
XINT *nfds, /* no. of file descriptors to poll */
XINT *timeout, /* timeout (milliseconds) */
XINT *npoll, /* poll return value */
XINT *status /* return status */
)
{
struct pollfd tmp_fds[MAX_POLL_FD];
int i, j, nf = *nfds;
extern int errno;
/* Check for errors and initialize the pollfd array. */
if (nf > MAX_POLL_FD) {
*npoll = -4;
*status = XERR;
return (XERR);
}
memset ((char *)tmp_fds, 0, sizeof(tmp_fds));
memset ((char *)poll_fds, 0, sizeof(poll_fds));
/* Break out the pfds array into the proper pollfd struct. */
for (i=j=0; i < nf; i++) {
poll_fds[i].fp_fd = pfds[j++];
poll_fds[i].fp_events = (unsigned short)pfds[j++];
poll_fds[i].fp_revents = (unsigned short)pfds[j++];
tmp_fds[i].fd = poll_fds[i].fp_fd;
if ( (poll_fds[i].fp_events & IRAF_POLLIN) != 0 )
tmp_fds[i].events |= POLLIN;
if ( (poll_fds[i].fp_events & IRAF_POLLPRI) != 0 )
tmp_fds[i].events |= POLLPRI;
if ( (poll_fds[i].fp_events & IRAF_POLLOUT) != 0 )
tmp_fds[i].events |= POLLOUT;
if ( (poll_fds[i].fp_events & IRAF_POLLERR) != 0 )
tmp_fds[i].events |= POLLERR;
if ( (poll_fds[i].fp_events & IRAF_POLLHUP) != 0 )
tmp_fds[i].events |= POLLHUP;
if ( (poll_fds[i].fp_events & IRAF_POLLNVAL) != 0 )
tmp_fds[i].events |= POLLNVAL;
tmp_fds[i].revents = tmp_fds[i].events;
}
/* Do the poll of the descriptors. */
*npoll = poll (tmp_fds, nf, *timeout);
for (i=0; i < nf; i++) {
if ( (tmp_fds[i].revents & POLLIN) != 0 )
poll_fds[i].fp_revents |= IRAF_POLLIN;
else
poll_fds[i].fp_revents &= ~IRAF_POLLIN;
if ( (tmp_fds[i].revents & POLLPRI) != 0 )
poll_fds[i].fp_revents |= IRAF_POLLPRI;
else
poll_fds[i].fp_revents &= ~IRAF_POLLPRI;
if ( (tmp_fds[i].revents & POLLOUT) != 0 )
poll_fds[i].fp_revents |= IRAF_POLLOUT;
else
poll_fds[i].fp_revents &= ~IRAF_POLLOUT;
if ( (tmp_fds[i].revents & IRAF_POLLERR) != 0 )
poll_fds[i].fp_revents |= IRAF_POLLERR;
else
poll_fds[i].fp_revents &= ~IRAF_POLLERR;
if ( (tmp_fds[i].revents & POLLHUP) != 0 )
poll_fds[i].fp_revents |= IRAF_POLLHUP;
else
poll_fds[i].fp_revents &= ~IRAF_POLLHUP;
if ( (tmp_fds[i].revents & POLLNVAL) != 0 )
poll_fds[i].fp_revents |= IRAF_POLLNVAL;
else
poll_fds[i].fp_revents &= ~IRAF_POLLNVAL;
}
if (*npoll < 0) {
if (*npoll == EBADF)
*npoll = -3;
else if (*npoll == EINTR)
*npoll = -2;
else
*npoll = XERR;
*status = XERR;
return (XERR);
}
/* Write the revents back to the pfds array. */
for (j=0,i=2; j < nf; i+=3)
pfds[i] = poll_fds[j++].fp_revents;
*status = XOK;
return (*status);
}
|