diff options
author | Chip Salzenberg <chip@atlantic.net> | 1997-04-30 00:00:00 +1200 |
---|---|---|
committer | Chip Salzenberg <chip@atlantic.net> | 1997-04-30 00:00:00 +1200 |
commit | 03136e130d992186c97de0acd23f4857b1a277da (patch) | |
tree | d949f1f3a199a60e1e0ec5416f9118e7cd259f91 /util.c | |
parent | cf26c822ca0e58de393c90b3f7a75af4335d0d65 (diff) | |
download | perl-03136e130d992186c97de0acd23f4857b1a277da.tar.gz |
Reset errno after failed piped close
(this is the same change as commit 00db273fa22ecba6466df777a772c6017c403a96, but as applied)
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 18 |
1 files changed, 16 insertions, 2 deletions
@@ -1964,6 +1964,11 @@ PerlIO *ptr; int status; SV **svp; int pid; + bool close_failed; + int saved_errno; +#ifdef VMS + int saved_vaxc_errno; +#endif svp = av_fetch(fdpid,PerlIO_fileno(ptr),TRUE); pid = (int)SvIVX(*svp); @@ -1974,7 +1979,12 @@ PerlIO *ptr; return my_syspclose(ptr); } #endif - PerlIO_close(ptr); + if ((close_failed = (PerlIO_close(ptr) == EOF))) { + saved_errno = errno; +#ifdef VMS + saved_vaxc_errno = vaxc$errno; +#endif + } #ifdef UTS if(kill(pid, 0) < 0) { return(pid); } /* HOM 12/23/91 */ #endif @@ -1987,7 +1997,11 @@ PerlIO *ptr; rsignal_restore(SIGHUP, &hstat); rsignal_restore(SIGINT, &istat); rsignal_restore(SIGQUIT, &qstat); - return(pid < 0 ? pid : status); + if (close_failed) { + SETERRNO(saved_errno, saved_vaxc_errno); + return -1; + } + return(pid < 0 ? pid : status == 0 ? 0 : (errno = 0, status)); } #endif /* !DOSISH */ |