@@ -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) {
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.shah@redhat.com> --- qemu-char.c | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletions(-)