nvi - Work around problem with git
authorMatthew Dillon <dillon@apollo.backplane.com>
Fri, 19 Feb 2010 00:32:39 +0000 (16:32 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Fri, 19 Feb 2010 00:32:39 +0000 (16:32 -0800)
* When a vi session managed by a git commit is ^Z'd and then resumed, git
  for some reason will set STDIN to O_NONBLOCKING.  Not only will it do
  this, but the git process will do it in parallel with the resume so
  the point at which stdin becomes non-blocking from the point of view
  of vi is completely non-determinisitc.

* Do an end-run around badly behaving parent processes by using extpread()
  to explicitly override the blocking/non-blocking mode.  Now nvi doesn't
  care whether stdin is in non-blocking mode or not.

contrib/nvi/cl/cl_read.c
test/test/baaz

index 8a95a77..c5a456f 100644 (file)
@@ -159,7 +159,8 @@ cl_read(sp, flags, bp, blen, nrp, tp)
         *    on the next read anyway.
         */
        if (!F_ISSET(clp, CL_STDIN_TTY)) {
-               switch (nr = read(STDIN_FILENO, bp, blen)) {
+               nr = extpread(STDIN_FILENO, bp, blen, O_FBLOCKING, -1);
+               switch (nr) {
                case 0:
                        return (INP_EOF);
                case -1:
@@ -263,7 +264,8 @@ loop:               FD_ZERO(&rdfd);
         * are entered followed by an <EOF> character.
         */
 #define        ONE_FOR_EOF     1
-       switch (nr = read(STDIN_FILENO, bp, blen - ONE_FOR_EOF)) {
+       nr = extpread(STDIN_FILENO, bp, blen - ONE_FOR_EOF, O_FBLOCKING, -1);
+       switch (nr) {
        case  0:                                /* EOF. */
                /*
                 * ^D in canonical mode returns a read of 0, i.e. EOF.  EOF is
index ecf8800..bc706db 100644 (file)
@@ -6,3 +6,5 @@ just to steal a penny
 leant against a crooked stile
 Typing test: Now is the time for all good men to come to the aid of
             their country.
+Typing test: Now is the time for all good men to come to the aid of
+            their country.