stdout and stderr should be made O_NONBLOCK so that we don't end up blocking
authorben <ben@cda61777-01e9-0310-a592-d414129be87e>
Mon, 24 Sep 2007 19:26:08 +0000 (19:26 +0000)
committerben <ben@cda61777-01e9-0310-a592-d414129be87e>
Mon, 24 Sep 2007 19:26:08 +0000 (19:26 +0000)
the entire process because stdout is busy.

Arguably, this shouldn't apply to stderr when we're printing our own error
messages to it, but I'll leave that fix for another time.

git-svn-id: svn://svn.tartarus.org/sgt/putty@7738 cda61777-01e9-0310-a592-d414129be87e

unix/uxplink.c

index 6b56d2a..c1117e4 100644 (file)
@@ -385,7 +385,7 @@ void try_output(int is_stderr)
     ret = write(fd, senddata, sendlen);
     if (ret > 0)
        bufchain_consume(chain, ret);
-    else if (ret < 0) {
+    else if (ret < 0 && errno != EWOULDBLOCK) {
        perror(is_stderr ? "stderr: write" : "stdout: write");
        exit(1);
     }
@@ -883,6 +883,23 @@ int main(int argc, char **argv)
     local_tty = (tcgetattr(0, &orig_termios) == 0);
     atexit(cleanup_termios);
     ldisc_update(NULL, 1, 1);
+
+    {
+       int fl;
+       /*
+        * Make sure that stdout/err are non-blocking.
+        */
+       if ((fl = fcntl(1, F_GETFL)) == -1 ||
+           fcntl(1, F_SETFL, fl | O_NONBLOCK) == -1) {
+           perror("stdout");
+           exit(1);
+       }
+       if ((fl = fcntl(2, F_GETFL)) == -1 ||
+           fcntl(2, F_SETFL, fl | O_NONBLOCK) == -1) {
+           perror("stderr");
+           exit(1);
+       }
+    }
     sending = FALSE;
     now = GETTICKCOUNT();