--- /dev/null
+#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 */