stdin: Use non-blocking API.
authorAndre Noll <maan@systemlinux.org>
Tue, 20 Apr 2010 19:29:00 +0000 (21:29 +0200)
committerAndre Noll <maan@systemlinux.org>
Sun, 25 Apr 2010 18:18:20 +0000 (20:18 +0200)
stdin.c

diff --git a/stdin.c b/stdin.c
index 5fc91c9..ca5eb0e 100644 (file)
--- a/stdin.c
+++ b/stdin.c
@@ -61,7 +61,7 @@ static void stdin_post_select(struct sched *s, struct task *t)
 {
        struct stdin_task *sit = container_of(t, struct stdin_task, task);
        ssize_t ret;
-       size_t sz;
+       size_t sz, n;
        char *buf = NULL;
 
        t->error = 0;
@@ -70,8 +70,6 @@ static void stdin_post_select(struct sched *s, struct task *t)
                goto err;
        if (ret == 0)
                return;
-       if (!FD_ISSET(STDIN_FILENO, &s->rfds))
-               return;
        sz = btr_pool_get_buffer(sit->btrp, &buf);
        if (sz == 0)
                return;
@@ -81,15 +79,11 @@ static void stdin_post_select(struct sched *s, struct task *t)
         * reference can not be freed, we're stuck.
         */
        sz = PARA_MIN(sz, btr_pool_size(sit->btrp) / 2);
-       ret = read(STDIN_FILENO, buf, sz);
-       if (ret < 0)
-               ret = -ERRNO_TO_PARA_ERROR(errno);
-       if (ret == 0)
-               ret = -E_STDIN_EOF;
-       if (ret < 0)
-               goto err;
-       btr_add_output_pool(sit->btrp, ret, sit->btrn);
-       return;
+       ret = read_nonblock(STDIN_FILENO, buf, sz, &s->rfds, &n);
+       if (n > 0)
+               btr_add_output_pool(sit->btrp, n, sit->btrn);
+       if (ret >= 0)
+               return;
 err:
        btr_remove_node(sit->btrn);
        //btr_pool_free(sit->btrp);