diff mbox

[2/5] qga: handle G_IO_STATUS_AGAIN in ga_channel_write_all()

Message ID 1443685083-6242-3-git-send-email-den@openvz.org
State New
Headers show

Commit Message

Denis V. Lunev Oct. 1, 2015, 7:38 a.m. UTC
From: Yuri Pudgorodskiy <yur@virtuozzo.com>

glib may return G_IO_STATUS_AGAIN which is actually not an error.
Also fixed a bug when on incomplete write buf pointer was not adjusted.

Signed-off-by: Yuri Pudgorodskiy <yur@virtuozzo.com>
Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Michael Roth <mdroth@linux.vnet.ibm.com>
---
 qga/channel-posix.c | 23 +++++++++++------------
 1 file changed, 11 insertions(+), 12 deletions(-)

Comments

Michael Roth Oct. 1, 2015, 9:54 p.m. UTC | #1
Quoting Denis V. Lunev (2015-10-01 02:38:00)
> From: Yuri Pudgorodskiy <yur@virtuozzo.com>
> 
> glib may return G_IO_STATUS_AGAIN which is actually not an error.
> Also fixed a bug when on incomplete write buf pointer was not adjusted.
> 
> Signed-off-by: Yuri Pudgorodskiy <yur@virtuozzo.com>
> Signed-off-by: Denis V. Lunev <den@openvz.org>
> CC: Michael Roth <mdroth@linux.vnet.ibm.com>

Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>

> ---
>  qga/channel-posix.c | 23 +++++++++++------------
>  1 file changed, 11 insertions(+), 12 deletions(-)
> 
> diff --git a/qga/channel-posix.c b/qga/channel-posix.c
> index 8aad4fe..7be92cc 100644
> --- a/qga/channel-posix.c
> +++ b/qga/channel-posix.c
> @@ -217,25 +217,24 @@ GIOStatus ga_channel_write_all(GAChannel *c, const gchar *buf, gsize size)
>      GIOStatus status = G_IO_STATUS_NORMAL;
> 
>      while (size) {
> +        g_debug("sending data, count: %d", (int)size);
>          status = g_io_channel_write_chars(c->client_channel, buf, size,
>                                            &written, &err);
> -        g_debug("sending data, count: %d", (int)size);
> -        if (err != NULL) {
> +        if (status == G_IO_STATUS_NORMAL) {
> +            size -= written;
> +            buf += written;
> +        } else if (status != G_IO_STATUS_AGAIN) {
>              g_warning("error writing to channel: %s", err->message);
> -            return G_IO_STATUS_ERROR;
> -        }
> -        if (status != G_IO_STATUS_NORMAL) {
> -            break;
> +            return status;
>          }
> -        size -= written;
>      }
> 
> -    if (status == G_IO_STATUS_NORMAL) {
> +    do {
>          status = g_io_channel_flush(c->client_channel, &err);
> -        if (err != NULL) {
> -            g_warning("error flushing channel: %s", err->message);
> -            return G_IO_STATUS_ERROR;
> -        }
> +    } while (status == G_IO_STATUS_AGAIN);
> +
> +    if (status != G_IO_STATUS_NORMAL) {
> +        g_warning("error flushing channel: %s", err->message);
>      }
> 
>      return status;
> -- 
> 2.1.4
>
diff mbox

Patch

diff --git a/qga/channel-posix.c b/qga/channel-posix.c
index 8aad4fe..7be92cc 100644
--- a/qga/channel-posix.c
+++ b/qga/channel-posix.c
@@ -217,25 +217,24 @@  GIOStatus ga_channel_write_all(GAChannel *c, const gchar *buf, gsize size)
     GIOStatus status = G_IO_STATUS_NORMAL;
 
     while (size) {
+        g_debug("sending data, count: %d", (int)size);
         status = g_io_channel_write_chars(c->client_channel, buf, size,
                                           &written, &err);
-        g_debug("sending data, count: %d", (int)size);
-        if (err != NULL) {
+        if (status == G_IO_STATUS_NORMAL) {
+            size -= written;
+            buf += written;
+        } else if (status != G_IO_STATUS_AGAIN) {
             g_warning("error writing to channel: %s", err->message);
-            return G_IO_STATUS_ERROR;
-        }
-        if (status != G_IO_STATUS_NORMAL) {
-            break;
+            return status;
         }
-        size -= written;
     }
 
-    if (status == G_IO_STATUS_NORMAL) {
+    do {
         status = g_io_channel_flush(c->client_channel, &err);
-        if (err != NULL) {
-            g_warning("error flushing channel: %s", err->message);
-            return G_IO_STATUS_ERROR;
-        }
+    } while (status == G_IO_STATUS_AGAIN);
+
+    if (status != G_IO_STATUS_NORMAL) {
+        g_warning("error flushing channel: %s", err->message);
     }
 
     return status;