- if (!FD_ISSET(STDOUT_FILENO, &s->wfds))
- return;
- t->ret = -E_STDOUT_WRITE;
- ret = write(STDOUT_FILENO, sot->buf, *sot->loaded);
- if (ret <= 0)
- return;
- *sot->loaded -= ret;
- t->ret = 1;
+ for (;;) {
+ sz = btr_next_buffer(btrn, &buf);
+ if (sz == 0)
+ break;
+ ret = xwrite(STDOUT_FILENO, buf, sz);
+ if (ret <= 0)
+ break;
+ btr_consume(btrn, ret);
+ }
+out:
+ if (ret < 0) {
+ btr_remove_node(&sot->btrn);
+ /* Revert to blocking mode if necessary. */
+ fcntl(STDOUT_FILENO, F_SETFL, sot->fd_flags);
+ }
+ return ret;