Retry read/write while there is space

This commit is contained in:
Kovid Goyal 2022-07-07 09:40:25 +05:30
parent d080bf3b9c
commit f0764c24d2
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -361,13 +361,15 @@ send_launch_msg(void) {
static bool static bool
read_or_transfer(int src_fd, int dest_fd, transfer_buf *t) { read_or_transfer(int src_fd, int dest_fd, transfer_buf *t) {
(void)dest_fd; (void)dest_fd;
if (t->sz >= IO_BUZ_SZ) return true; while(t->sz < IO_BUZ_SZ) {
ssize_t n = safe_read(src_fd, t->buf + t->sz, IO_BUZ_SZ - t->sz); ssize_t n = safe_read(src_fd, t->buf + t->sz, IO_BUZ_SZ - t->sz);
if (n < 0) { if (n < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) return true; if (errno == EAGAIN || errno == EWOULDBLOCK) return true;
return false; return false;
}
if (!n) break;
t->sz += n;
} }
t->sz += n;
return true; return true;
} }
@ -378,15 +380,16 @@ read_or_transfer_from_child_tty(void) {
static bool static bool
write_from_to(transfer_buf *src, int dest_fd) { write_from_to(transfer_buf *src, int dest_fd) {
if (!src->sz) return true; while (src->sz) {
ssize_t n = safe_write(dest_fd, src->buf, src->sz); ssize_t n = safe_write(dest_fd, src->buf, src->sz);
if (n < 0) { if (n < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) return true; if (errno == EAGAIN || errno == EWOULDBLOCK) return true;
return false; return false;
} }
if (n > 0) { if (n > 0) {
src->sz -= n; src->sz -= n;
memmove(src->buf, src->buf + n, src->sz); memmove(src->buf, src->buf + n, src->sz);
} else break;
} }
return true; return true;
} }