summaryrefslogtreecommitdiff
path: root/pc
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2016-11-04 09:48:28 +0200
committerEli Zaretskii <eliz@gnu.org>2016-11-04 09:48:28 +0200
commit3fa6f02daabc1bf2cc21f7854c4af990627a8863 (patch)
treef6070d5eaf9eb29256bbf62a9ce84ec787d2a078 /pc
parent95aa1b0f60981430eb5cca81ead2d86d3c2793e1 (diff)
downloadgawk-3fa6f02daabc1bf2cc21f7854c4af990627a8863.tar.gz
Improve behavior on MS-Windows when stdout is redirected to a pipe.
Diffstat (limited to 'pc')
-rw-r--r--pc/ChangeLog5
-rw-r--r--pc/gawkmisc.pc26
2 files changed, 28 insertions, 3 deletions
diff --git a/pc/ChangeLog b/pc/ChangeLog
index 7ba5fd9c..1ff3bb1f 100644
--- a/pc/ChangeLog
+++ b/pc/ChangeLog
@@ -1,3 +1,8 @@
+2016-11-04 Eli Zaretskii <eliz@gnu.org>
+
+ * gawkmisc.pc (w32_maybe_set_errno) [__MINGW32__]: New function,
+ to correct errno when it is not set to a useful value.
+
2016-09-24 Eli Zaretskii <eliz@gnu.org>
Fix compilation warnings on MinGW with the latest runtime.
diff --git a/pc/gawkmisc.pc b/pc/gawkmisc.pc
index 9939fb48..817e8167 100644
--- a/pc/gawkmisc.pc
+++ b/pc/gawkmisc.pc
@@ -1,6 +1,4 @@
-/*
- * gawkmisc.c --- miscellaneous gawk routines that are OS specific.
- */
+/* gawkmisc.c --- miscellaneous gawk routines that are OS specific. -*-C-*- */
/*
* Copyright (C) 1986, 1988, 1989, 1991 - 2003, 2012, 2016
@@ -897,6 +895,28 @@ w32_status_to_termsig (unsigned status)
return SIGTERM;
}
+void
+w32_maybe_set_errno (void)
+{
+ DWORD w32err = GetLastError ();
+
+ switch (w32err)
+ {
+ /* When stdout is redirected to a pipe, and the program that
+ reads the pipe (e.g., a pager) exits, Windows doesn't set
+ errno to a useful value. Help it DTRT. */
+ case ERROR_BAD_PIPE:
+ case ERROR_PIPE_BUSY:
+ case ERROR_NO_DATA:
+ case ERROR_PIPE_NOT_CONNECTED:
+ errno = EPIPE;
+ break;
+ default:
+ errno = EINVAL;
+ break;
+ }
+}
+
#endif /* __MINGW32__ */
#if defined(__DJGPP__) || defined(__MINGW32__) || defined(__EMX__)