Merge branch 't/stdin_stdout_fixes'
authorAndre Noll <maan@systemlinux.org>
Tue, 11 Jun 2013 18:41:49 +0000 (20:41 +0200)
committerAndre Noll <maan@systemlinux.org>
Tue, 11 Jun 2013 18:43:36 +0000 (20:43 +0200)
Was cooking for almost a month.

b99b4a stdin/stdout: Restore fd flags on shutdown.

Conflicts:
stdin.c
stdout.c

1  2 
NEWS
stdin.c
stdout.c

diff --cc NEWS
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -2,12 -2,6 +2,14 @@@
  0.?.? (to be announced) "spectral gravity"
  ------------------------------------------
  
 +      - UTF8 support for para_gui and the mp3 audio format handler.
 +      - Scheduler improvements and fixes.
 +      - The obsolete gettimeofday() function has been replaced
 +        by clock_gettime() on systems which support it.
 +      - Speed and usability improvements for para_gui.
++      - para_client now restores the fd flags of stdin and stdout
++        on shutdown
 +
  -----------------------------------------
  0.4.12 (2012-12-20) "volatile relativity"
  -----------------------------------------
diff --cc stdin.c
+++ b/stdin.c
@@@ -65,10 -67,16 +65,16 @@@ static int stdin_post_select(struct sch
        if (ret < 0)
                goto err;
        if (ret == 0)
 -              return;
 +              return 0;
        sz = btr_pool_get_buffer(sit->btrp, &buf);
        if (sz == 0)
 -              return;
 +              return 0;
+       if (sit->must_set_nonblock_flag) {
+               ret = mark_fd_nonblocking(STDIN_FILENO);
+               if (ret < 0)
+                       goto err;
+               sit->must_set_nonblock_flag = false;
+       }
        /*
         * Do not use the maximal size to avoid having only a single buffer
         * reference for the whole pool. This is bad because if that single
        if (n > 0)
                btr_add_output_pool(sit->btrp, n, sit->btrn);
        if (ret >= 0)
 -              return;
 +              return 0;
  err:
        btr_remove_node(&sit->btrn);
+       /* Revert to blocking mode if necessary. */
+       fcntl(STDIN_FILENO, F_SETFL, sit->fd_flags);
        //btr_pool_free(sit->btrp);
 -      t->error = ret;
 +      return ret;
  }
  
  /**
diff --cc stdout.c
+++ b/stdout.c
@@@ -58,10 -60,16 +58,16 @@@ static int stdout_post_select(struct sc
        if (ret < 0)
                goto out;
        if (ret == 0)
 -              return;
 +              return 0;
        if (!FD_ISSET(STDOUT_FILENO, &s->wfds))
 -              return;
 +              return 0;
  
+       if (sot->must_set_nonblock_flag) {
+               ret = mark_fd_nonblocking(STDOUT_FILENO);
+               if (ret < 0)
+                       goto out;
+               sot->must_set_nonblock_flag = false;
+       }
        for (;;) {
                sz = btr_next_buffer(btrn, &buf);
                if (sz == 0)
                btr_consume(btrn, ret);
        }
  out:
-       if (ret < 0)
+       if (ret < 0) {
                btr_remove_node(&sot->btrn);
 -      t->error = ret;
+               /* Revert to blocking mode if necessary. */
+               fcntl(STDOUT_FILENO, F_SETFL, sot->fd_flags);
+       }
 +      return ret;
  }
  /**
   * Initialize a stdout task structure with default values.