Always check the return value of mark_fd_nonblocking().
[paraslash.git] / stdout.c
index 84f2f7cacd3935fd1f60245ff171cbd9f986607d..2215f998abb6e1fb6e8a508df3b1ee8433fb795a 100644 (file)
--- a/stdout.c
+++ b/stdout.c
@@ -6,6 +6,9 @@
 
 /** \file stdout.c functions that deal with writing to stdout */
 
+#include <dirent.h> /* readdir() */
+#include <assert.h>
+
 #include "para.h"
 #include "string.h"
 #include "list.h"
  * This function is always successful. If there is data available in the input
  * buffer, it adds \p STDOUT_FILENO to the write fd set of \a s.
  */
-void stdout_pre_select(struct sched *s, struct task *t)
+static void stdout_pre_select(struct sched *s, struct task *t)
 {
        struct stdout_task *sot = t->private_data;
 
        t->ret = 1;
        sot->check_fd = 0;
        if (!*sot->loaded) {
-               if (*sot->input_eof) {
-                       t->ret = -E_STDOUT_EOF;
+               if (*sot->input_error) {
+                       t->ret = *sot->input_error;
                        s->timeout.tv_sec = 0;
                        s->timeout.tv_usec = 1;
                }
@@ -52,15 +55,15 @@ void stdout_pre_select(struct sched *s, struct task *t)
  * appeears to be writable, the data loaded in the input buffer is written to
  * stdout.
  */
-void stdout_post_select(struct sched *s, struct task *t)
+static void stdout_post_select(struct sched *s, struct task *t)
 {
        struct stdout_task *sot = t->private_data;
        ssize_t ret;
 
        t->ret = 1;
        if (!sot->check_fd) {
-               if (*sot->input_eof)
-                       t->ret = -E_STDOUT_EOF;
+               if (*sot->input_error)
+                       t->ret = *sot->input_error;
                return;
        }
        if (!FD_ISSET(STDOUT_FILENO, &s->wfds))
@@ -77,7 +80,7 @@ void stdout_post_select(struct sched *s, struct task *t)
 
 static void stdout_default_event_handler(struct task *t)
 {
-       PARA_NOTICE_LOG("%p: %s\n", t, PARA_STRERROR(-t->ret));
+       PARA_NOTICE_LOG("%p: %s\n", t, para_strerror(-t->ret));
        unregister_task(t);
 }
 
@@ -92,11 +95,17 @@ static void stdout_default_event_handler(struct task *t)
  */
 void stdout_set_defaults(struct stdout_task *sot)
 {
+       int ret;
+
        sot->task.private_data = sot;
        sot->task.pre_select = stdout_pre_select;
        sot->task.post_select = stdout_post_select;
        sot->task.event_handler = stdout_default_event_handler;
-       sot->eof = 0;
-       mark_fd_nonblock(STDOUT_FILENO);
+       sot->error = 0;
        sprintf(sot->task.status, "stdout writer");
+       ret = mark_fd_nonblocking(STDOUT_FILENO);
+       if (ret >= 0)
+               return;
+       PARA_EMERG_LOG("%s\n", para_strerror(-ret));
+       exit(EXIT_FAILURE);
 }