- 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/%d\n", ret, rn.loaded);
- if (ret < 0) {
- ret = -E_WRITE_STDOUT;
- goto out;
- }
- if (ret != rn.loaded) {
- PARA_INFO_LOG("short write %d/%d\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_task_register(&sot, &s);
+
+ ti.name = lls_command_name(cmd);
+ ti.pre_select = r->pre_select;
+ ti.post_select = r->post_select;
+ ti.context = &rn;
+ rn.task = task_register(&ti, &s);
+
+ s.default_timeout.tv_sec = 1;
+ s.default_timeout.tv_usec = 0;
+ ret = schedule(&s);
+ sched_shutdown(&s);
+ r->close(&rn);
+ btr_remove_node(&sot.btrn);
+ btr_remove_node(&rn.btrn);
+free_receiver_lpr:
+ lls_free_parse_result(receiver_lpr, cmd);