int netsnmp_large_fd_set_resize(netsnmp_large_fd_set * fdset, int setsize) { int fd_set_bytes; if (fdset->lfs_setsize == setsize) goto success; if (setsize > FD_SETSIZE) { fd_set_bytes = NETSNMP_FD_SET_BYTES(setsize); if (fdset->lfs_setsize > FD_SETSIZE) { fdset->lfs_setptr = realloc(fdset->lfs_setptr, fd_set_bytes); if (!fdset->lfs_setptr) goto out_of_mem; } else { fdset->lfs_setptr = malloc(fd_set_bytes); if (!fdset->lfs_setptr) goto out_of_mem; *fdset->lfs_setptr = fdset->lfs_set; } } else { if (fdset->lfs_setsize > FD_SETSIZE) { fdset->lfs_set = *fdset->lfs_setptr; free(fdset->lfs_setptr); } fdset->lfs_setptr = &fdset->lfs_set; } #if defined(cygwin) || !defined(HAVE_WINSOCK_H) /* * Unix: when enlarging, clear the file descriptors defined in the * resized *fdset but that were not defined in the original *fdset. */ if ( fdset->lfs_setsize == 0 && setsize == FD_SETSIZE ) { /* In this case we can use the OS's FD_ZERO */ FD_ZERO(fdset->lfs_setptr); } else { int i; for (i = fdset->lfs_setsize; i < setsize; i++) LFD_CLR(i, fdset->lfs_setptr); } #endif fdset->lfs_setsize = setsize; #if !defined(cygwin) && defined(HAVE_WINSOCK_H) if (setsize < fdset->lfs_set.fd_count) fdset->lfs_set.fd_count = setsize; #endif success: return 1; out_of_mem: fdset->lfs_setsize = 0; #if !defined(cygwin) && defined(HAVE_WINSOCK_H) fdset->lfs_set.fd_count = 0; #endif return 0; }
void netsnmp_large_fd_set_resize(netsnmp_large_fd_set * fdset, int setsize) { int fd_set_bytes; if (fdset->lfs_setsize == setsize) return; if (setsize > FD_SETSIZE) { fd_set_bytes = NETSNMP_FD_SET_BYTES(setsize); if (fdset->lfs_setsize > FD_SETSIZE) fdset->lfs_setptr = (fd_set *)realloc(fdset->lfs_setptr, fd_set_bytes); else { fdset->lfs_setptr = (fd_set *)malloc(fd_set_bytes); *fdset->lfs_setptr = fdset->lfs_set; } } else { if (fdset->lfs_setsize > FD_SETSIZE) { fdset->lfs_set = *fdset->lfs_setptr; free(fdset->lfs_setptr); } fdset->lfs_setptr = &fdset->lfs_set; } #if ! (! defined(cygwin) && defined(HAVE_WINSOCK_H)) { int i; /* * Unix: clear the file descriptors defined in the resized *fdset * but that were not defined in the original *fdset. */ for (i = fdset->lfs_setsize; i < setsize; i++) FD_CLR(i, fdset->lfs_setptr); } #endif fdset->lfs_setsize = setsize; }