static int ssh_sftp_do_select(int include_stdin)
static int ssh_sftp_do_select(int include_stdin, int no_fds_ok)
static int ssh_sftp_do_select(int include_stdin){    fd_set rset, wset, xset;    int i, fdcount, fdsize, *fdlist;    int fd, fdstate, rwx, ret, maxfd;    long now = GETTICKCOUNT();    fdlist = NULL;    fdcount = fdsize = 0;    do {	/* 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);	}	if (include_stdin)	    FD_SET_MAX(0, maxfd, rset);	do {	    long next, ticks;	    struct timeval tv, *ptv;	    if (run_timers(now, &next)) {		ticks = next - GETTICKCOUNT();		if (ticks <= 0)		    ticks = 1;	       /* just in case */		tv.tv_sec = ticks / 1000;		tv.tv_usec = ticks % 1000 * 1000;		ptv = &tv;	    } else {		ptv = NULL;	    }	    ret = select(maxfd, &rset, &wset, &xset, ptv);	    if (ret == 0)		now = next;	    else		now = GETTICKCOUNT();	} while (ret < 0 && errno != EINTR);    } while (ret == 0);    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 FD_ISSET(0, &rset) ? 1 : 0;}