OSDN Git Service

cat builtin: permit interrupt during writing; more: avoid SIGPIPE
authorThorsten Glaser <tg@mirbsd.org>
Mon, 28 Jul 2014 13:18:35 +0000 (13:18 +0000)
committerThorsten Glaser <tg@mirbsd.org>
Mon, 28 Jul 2014 21:39:56 +0000 (21:39 +0000)
Change-Id: I883dbb359e2580779d7d9fc8e982fbe2a9180668

mkshrc
src/funcs.c

diff --git a/mkshrc b/mkshrc
index 6d135a3..6c20d1f 100644 (file)
--- a/mkshrc
+++ b/mkshrc
@@ -1,4 +1,4 @@
-# Copyright (c) 2010, 2012, 2013
+# Copyright (c) 2010, 2012, 2013, 2014
 #      Thorsten Glaser <tg@mirbsd.org>
 # This file is provided under the same terms as mksh.
 #-
@@ -54,20 +54,23 @@ function hd {
 }
 
 function more {
-       local dummy line llen curlin=0
-
-       cat "$@" | while IFS= read -r line; do
-               llen=${%line}
-               (( llen == -1 )) && llen=${#line}
-               (( llen = llen ? (llen + COLUMNS - 1) / COLUMNS : 1 ))
-               if (( (curlin += llen) >= LINES )); then
-                       print -n -- '\033[7m--more--\033[0m'
-                       read -u1 dummy
-                       [[ $dummy = [Qq]* ]] && return 0
-                       curlin=$llen
-               fi
-               print -r -- "$line"
-       done
+       (
+               set +m
+               cat "$@" |&
+               trap "rv=\$?; kill $! >/dev/null 2>&1; exit \$rv" EXIT
+               while IFS= read -pr line; do
+                       llen=${%line}
+                       (( llen == -1 )) && llen=${#line}
+                       (( llen = llen ? (llen + COLUMNS - 1) / COLUMNS : 1 ))
+                       if (( (curlin += llen) >= LINES )); then
+                               print -n -- '\033[7m--more--\033[0m'
+                               read -u1 || exit $?
+                               [[ $REPLY = [Qq]* ]] && exit 0
+                               curlin=$llen
+                       fi
+                       print -r -- "$line"
+               done
+       )
 }
 
 function setenv {
index 6698f5e..53ab789 100644 (file)
@@ -3761,12 +3761,14 @@ c_cat(const char **wp)
                                break;
                        while (n) {
                                w = write(STDOUT_FILENO, cp, n);
+                               eno = errno;
+                               /* give the user a chance to ^C out */
+                               intrcheck();
                                if (w == -1) {
-                                       if (errno == EINTR)
+                                       if (eno == EINTR)
                                                /* interrupted, try again */
                                                continue;
                                        /* an error occured during writing */
-                                       eno = errno;
                                        bi_errorf("%s: %s", "<stdout>",
                                            cstrerror(eno));
                                        rv = 1;