dtexec: fix a case on linux where an infinite loop could occur.
authorJon Trulson <jon@radscan.com>
Sun, 29 Dec 2013 22:00:16 +0000 (15:00 -0700)
committerJon Trulson <jon@radscan.com>
Sun, 29 Dec 2013 22:00:16 +0000 (15:00 -0700)
cde/programs/dtexec/Main.c

index b871e52628dc7a0c8fe5b5033f7ef2dd7cb32c6f..d53b1003d715dcb042403a71840bd0a493b92b16 100644 (file)
@@ -1295,6 +1295,20 @@ main (
        COPYBITS(allactivefdsG, readfds);
        COPYBITS(allactivefdsG, exceptfds);
 
+#if defined(linux)
+       /* JET 9/1/98 - linux select will actually modify the timeout struct -
+        *  if a select exits early then the timeout struct will contain the
+        *  amount remaining.  When this gets to 0,0, an infinite loop
+        *  will occur.  So... setup the timeouts each iteration. 
+        */
+
+       timeoutShort.tv_sec  = 0;               /* in quick rediscovery mode */
+       timeoutShort.tv_usec = SHORT_SELECT_TIMEOUT;
+       timeoutLong.tv_sec  = 86400;    /* don't thrash on rediscovery */
+       timeoutLong.tv_usec = 0;
+#endif
+
+
        if (rediscoverSigCldG || rediscoverUrgentSigG) {
            nfound =select(MAXSOCKS, FD_SET_CAST(&readfds), FD_SET_CAST(NULL),
                                FD_SET_CAST(&exceptfds), &timeoutShort);