summaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
authorChip Salzenberg <chip@atlantic.net>1997-04-30 00:00:00 +1200
committerChip Salzenberg <chip@atlantic.net>1997-04-30 00:00:00 +1200
commit03136e130d992186c97de0acd23f4857b1a277da (patch)
treed949f1f3a199a60e1e0ec5416f9118e7cd259f91 /util.c
parentcf26c822ca0e58de393c90b3f7a75af4335d0d65 (diff)
downloadperl-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.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/util.c b/util.c
index e78ad82863..2ee9c0ef90 100644
--- a/util.c
+++ b/util.c
@@ -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 */