summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2017-03-27 20:33:07 +0300
committerArnold D. Robbins <arnold@skeeve.com>2017-03-27 20:33:07 +0300
commit484169d2d39248d5d2d026902fd45ee8067f8986 (patch)
tree7bb428b5f21b536ba6dd767efd762fca827dddf3
parentc33f1c6537e0fbb1661ada8425e615b0316fad9c (diff)
parent5b7042ea0a68d41c4fbd0d6228f77975ebf8c38b (diff)
downloadgawk-484169d2d39248d5d2d026902fd45ee8067f8986.tar.gz
Merge branch 'master' into feature/stringfix
-rw-r--r--ChangeLog9
-rw-r--r--awk.h2
-rw-r--r--builtin.c4
-rw-r--r--io.c2
-rw-r--r--main.c5
-rw-r--r--vms/ChangeLog10
-rw-r--r--vms/vmstest.com4
7 files changed, 28 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index b827a20b..a528de3f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2017-03-27 Arnold D. Robbins <arnold@skeeve.com>
+
+ Cause EPIPE errors to stdout to generate a real SIGPIPE.
+
+ * awk.h (die_via_sigpipe): New macro.
+ * builtin.c (efwrite): Use it.
+ * io.c (non_fatal_flush_std_file): Ditto.
+ * main.c (usage): Ditto.
+
2017-03-25 Arnold D. Robbins <arnold@skeeve.com>
* io.c (flush_io): Use r_fatal and r_warning for messagefunc
diff --git a/awk.h b/awk.h
index a8255d96..3d082e81 100644
--- a/awk.h
+++ b/awk.h
@@ -1983,7 +1983,9 @@ str_terminate_f(NODE *n, char *savep)
#ifdef SIGPIPE
#define ignore_sigpipe() signal(SIGPIPE, SIG_IGN)
#define set_sigpipe_to_default() signal(SIGPIPE, SIG_DFL)
+#define die_via_sigpipe() (signal(SIGPIPE, SIG_DFL), kill(getpid(), SIGPIPE))
#else
#define ignore_sigpipe()
#define set_sigpipe_to_default()
+#define die_via_sigpipe() exit(EXIT_FATAL)
#endif
diff --git a/builtin.c b/builtin.c
index fba23926..a0db2e4d 100644
--- a/builtin.c
+++ b/builtin.c
@@ -129,9 +129,9 @@ wrerror:
if (errno == 0 || errno == EINVAL)
w32_maybe_set_errno();
#endif
- /* die silently on EPIPE to stdout */
+ /* for stdout, die with a real SIGPIPE, like other awks */
if (fp == stdout && errno == EPIPE)
- gawk_exit(EXIT_SUCCESS); // a la SIGPIPE
+ die_via_sigpipe();
/* otherwise die verbosely */
if ((rp != NULL) ? is_non_fatal_redirect(rp->value, strlen(rp->value)) : is_non_fatal_std(fp))
diff --git a/io.c b/io.c
index 35336331..bb360507 100644
--- a/io.c
+++ b/io.c
@@ -1400,7 +1400,7 @@ non_fatal_flush_std_file(FILE *fp)
if (is_fatal) {
if (errno == EPIPE)
- exit(EXIT_SUCCESS); // simulate SIGPIPE
+ die_via_sigpipe();
else
fatal(fp == stdout
? _("fflush: cannot flush standard output: %s")
diff --git a/main.c b/main.c
index 4f578d3e..73e63448 100644
--- a/main.c
+++ b/main.c
@@ -633,7 +633,10 @@ By default it reads standard input and writes standard output.\n\n"), fp);
warning(_("error writing standard output (%s)"), strerror(errno));
else if (fp == stderr)
warning(_("error writing standard error (%s)"), strerror(errno));
- }
+ } else if (errno == SIGPIPE)
+ die_via_sigpipe();
+
+ // some other problem than SIGPIPE
exit(EXIT_FAILURE);
}
diff --git a/vms/ChangeLog b/vms/ChangeLog
index a2354c19..af9a9539 100644
--- a/vms/ChangeLog
+++ b/vms/ChangeLog
@@ -1,11 +1,15 @@
+2017-03-25 John E. Malmberg <wb8tyw@qsl.net>
+
+ * vmstest.com: Fix argarray teset.
+
2016-12-22 John E. Malmberg <wb8tyw@qsl.net>
- * vmsbuild.com, descrip.mms:
- Update for new [.support] directory.
+ * vmsbuild.com, descrip.mms:
+ Update for new [.support] directory.
2016-11-24 John E. Malmberg <wb8tyw@qsl.net>
- * gawk_verb.com: correct location for gawk executable.
+ * gawk_verb.com: correct location for gawk executable.
2016-10-24 John E. Malmberg <wb8tyw@qsl.net>
diff --git a/vms/vmstest.com b/vms/vmstest.com
index aa96ceba..a10cd3f5 100644
--- a/vms/vmstest.com
+++ b/vms/vmstest.com
@@ -920,8 +920,10 @@ $ return
$
$argarray: echo "argarray"
$ test_class = "basic"
+$ copy sys$disk:[]argarray.in sys$disk:[]argarray.input
+$ purge sys$disk:[]argarray.input
$ define/User TEST "test" !this is useless...
-$ gawk -f argarray.awk ./argarray.in - >_argarray.tmp
+$ gawk -f argarray.awk ./argarray.input - >_argarray.tmp
just a test
$ if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
$ then