void netsnmp_large_fd_set_cleanup(netsnmp_large_fd_set * fdset) { netsnmp_large_fd_set_resize(fdset, 0); fdset->lfs_setsize = 0; fdset->lfs_setptr = NULL; }
void netsnmp_copy_fd_set_to_large_fd_set(netsnmp_large_fd_set * dst, const fd_set * src) { netsnmp_large_fd_set_resize(dst, FD_SETSIZE); *dst->lfs_setptr = *src; }
void netsnmp_large_fd_set_init(netsnmp_large_fd_set * fdset, int setsize) { fdset->lfs_setsize = 0; fdset->lfs_setptr = NULL; netsnmp_large_fd_set_resize(fdset, setsize); }
void netsnmp_large_fd_setfd (int fd, netsnmp_large_fd_set * fdset) { netsnmp_assert (fd >= 0); while (fd >= (int) fdset->lfs_setsize) netsnmp_large_fd_set_resize (fdset, 2 * (fdset->lfs_setsize + 1)); FD_SET (fd, fdset->lfs_setptr); }
void netsnmp_large_fd_set_init (netsnmp_large_fd_set * fdset, int setsize) { fdset->lfs_setsize = 0; fdset->lfs_setptr = NULL; #if !defined(cygwin) && defined(HAVE_WINSOCK_H) fdset->lfs_set.fd_count = 0; #endif netsnmp_large_fd_set_resize (fdset, setsize); }
int netsnmp_large_fd_set_select (int numfds, netsnmp_large_fd_set * readfds, netsnmp_large_fd_set * writefds, netsnmp_large_fd_set * exceptfds, struct timeval *timeout) { #if defined(cygwin) || !defined(HAVE_WINSOCK_H) /* Bit-set representation: make sure all fds have at least size 'numfds'. */ if (readfds && readfds->lfs_setsize < numfds) netsnmp_large_fd_set_resize (readfds, numfds); if (writefds && writefds->lfs_setsize < numfds) netsnmp_large_fd_set_resize (writefds, numfds); if (exceptfds && exceptfds->lfs_setsize < numfds) netsnmp_large_fd_set_resize (exceptfds, numfds); #else /* Array representation: no resizing is necessary. */ #endif return select (numfds, readfds ? readfds->lfs_setptr : NULL, writefds ? writefds->lfs_setptr : NULL, exceptfds ? exceptfds->lfs_setptr : NULL, timeout); }
void netsnmp_large_fd_setfd(SOCKET fd, netsnmp_large_fd_set * fdset) { unsigned i; netsnmp_assert(fd != INVALID_SOCKET); if (fdset->lfs_set.fd_count == fdset->lfs_setsize) netsnmp_large_fd_set_resize(fdset, 2 * (fdset->lfs_setsize + 1)); for (i = 0; i < fdset->lfs_set.fd_count; i++) { if (fdset->lfs_set.fd_array[i] == (SOCKET) (fd)) break; } if (i == fdset->lfs_set.fd_count && fdset->lfs_set.fd_count < fdset->lfs_setsize) { fdset->lfs_set.fd_count++; fdset->lfs_set.fd_array[i] = fd; } }
/* HEADER Testing netsnmp_large_fd_set */ netsnmp_large_fd_set fds; netsnmp_large_fd_set_init (&fds, 2000); OKF (fds.lfs_setsize == 2000, ("initialization")); OKF (netsnmp_large_fd_set_resize (&fds, 2000) == 1, ("resizing to 2000")); NETSNMP_LARGE_FD_ZERO (&fds); { int i; for (i = 0; i < fds.lfs_setsize; ++i) { OKF (!NETSNMP_LARGE_FD_ISSET (i, &fds), ("%d is not set", i)); NETSNMP_LARGE_FD_SET (i, &fds); OKF (NETSNMP_LARGE_FD_ISSET (i, &fds), ("%d is set", i)); NETSNMP_LARGE_FD_CLR (i, &fds); OKF (!NETSNMP_LARGE_FD_ISSET (i, &fds), ("%d is not set", i)); } } OKF (netsnmp_large_fd_set_resize (&fds, 3000) == 1, ("resizing to 3000")); { int i; for (i = 0; i < fds.lfs_setsize; ++i) { OKF (!NETSNMP_LARGE_FD_ISSET (i, &fds), ("%d is not set", i));