diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2017-04-11 22:28:15 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2017-04-11 22:28:15 +0300 |
commit | 9d331bd9dc0f3e752b1c4a80fe1f7eaad8e34403 (patch) | |
tree | 141cb394eecc653e0f0465df54bf053d6eb521c4 | |
parent | dd883cd071f7988a0b63193051ce9f4ea4877bc8 (diff) | |
parent | bd6dc293e35fdeac05bd1577593e111fd09d22b7 (diff) | |
download | egawk-9d331bd9dc0f3e752b1c4a80fe1f7eaad8e34403.tar.gz egawk-9d331bd9dc0f3e752b1c4a80fe1f7eaad8e34403.tar.bz2 egawk-9d331bd9dc0f3e752b1c4a80fe1f7eaad8e34403.zip |
Merge branch 'master' into feature/stringfix
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | awk.h | 5 | ||||
-rw-r--r-- | io.c | 12 | ||||
-rw-r--r-- | main.c | 8 |
4 files changed, 33 insertions, 0 deletions
@@ -1,3 +1,11 @@ +2017-04-08 Eli Zaretskii <eliz@gnu.org> + + * main.c (usage, copyleft) [__MINGW32__]: + * io.c (non_fatal_flush_std_file, close_io) [__MINGW32__]: Call + w32_maybe_set_errno to correctly set errno to EPIPE when appropriate. + + * awk.h (die_via_sigpipe) [__MINGW32__]: MinGW-specific definition. + 2017-03-27 Arnold D. Robbins <arnold@skeeve.com> Cause EPIPE errors to stdout to generate a real SIGPIPE. @@ -1987,5 +1987,10 @@ str_terminate_f(NODE *n, char *savep) #else #define ignore_sigpipe() #define set_sigpipe_to_default() +#ifdef __MINGW32__ +/* 0xC0000008 is EXCEPTION_INVALID_HANDLE, somewhat appropriate for EPIPE */ +#define die_via_sigpipe() exit(0xC0000008) +#else /* !__MINGW32__ */ #define die_via_sigpipe() exit(EXIT_FATAL) +#endif /* !__MINGW32__ */ #endif @@ -1399,6 +1399,10 @@ non_fatal_flush_std_file(FILE *fp) bool is_fatal = ! is_non_fatal_std(fp); if (is_fatal) { +#ifdef __MINGW32__ + if (errno == 0 || errno == EINVAL) + w32_maybe_set_errno(); +#endif if (errno == EPIPE) die_via_sigpipe(); else @@ -1494,12 +1498,20 @@ close_io(bool *stdio_problem) *stdio_problem = false; /* we don't warn about stdout/stderr if EPIPE, but we do error exit */ if (fflush(stdout) != 0) { +#ifdef __MINGW32__ + if (errno == 0 || errno == EINVAL) + w32_maybe_set_errno(); +#endif if (errno != EPIPE) warning(_("error writing standard output (%s)"), strerror(errno)); status++; *stdio_problem = true; } if (fflush(stderr) != 0) { +#ifdef __MINGW32__ + if (errno == 0 || errno == EINVAL) + w32_maybe_set_errno(); +#endif if (errno != EPIPE) warning(_("error writing standard error (%s)"), strerror(errno)); status++; @@ -627,6 +627,10 @@ By default it reads standard input and writes standard output.\n\n"), fp); fflush(fp); if (ferror(fp)) { +#ifdef __MINGW32__ + if (errno == 0 || errno == EINVAL) + w32_maybe_set_errno(); +#endif /* don't warn about stdout/stderr if EPIPE, but do error exit */ if (errno == EPIPE) die_via_sigpipe(); @@ -673,6 +677,10 @@ along with this program. If not, see http://www.gnu.org/licenses/.\n"); fflush(stdout); if (ferror(stdout)) { +#ifdef __MINGW32__ + if (errno == 0 || errno == EINVAL) + w32_maybe_set_errno(); +#endif /* don't warn about stdout if EPIPE, but do error exit */ if (errno != EPIPE) warning(_("error writing standard output (%s)"), strerror(errno)); |