--- libfcgi/os_unix.c.orig	Wed Aug  2 05:36:43 2000
+++ libfcgi/os_unix.c	Sun Aug 20 14:32:35 2000
@@ -404,9 +404,13 @@
  */
 int OS_Read(int fd, char * buf, size_t len)
 {
-    return(read(fd, buf, len));
+    int result;
+    do {
+	result = read(fd, buf, len);
+    } while((result == -1) && (errno == EINTR));
+    return(result);
 }
-
+
 /*
  *--------------------------------------------------------------
  *
@@ -425,10 +429,13 @@
  */
 int OS_Write(int fd, char * buf, size_t len)
 {
-    return(write(fd, buf, len));
+    int result;
+    do {
+	result = write(fd, buf, len);
+    } while((result == -1) && (errno == EINTR));
+    return(result);
 }
 
-
 /*
  *----------------------------------------------------------------------
  *
@@ -753,8 +760,10 @@
      * any work to do.
      */
     if(numRdPosted == 0 && numWrPosted == 0) {
-        selectStatus = select((maxFd+1), &readFdSetCpy, &writeFdSetCpy,
-                              NULL, tmo);
+	do {
+            selectStatus = select((maxFd+1), &readFdSetCpy, &writeFdSetCpy,
+                                  NULL, tmo);
+	} while ((selectStatus == -1) && (errno == EINTR));
         if(selectStatus < 0) {
             exit(errno);
 	}
@@ -1020,11 +1029,15 @@
 {
     struct timeval tval = { READABLE_UNIX_FD_DROP_DEAD_TIMEVAL };
     fd_set read_fds;
+    int result;
 
     FD_ZERO(&read_fds);
     FD_SET(fd, &read_fds);
 
-    return select(fd + 1, &read_fds, NULL, NULL, &tval) >= 0 && FD_ISSET(fd, &read_fds);
+    do {
+      result = select(fd + 1, &read_fds, NULL, NULL, &tval);
+    } while((result == -1) && (errno == EINTR));
+    return result >= 0 && FD_ISSET(fd, &read_fds);
 }
 
 /*
