-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 = PARA_MAX(max, ret);
-
- PARA_DEBUG_LOG("timeout: %lums\n", tv2ms(&timeout));
- ret = para_select(max + 1, &rfds, &wfds, &timeout);
- if (ret < 0) {
- 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;
+
+ sot.btrn = btr_new_node(&(struct btr_node_description)
+ EMBRACE(.parent = rn.btrn, .name = "stdout"));
+ stdout_set_defaults(&sot);
+ register_task(&s, &sot.task);
+
+ rn.task.pre_select = r->pre_select;
+ rn.task.post_select = r->post_select;
+ sprintf(rn.task.status, "%s", r->name);
+ register_task(&s, &rn.task);
+
+ ret = schedule(&s);