X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/bef1210245bb3180a57f26405369654eaa477f63..1eeed1150149b63d6e49e033697454bc12b533b9:/lunaix-os/hal/term/term_io.c diff --git a/lunaix-os/hal/term/term_io.c b/lunaix-os/hal/term/term_io.c index 835659d..57602c8 100644 --- a/lunaix-os/hal/term/term_io.c +++ b/lunaix-os/hal/term/term_io.c @@ -93,26 +93,35 @@ term_read(struct term* tdev) int term_flush(struct term* tdev) { - if ((tdev->oflags & _OPOST)) { - lcntl_transform_outseq(tdev); - } - struct linebuffer* line_out = &tdev->line_out; - size_t xmit_len = line_out->current->len; - char* xmit_buf = line_out->next->buffer; + char* xmit_buf = tdev->scratch_pad; + lbuf_ref_t current_ref = ref_current(line_out); - rbuffer_gets(line_out->current, xmit_buf, xmit_len); + int count = 0; - off_t off = 0; - int ret = 0; - while (xmit_len && ret >= 0) { - ret = tdev->chdev->ops.write(tdev->chdev, &xmit_buf[off], 0, xmit_len); - xmit_len -= ret; - off += ret; - } + while (!rbuffer_empty(deref(current_ref))) { + if ((tdev->oflags & _OPOST)) { + lcntl_transform_outseq(tdev); + } + + size_t xmit_len = line_out->current->len; - // put back the left over if transmittion went south - rbuffer_puts(line_out->current, xmit_buf, xmit_len); + rbuffer_gets(line_out->current, xmit_buf, xmit_len); + + off_t off = 0; + int ret = 0; + while (xmit_len && ret >= 0) { + ret = tdev->chdev->ops.write(tdev->chdev, &xmit_buf[off], 0, xmit_len); + xmit_len -= ret; + off += ret; + count += ret; + } + + // put back the left over if transmittion went south + rbuffer_puts(line_out->current, xmit_buf, xmit_len); + + line_flip(line_out); + } - return off; + return count; } \ No newline at end of file