reactos/modules/rosapps/applications/net/ncftp/sio/SSelect.c

75 lines
1.5 KiB
C

#include "syshdrs.h"
void
SelectSetInit(SelectSetPtr const ssp, const double timeout)
{
double i;
long l;
/* Inititalize SelectSet, which will clear the fd_set, the
* timeval, and the maxfd and numfds to 0.
*/
memset(ssp, 0, sizeof(SelectSet));
l = (long) timeout;
i = (double) l;
ssp->timeout.tv_sec = l;
ssp->timeout.tv_usec = (long) ((timeout - i) * 1000000.0);
} /* SelectSetInit */
void
SelectSetAdd(SelectSetPtr const ssp, const int fd)
{
if (fd >= 0) {
FD_SET(fd, &ssp->fds);
if (ssp->maxfd < (fd + 1))
ssp->maxfd = (fd + 1);
++ssp->numfds;
}
} /* SelectSetAdd */
void
SelectSetRemove(SelectSetPtr const ssp, const int fd)
{
if ((fd >= 0) && (FD_ISSET(fd, &ssp->fds))) {
FD_CLR(fd, &ssp->fds);
/* Note that maxfd is left alone, even if maxfd was
* this one. That is okay.
*/
--ssp->numfds;
}
} /* SelectSetRemove */
int
SelectW(SelectSetPtr ssp, SelectSetPtr resultssp)
{
int rc;
do {
memcpy(resultssp, ssp, sizeof(SelectSet));
rc = select(resultssp->maxfd, NULL, SELECT_TYPE_ARG234 &resultssp->fds, NULL, SELECT_TYPE_ARG5 &resultssp->timeout);
} while ((rc < 0) && (errno == EINTR));
return (rc);
} /* SelectW */
int
SelectR(SelectSetPtr ssp, SelectSetPtr resultssp)
{
int rc;
do {
memcpy(resultssp, ssp, sizeof(SelectSet));
rc = select(resultssp->maxfd, SELECT_TYPE_ARG234 &resultssp->fds, NULL, NULL, SELECT_TYPE_ARG5 &resultssp->timeout);
} while ((rc < 0) && (errno == EINTR));
return (rc);
} /* SelectR */