Having laboriously constructed a hints parameter for getaddrinfo, it
[u/mdw/putty] / unix / uxplink.c
index e2b4d3d..99acc6f 100644 (file)
@@ -13,6 +13,7 @@
 #include <termios.h>
 #include <pwd.h>
 #include <sys/ioctl.h>
+#include <sys/select.h>
 
 #define PUTTY_DO_GLOBALS              /* actually _define_ globals */
 #include "putty.h"
@@ -227,6 +228,7 @@ static void usage(void)
     printf("  -A -a     enable / disable agent forwarding\n");
     printf("  -t -T     enable / disable pty allocation\n");
     printf("  -1 -2     force use of particular protocol version\n");
+    printf("  -4 -6     force use of IPv4 or IPv6\n");
     printf("  -C        enable compression\n");
     printf("  -i key    private key file for authentication\n");
     printf("  -s        remote command is an SSH subsystem (SSH-2 only)\n");
@@ -252,6 +254,7 @@ int main(int argc, char **argv)
     int errors;
     int use_subsystem = 0;
     void *ldisc, *logctx;
+    long now;
 
     ssh_get_line = console_get_line;
 
@@ -584,6 +587,7 @@ int main(int argc, char **argv)
     atexit(cleanup_termios);
     ldisc_update(NULL, 1, 1);
     sending = FALSE;
+    now = GETTICKCOUNT();
 
     while (1) {
        fd_set rset, wset, xset;
@@ -644,7 +648,23 @@ int main(int argc, char **argv)
        }
 
        do {
-           ret = select(maxfd, &rset, &wset, &xset, NULL);
+           long next, ticks;
+           struct timeval tv, *ptv;
+
+           if (run_timers(now, &next)) {
+               ticks = next - GETTICKCOUNT();
+               if (ticks < 0) ticks = 0;   /* 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);
 
        if (ret < 0) {