fd_set rset, wset, xset;
int i, fdcount, fdsize, *fdlist;
int fd, fdstate, rwx, ret, maxfd;
- long now = GETTICKCOUNT();
+ unsigned long now = GETTICKCOUNT();
+ unsigned long next;
fdlist = NULL;
fdcount = fdsize = 0;
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 */
+ if (toplevel_callback_pending()) {
+ struct timeval tv;
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ ret = select(maxfd, &rset, &wset, &xset, &tv);
+ if (ret == 0)
+ run_toplevel_callbacks();
+ } else if (run_timers(now, &next)) {
+ do {
+ unsigned long then;
+ long ticks;
+ struct timeval tv;
+
+ then = now;
+ now = GETTICKCOUNT();
+ if (now - then > next - then)
+ ticks = 0;
+ else
+ ticks = next - now;
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);
+ ret = select(maxfd, &rset, &wset, &xset, &tv);
+ if (ret == 0)
+ now = next;
+ else
+ now = GETTICKCOUNT();
+ } while (ret < 0 && errno == EINTR);
+ } else {
+ ret = select(maxfd, &rset, &wset, &xset, NULL);
+ }
} while (ret == 0);
if (ret < 0) {
sfree(fdlist);
+ run_toplevel_callbacks();
+
return FD_ISSET(0, &rset) ? 1 : 0;
}
ret = ssh_sftp_do_select(TRUE, no_fds_ok);
if (ret < 0) {
printf("connection died\n");
+ sfree(buf);
return NULL; /* woop woop */
}
if (ret > 0) {
ret = read(0, buf+buflen, 1);
if (ret < 0) {
perror("read");
+ sfree(buf);
return NULL;
}
if (ret == 0) {
/* eof on stdin; no error, but no answer either */
+ sfree(buf);
return NULL;
}