diff --git a/src/interpret.c b/src/interpret.c
index 084ba11401e533fd549430fbd586850d475bb13e..7b70d411a8720801de48f4837375873a76949bfa 100644
--- a/src/interpret.c
+++ b/src/interpret.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: interpret.c,v 1.9 1996/11/14 01:24:09 hubbe Exp $");
+RCSID("$Id: interpret.c,v 1.10 1996/11/18 23:12:31 hubbe Exp $");
 #include "interpret.h"
 #include "object.h"
 #include "program.h"
@@ -83,8 +83,13 @@ void init_interpreter()
 #define MAP_ANONYMOUS 0
   if(fd == -1)
   {
-    fd=open("/dev/zero",O_RDONLY);
-    if(fd < 0) fatal("Failed to open /dev/zero.\n");
+    while(1)
+    {
+      fd=open("/dev/zero",O_RDONLY);
+      if(fd >= 0) break;
+      if(errno != EINTR)
+	fatal("Failed to open /dev/zero.\n");
+    }
   }
 #endif
 
diff --git a/src/modules/files/file.c b/src/modules/files/file.c
index 233680c2f5709408075a60693731204e6adddf1a..31913f3bf561b927b45bb46a6aa8542865e1efcc 100644
--- a/src/modules/files/file.c
+++ b/src/modules/files/file.c
@@ -6,7 +6,7 @@
 #define READ_BUFFER 16384
 
 #include "global.h"
-RCSID("$Id: file.c,v 1.12 1996/11/16 05:17:11 hubbe Exp $");
+RCSID("$Id: file.c,v 1.13 1996/11/18 23:13:05 hubbe Exp $");
 #include "types.h"
 #include "interpret.h"
 #include "svalue.h"
@@ -491,9 +491,10 @@ static void file_open(INT32 args)
   if(!( flags &  (FILE_READ | FILE_WRITE)))
     error("Must open file for at least one of read and write.\n");
 
- retry:
   THREADS_ALLOW();
-  fd=open(str->str,map(flags), 00666);
+  do {
+    fd=open(str->str,map(flags), 00666);
+  } while(fd < 0 && errno == EINTR);
   THREADS_DISALLOW();
 
   if(!fp->current_object->prog)
@@ -507,9 +508,6 @@ static void file_open(INT32 args)
   }
   else if(fd < 0)
   {
-    if(errno == EINTR)
-      goto retry;
-
     ERRNO=EBADF;
   }
   else
diff --git a/src/modules/image/font.c b/src/modules/image/font.c
index af8e4ae12873acb5b0cc0b480f9ed1237ad12b07..29b12e990a0df8b69cb682071f405b1a5f7128f9 100644
--- a/src/modules/image/font.c
+++ b/src/modules/image/font.c
@@ -1,4 +1,4 @@
-/* $Id: font.c,v 1.6 1996/11/14 12:34:57 law Exp $ */
+/* $Id: font.c,v 1.7 1996/11/18 23:13:21 hubbe Exp $ */
 
 #include "global.h"
 
@@ -165,8 +165,11 @@ void font_load(INT32 args)
       free_font_struct(THIS);
       THIS=NULL;
    }
+   do {
+     fd = open(sp[-args].u.string->str,O_RDONLY);
+   } while(fd < 0 && errno == EINTR);
 
-   if ( (fd = open(sp[-args].u.string->str,O_RDONLY)) > -1)
+   if (fd >= 0)
    {
       long size;
       size = file_size(fd);
diff --git a/src/modules/spider/sharedmem.c b/src/modules/spider/sharedmem.c
index 0ec9f24f899806e24ccdd367801d06795b7761c7..2184b9baf59cf6646327c161f20d8ca3c3337565 100644
--- a/src/modules/spider/sharedmem.c
+++ b/src/modules/spider/sharedmem.c
@@ -60,7 +60,9 @@ static void new_shared_chunk(int len)
 
   sprintf(fname, "/tmp/.spinnerlock_%d", (int)getuid());
   unlink(fname);
-  fd = open(fname, O_RDWR|O_CREAT, 0777);
+  do {
+    fd = open(fname, O_RDWR|O_CREAT, 0777);
+  } while(fd < 0 && errno == EINTR);
   unlink(fname);
 
   lseek(fd, len, SEEK_SET);
diff --git a/src/program.c b/src/program.c
index 20b88befcf20246b9148448e714a29b63a91ec6f..a55a05ced28a049969d25889dd66812759bd645b 100644
--- a/src/program.c
+++ b/src/program.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: program.c,v 1.7 1996/11/16 05:17:10 hubbe Exp $");
+RCSID("$Id: program.c,v 1.8 1996/11/18 23:12:32 hubbe Exp $");
 #include "program.h"
 #include "object.h"
 #include "dynamic_buffer.h"
@@ -1292,9 +1292,13 @@ struct program *compile_file(struct pike_string *file_name)
   int fd;
   struct program *p;
 
-  fd=open(file_name->str,O_RDONLY);
-  if(fd < 0)
-    error("Couldn't open file '%s'.\n",file_name->str);
+  while(1)
+  {
+    fd=open(file_name->str,O_RDONLY);
+    if(fd >= 0) break;
+    if(errno != EINTR)
+      error("Couldn't open file '%s'.\n",file_name->str);
+  }
 
 #define FILE_STATE
 #define PUSH
diff --git a/src/rusage.c b/src/rusage.c
index 01b946f810f79dc5dd256aabb0ef492a88d27159..225279a0460b25ba88a572316db52a16eb2c98c3 100644
--- a/src/rusage.c
+++ b/src/rusage.c
@@ -34,17 +34,14 @@ INT32 *low_rusage()
   prusage_t  pru;
   prstatus_t prs;
 
-  if(proc_fd < 0)
+  while(proc_fd < 0)
   {
     char proc_name[30];
 
     sprintf(proc_name, "/proc/%05ld", (long)getpid());
     proc_fd = open(proc_name, O_RDONLY);
-    if(proc_fd < 0)
-    {
-      /* fprintf(stderr, "Couldn't open %s\n", proc_name); */
-      return 0;
-    }
+    if(proc_fd >= 0) break;
+    if(errno != EINTR) return 0;
   }
 
   while(ioctl(proc_fd, PIOCUSAGE, &pru) < 0)