diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | builtin.c | 13 | ||||
-rw-r--r-- | io.c | 19 |
3 files changed, 33 insertions, 9 deletions
@@ -1,3 +1,13 @@ +2017-03-24 Arnold D. Robbins <arnold@skeeve.com> + + * builtin.c (efwrite): Exit successfully upon EPIPE, as SIGPIPE + done. Improve error messages upon failure to write. + (do_fflush): Update ERRNO for non-fatal flush failures. + * io.c (non_fatal_flush_std_file): Update ERRNO when flush is + non-fatal. + (flush_io): If a redirect is marked non-fatal, only warning, + not fatal message. + 2017-03-23 Arnold D. Robbins <arnold@skeeve.com> * config.sub: Updated again. @@ -131,14 +131,18 @@ wrerror: #endif /* die silently on EPIPE to stdout */ if (fp == stdout && errno == EPIPE) - gawk_exit(EXIT_FATAL); + gawk_exit(EXIT_SUCCESS); // a la SIGPIPE /* otherwise die verbosely */ if ((rp != NULL) ? is_non_fatal_redirect(rp->value, strlen(rp->value)) : is_non_fatal_std(fp)) update_ERRNO_int(errno); else fatal(_("%s to \"%s\" failed (%s)"), from, - rp ? rp->value : _("standard output"), + rp != NULL + ? rp->value + : fp == stdout + ? _("standard output") + : _("standard error"), errno ? strerror(errno) : _("reason unknown")); } @@ -214,7 +218,7 @@ do_fflush(int nargs) /* fflush() */ if (nargs == 0) { - status = flush_io(); + status = flush_io(); // ERRNO updated return make_number((AWKNUM) status); } @@ -224,7 +228,7 @@ do_fflush(int nargs) /* fflush("") */ if (tmp->stlen == 0) { - status = flush_io(); + status = flush_io(); // ERRNO updated DEREF(tmp); return make_number((AWKNUM) status); } @@ -251,6 +255,7 @@ do_fflush(int nargs) if (! is_non_fatal_redirect(tmp->stptr, tmp->stlen)) fatal(_("fflush: cannot flush file `%.*s': %s"), len, file, strerror(errno)); + update_ERRNO_int(errno); } } else if ((rp->flag & RED_TWOWAY) != 0) warning(_("fflush: cannot flush: two-way pipe `%.*s' has closed write end"), @@ -1407,6 +1407,7 @@ non_fatal_flush_std_file(FILE *fp) : _("fflush: cannot flush standard error: %s"), strerror(errno)); } else { + update_ERRNO_int(errno); warning(fp == stdout ? _("error writing standard output (%s)") : _("error writing standard error (%s)"), @@ -1427,26 +1428,34 @@ flush_io() int status = 0; errno = 0; - if (! non_fatal_flush_std_file(stdout)) + if (! non_fatal_flush_std_file(stdout)) // ERRNO updated status++; errno = 0; - if (! non_fatal_flush_std_file(stderr)) + if (! non_fatal_flush_std_file(stderr)) // ERRNO updated status++; + // now for all open redirections for (rp = red_head; rp != NULL; rp = rp->next) { + void (*messagefunc)(const char *mesg, ...) = fatal; + /* flush both files and pipes, what the heck */ if ((rp->flag & RED_WRITE) != 0 && rp->output.fp != NULL) { if (rp->output.gawk_fflush(rp->output.fp, rp->output.opaque) != 0) { + update_ERRNO_int(errno); + + if (is_non_fatal_redirect(rp->value, strlen(rp->value))) + messagefunc = warning; + if ((rp->flag & RED_PIPE) != 0) - warning(_("pipe flush of `%s' failed (%s)."), + messagefunc(_("pipe flush of `%s' failed (%s)."), rp->value, strerror(errno)); else if ((rp->flag & RED_TWOWAY) != 0) - warning(_("co-process flush of pipe to `%s' failed (%s)."), + messagefunc(_("co-process flush of pipe to `%s' failed (%s)."), rp->value, strerror(errno)); else - warning(_("file flush of `%s' failed (%s)."), + messagefunc(_("file flush of `%s' failed (%s)."), rp->value, strerror(errno)); status++; } |