Tim Waugh 8de145
diff -up cups-1.4.2/cups/sidechannel.c.sidechannel-intrs cups-1.4.2/cups/sidechannel.c
Tim Waugh 8de145
--- cups-1.4.2/cups/sidechannel.c.sidechannel-intrs	2009-09-23 00:20:35.000000000 +0100
Tim Waugh 8de145
+++ cups-1.4.2/cups/sidechannel.c	2009-12-08 11:08:15.297539377 +0000
Tim Waugh 8de145
@@ -116,6 +116,7 @@ cupsSideChannelRead(
Tim Waugh 8de145
   char		buffer[16388];		/* Message buffer */
Tim Waugh 8de145
   int		bytes;			/* Bytes read */
Tim Waugh 8de145
   int		templen;		/* Data length from message */
Tim Waugh 8de145
+  int		nfds;			/* Number of file descriptors */
Tim Waugh 8de145
 #ifdef HAVE_POLL
Tim Waugh 8de145
   struct pollfd	pfd;			/* Poll structure for poll() */
Tim Waugh 8de145
 #else /* select() */
Tim Waugh 8de145
@@ -143,39 +144,31 @@ cupsSideChannelRead(
Tim Waugh 8de145
   pfd.fd     = CUPS_SC_FD;
Tim Waugh 8de145
   pfd.events = POLLIN;
Tim Waugh 8de145
 
Tim Waugh 8de145
-  if (timeout < 0.0)
Tim Waugh 8de145
-  {
Tim Waugh 8de145
-    if (poll(&pfd, 1, -1) < 1)
Tim Waugh 8de145
-      return (-1);
Tim Waugh 8de145
-  }
Tim Waugh 8de145
-  else if (poll(&pfd, 1, (long)(timeout * 1000)) < 1)
Tim Waugh 8de145
-    return (-1);
Tim Waugh 8de145
+  while ((nfds = poll(&pfd, 1, 
Tim Waugh 8de145
+		      timeout < 0.0 ? -1 : (long)(timeout * 1000))) < 0 &&
Tim Waugh 8de145
+	 (errno == EINTR || errno == EAGAIN))
Tim Waugh 8de145
+    ;
Tim Waugh 8de145
 
Tim Waugh 8de145
 #else /* select() */
Tim Waugh 8de145
   FD_ZERO(&input_set);
Tim Waugh 8de145
   FD_SET(CUPS_SC_FD, &input_set);
Tim Waugh 8de145
 
Tim Waugh 8de145
-  if (timeout < 0.0)
Tim Waugh 8de145
-  {
Tim Waugh 8de145
-    if (select(CUPS_SC_FD + 1, &input_set, NULL, NULL, NULL) < 1)
Tim Waugh 8de145
-    {
Tim Waugh 8de145
-      DEBUG_printf(("1cupsSideChannelRead: Select error: %s", strerror(errno)));
Tim Waugh 8de145
-      return (-1);
Tim Waugh 8de145
-    }
Tim Waugh 8de145
-  }
Tim Waugh 8de145
-  else
Tim Waugh 8de145
-  {
Tim Waugh 8de145
-    stimeout.tv_sec  = (int)timeout;
Tim Waugh 8de145
-    stimeout.tv_usec = (int)(timeout * 1000000) % 1000000;
Tim Waugh 8de145
+  stimeout.tv_sec  = (int)timeout;
Tim Waugh 8de145
+  stimeout.tv_usec = (int)(timeout * 1000000) % 1000000;
Tim Waugh 8de145
+
Tim Waugh 8de145
+  while ((nfds = select(CUPS_SC_FD + 1, &input_set, NULL, NULL, 
Tim Waugh 8de145
+			timeout < 0.0 ? NULL : &stimeout)) < 0 &&
Tim Waugh 8de145
+	 (errno == EINTR || errno == EAGAIN))
Tim Waugh 8de145
+    ;
Tim Waugh 8de145
 
Tim Waugh 8de145
-    if (select(CUPS_SC_FD + 1, &input_set, NULL, NULL, &stimeout) < 1)
Tim Waugh 8de145
-    {
Tim Waugh 8de145
-      DEBUG_puts("1cupsSideChannelRead: Select timeout");
Tim Waugh 8de145
-      return (-1);
Tim Waugh 8de145
-    }
Tim Waugh 8de145
-  }
Tim Waugh 8de145
 #endif /* HAVE_POLL */
Tim Waugh 8de145
 
Tim Waugh 8de145
+  if  (nfds < 1)
Tim Waugh 8de145
+  {
Tim Waugh 8de145
+    *status = nfds==0 ? CUPS_SC_STATUS_TIMEOUT : CUPS_SC_STATUS_IO_ERROR;
Tim Waugh 8de145
+    return (-1);
Tim Waugh 8de145
+  }
Tim Waugh 8de145
+
Tim Waugh 8de145
  /*
Tim Waugh 8de145
   * Read a side-channel message for the format:
Tim Waugh 8de145
   *