fd_set rset, wset, xset; int i, fdcount, fdsize, *fdlist; int fd, fdstate, rwx, ret, maxfd;  fdlist = NULL; fdcount = fdsize = 0;   i = 0; for (fd = first_fd(&fdstate, &rwx); fd >= 0; fd = next_fd(&fdstate, &rwx)) i++;  if (i < 1) return -1;		          if (i > fdsize) { fdsize = i + 16; fdlist = sresize(fdlist, fdsize, int); }  FD_ZERO(&rset); FD_ZERO(&wset); FD_ZERO(&xset); maxfd = 0;   fdcount = 0; for (fd = first_fd(&fdstate, &rwx); fd >= 0; fd = next_fd(&fdstate, &rwx)) { fdlist[fdcount++] = fd; if (rwx & 1) FD_SET_MAX(fd, maxfd, rset); if (rwx & 2) FD_SET_MAX(fd, maxfd, wset); if (rwx & 4) FD_SET_MAX(fd, maxfd, xset); }  do { ret = select(maxfd, &rset, &wset, &xset, NULL); } while (ret < 0 && errno == EINTR);  if (ret < 0) { perror("select"); exit(1); }  for (i = 0; i < fdcount; i++) { fd = fdlist[i];  if (FD_ISSET(fd, &xset)) select_result(fd, 4); if (FD_ISSET(fd, &rset)) select_result(fd, 1); if (FD_ISSET(fd, &wset)) select_result(fd, 2); }  sfree(fdlist);  return 0;
return ssh_sftp_do_select(FALSE);
int ssh_sftp_loop_iteration(void){    fd_set rset, wset, xset;    int i, fdcount, fdsize, *fdlist;    int fd, fdstate, rwx, ret, maxfd;    fdlist = NULL;    fdcount = fdsize = 0;    /* Count the currently active fds. */    i = 0;    for (fd = first_fd(&fdstate, &rwx); fd >= 0;	 fd = next_fd(&fdstate, &rwx)) i++;    if (i < 1)	return -1;		       /* doom */    /* Expand the fdlist buffer if necessary. */    if (i > fdsize) {	fdsize = i + 16;	fdlist = sresize(fdlist, fdsize, int);    }    FD_ZERO(&rset);    FD_ZERO(&wset);    FD_ZERO(&xset);    maxfd = 0;    /*     * Add all currently open fds to the select sets, and store     * them in fdlist as well.     */    fdcount = 0;    for (fd = first_fd(&fdstate, &rwx); fd >= 0;	 fd = next_fd(&fdstate, &rwx)) {	fdlist[fdcount++] = fd;	if (rwx & 1)	    FD_SET_MAX(fd, maxfd, rset);	if (rwx & 2)	    FD_SET_MAX(fd, maxfd, wset);	if (rwx & 4)	    FD_SET_MAX(fd, maxfd, xset);    }    do {	ret = select(maxfd, &rset, &wset, &xset, NULL);    } while (ret < 0 && errno == EINTR);    if (ret < 0) {	perror("select");	exit(1);    }    for (i = 0; i < fdcount; i++) {	fd = fdlist[i];	/*	 * We must process exceptional notifications before	 * ordinary readability ones, or we may go straight	 * past the urgent marker.	 */	if (FD_ISSET(fd, &xset))	    select_result(fd, 4);	if (FD_ISSET(fd, &rset))	    select_result(fd, 1);	if (FD_ISSET(fd, &wset))	    select_result(fd, 2);    }    sfree(fdlist);    return 0;}