-recv:
- FD_ZERO(&rfds);
- FD_ZERO(&wfds);
- timeout.tv_sec = 0;
- timeout.tv_usec = 1000 * 1000;
- max = -1;
- ret = r->pre_select(&rn, &rfds, &wfds, &timeout);
- max = MAX(max, ret);
-
- PARA_DEBUG_LOG("timeout: %lums\n", tv2ms(&timeout));
- ret = select(max + 1, &rfds, &wfds, NULL, &timeout);
- if (ret < 0) {
- if (errno == EINTR || errno == EAGAIN)
- goto recv;
- ret = -E_RECV_SELECT;
- goto out;
- }
- ret = r->post_select(&rn, ret, &rfds, &wfds);
- if (ret < 0)
- goto out;
- if (!ret)
- eof = 1;
- if (!rn.loaded) {
- if (eof)
- goto out;
- goto recv;
- }
- ret = write(STDOUT_FILENO, rn.buf, rn.loaded);
- PARA_DEBUG_LOG("wrote %d/%zd\n", ret, rn.loaded);
- if (ret < 0) {
- ret = -E_WRITE_STDOUT;
- goto out;
- }
- if (ret != rn.loaded) {
- PARA_INFO_LOG("short write %d/%zd\n", ret, rn.loaded);
- memmove(rn.buf, rn.buf + ret, rn.loaded - ret);
- }
- rn.loaded -= ret;
- if (rn.loaded || !eof)
- goto recv;
+
+ if (conf.buffer_tree_given)
+ sot.btrn = btr_new_node("stdout", rn.btrn, NULL, NULL);
+
+ stdout_set_defaults(&sot);
+ sot.bufp = &rn.buf;
+ sot.loaded = &rn.loaded;
+ sot.input_error = &rn.task.error;
+ register_task(&sot.task);
+
+ rn.task.pre_select = r->pre_select;
+ rn.task.post_select = r->post_select;
+ sprintf(rn.task.status, "receiver node");
+ register_task(&rn.task);
+
+ ret = schedule(&s);