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) \