If the chardev we're writing to is nonblocking, just report -EAGAIN to the caller so that the caller can take any further action as it may see fit.
Modify poll call for polling for a timeout of 10ms instead of waiting indefinitely for POLLOUT to get set. Signed-off-by: Amit Shah <amit.s...@redhat.com> --- qemu-char.c | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletions(-) diff --git a/qemu-char.c b/qemu-char.c index 48e1e57..b565872 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -516,6 +516,15 @@ static int unix_write(int fd, const uint8_t *buf, size_t *len) { struct pollfd pollfds[1]; ssize_t tmplen, ret; + int flags; + bool nonblock; + + flags = fcntl(fd, F_GETFL); + if (flags == -1) { + flags = 0; + } + + nonblock = flags & O_NONBLOCK; pollfds[0].fd = fd; pollfds[0].events = POLLOUT; @@ -523,13 +532,16 @@ static int unix_write(int fd, const uint8_t *buf, size_t *len) tmplen = *len; *len = 0; while (tmplen > 0) { - ret = poll(pollfds, 1, -1); + ret = poll(pollfds, 1, 10); if (ret == -1) { if (errno == EINTR) { continue; } return -1; } + if (ret == 0 && nonblock) { + return -EAGAIN; + } ret = write(fd, buf, tmplen); if (ret < 0) { if (errno != EINTR && errno != EAGAIN) { -- 1.6.2.5