diff --git a/src/modules/files/file.c b/src/modules/files/file.c
index 3281e764990f872800e053a5b25dde3a2c5a8b9f..4db3d4dfd0e152911cb0709270191366d59eb0f1 100644
--- a/src/modules/files/file.c
+++ b/src/modules/files/file.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: file.c,v 1.156 1999/05/19 14:23:28 mirar Exp $");
+RCSID("$Id: file.c,v 1.157 1999/06/10 07:16:20 hubbe Exp $");
 #include "fdlib.h"
 #include "interpret.h"
 #include "svalue.h"
@@ -389,10 +389,12 @@ static struct pike_string *do_read(int fd,
 
     do{
       int fd=FD;
+      int e;
       THREADS_ALLOW();
       i=fd_read(fd, str->str+bytes_read, r);
       THREADS_DISALLOW();
 
+      e=errno;  /* check signals may affect errno */
       check_signals(0,0,0);
 
       if(i>0)
@@ -405,9 +407,9 @@ static struct pike_string *do_read(int fd,
       {
 	break;
       }
-      else if(errno != EINTR)
+      else if(e != EINTR)
       {
-	*err=errno;
+	*err=e;
 	if(!bytes_read)
 	{
 	  free((char *)str);
@@ -445,6 +447,7 @@ static struct pike_string *do_read(int fd,
     initialize_buf(&b);
     SET_ONERROR(ebuf, free_dynamic_buffer, &b);
     do{
+      int e;
       char *buf;
       try_read=MINIMUM(CHUNK,r);
       
@@ -454,6 +457,7 @@ static struct pike_string *do_read(int fd,
       i=fd_read(fd, buf, try_read);
       THREADS_DISALLOW();
 
+      e=errno; /* check signals may effect errno */
       check_signals(0,0,0);
       
       if(i==try_read)
@@ -477,9 +481,9 @@ static struct pike_string *do_read(int fd,
       else
       {
 	low_make_buf_space(-try_read, &b);
-	if(errno != EINTR)
+	if(e != EINTR)
 	{
-	  *err=errno;
+	  *err=e;
 	  if(!bytes_read)
 	  {
 	    free(b.s.str);
@@ -524,11 +528,13 @@ static struct pike_string *do_read_oob(int fd,
     SET_ONERROR(ebuf, call_free, str);
 
     do{
+      int e;
       int fd=FD;
       THREADS_ALLOW();
       i=fd_recv(fd, str->str+bytes_read, r, MSG_OOB);
       THREADS_DISALLOW();
 
+      e=errno;
       check_signals(0,0,0);
 
       if(i>0)
@@ -541,9 +547,9 @@ static struct pike_string *do_read_oob(int fd,
       {
 	break;
       }
-      else if(errno != EINTR)
+      else if(e != EINTR)
       {
-	*err=errno;
+	*err=e;
 	if(!bytes_read)
 	{
 	  free((char *)str);
@@ -581,6 +587,7 @@ static struct pike_string *do_read_oob(int fd,
     initialize_buf(&b);
     SET_ONERROR(ebuf, free_dynamic_buffer, &b);
     do{
+      int e;
       char *buf;
       try_read=MINIMUM(CHUNK,r);
       
@@ -590,6 +597,7 @@ static struct pike_string *do_read_oob(int fd,
       i=fd_recv(fd, buf, try_read, MSG_OOB);
       THREADS_DISALLOW();
 
+      e=errno;
       check_signals(0,0,0);
       
       if(i==try_read)
@@ -613,9 +621,9 @@ static struct pike_string *do_read_oob(int fd,
       else
       {
 	low_make_buf_space(-try_read, &b);
-	if(errno != EINTR)
+	if(e != EINTR)
 	{
-	  *err=errno;
+	  *err=e;
 	  if(!bytes_read)
 	  {
 	    free(b.s.str);
diff --git a/src/signal_handler.c b/src/signal_handler.c
index a8fdb3b91ba92979216f88b39fc46593988138bd..0d68cf9421e1164f73d5dc69ad865ea25772e54f 100644
--- a/src/signal_handler.c
+++ b/src/signal_handler.c
@@ -25,7 +25,7 @@
 #include "main.h"
 #include <signal.h>
 
-RCSID("$Id: signal_handler.c,v 1.136 1999/06/08 21:07:54 hubbe Exp $");
+RCSID("$Id: signal_handler.c,v 1.137 1999/06/10 07:16:13 hubbe Exp $");
 
 #ifdef HAVE_PASSWD_H
 # include <passwd.h>
@@ -162,7 +162,8 @@ RCSID("$Id: signal_handler.c,v 1.136 1999/06/08 21:07:54 hubbe Exp $");
   static volatile sig_atomic_t PIKE_CONCAT(pre,_data_available)
 
 #define BEGIN_FIFO_PUSH(pre,TYPE) do { \
-  TYPE PIKE_CONCAT(pre,_tmp_) ; int PIKE_CONCAT(pre,_tmp3_)
+  TYPE PIKE_CONCAT(pre,_tmp_) ; int PIKE_CONCAT(pre,_tmp3_) ; \
+  int PIKE_CONCAT(pre,_errno_save)=errno
 
 #define FIFO_DATA(pre,TYPE) PIKE_CONCAT(pre,_tmp_)
 
@@ -170,7 +171,8 @@ RCSID("$Id: signal_handler.c,v 1.136 1999/06/08 21:07:54 hubbe Exp $");
  while( (PIKE_CONCAT(pre,_tmp3_)=write(PIKE_CONCAT(pre,_fd)[1],(char *)&PIKE_CONCAT(pre,_tmp_),sizeof(PIKE_CONCAT(pre,_tmp_)))) < 0 && errno==EINTR); \
  DO_IF_DEBUG(if( PIKE_CONCAT(pre,_tmp3_) != sizeof( PIKE_CONCAT(pre,_tmp_))) \
 		  fatal("Atomic pipe write failed!!\n"); ) \
- PIKE_CONCAT(pre,_data_available)=1; \
+  errno=PIKE_CONCAT(pre,_errno_save);\
+  PIKE_CONCAT(pre,_data_available)=1; \
  } while(0)
 
 
@@ -182,7 +184,7 @@ RCSID("$Id: signal_handler.c,v 1.136 1999/06/08 21:07:54 hubbe Exp $");
    while(read(PIKE_CONCAT(pre,_fd)[0],(char *)&PIKE_CONCAT(pre,_tmp_),sizeof(PIKE_CONCAT(pre,_tmp_)))==sizeof(PIKE_CONCAT(pre,_tmp_))) \
    {
 
-#define END_FIFO_LOOP(pre,TYPE) } }while(0)
+#define END_FIFO_LOOP(pre,TYPE) }}while(0)
 
 #define INIT_FIFO(pre,TYPE) do {			\
   if(pike_make_pipe(PIKE_CONCAT(pre,_fd)) <0)		\