[libvirt] [PATCH 1/9] fdstream: separate out virCommandPtr cleanup

Cole Robinson crobinso at redhat.com
Mon Apr 25 18:46:27 UTC 2016


Let's us de-nest some of the logic, and will simplify upcoming
patches
---
 src/fdstream.c | 73 +++++++++++++++++++++++++++++++++-------------------------
 1 file changed, 42 insertions(+), 31 deletions(-)

diff --git a/src/fdstream.c b/src/fdstream.c
index a6a0fbe..681b90e 100644
--- a/src/fdstream.c
+++ b/src/fdstream.c
@@ -240,6 +240,46 @@ virFDStreamAddCallback(virStreamPtr st,
     return ret;
 }
 
+static int
+virFDStreamCloseCommand(struct virFDStreamData *fdst)
+{
+    char buf[1024];
+    ssize_t len;
+    int status;
+    int ret = -1;
+
+    if (!fdst->cmd)
+        return 0;
+
+    if ((len = saferead(fdst->errfd, buf, sizeof(buf)-1)) < 0)
+        buf[0] = '\0';
+    else
+        buf[len] = '\0';
+
+    virCommandRawStatus(fdst->cmd);
+    if (virCommandWait(fdst->cmd, &status) < 0)
+        goto error;
+
+    if (status != 0) {
+        if (buf[0] != '\0') {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s", buf);
+        } else if (WIFEXITED(status)) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                           _("I/O helper exited with status %d"),
+                           WEXITSTATUS(status));
+        } else {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("I/O helper exited abnormally"));
+        }
+        goto error;
+    }
+
+    ret = 0;
+ error:
+    virCommandFree(fdst->cmd);
+    fdst->cmd = NULL;
+    return ret;
+}
 
 static int
 virFDStreamCloseInt(virStreamPtr st, bool streamAbort)
@@ -285,37 +325,8 @@ virFDStreamCloseInt(virStreamPtr st, bool streamAbort)
 
     /* mutex locked */
     ret = VIR_CLOSE(fdst->fd);
-    if (fdst->cmd) {
-        char buf[1024];
-        ssize_t len;
-        int status;
-        if ((len = saferead(fdst->errfd, buf, sizeof(buf)-1)) < 0)
-            buf[0] = '\0';
-        else
-            buf[len] = '\0';
-
-        virCommandRawStatus(fdst->cmd);
-        if (virCommandWait(fdst->cmd, &status) < 0) {
-            ret = -1;
-        } else if (status != 0) {
-            if (buf[0] == '\0') {
-                if (WIFEXITED(status)) {
-                    virReportError(VIR_ERR_INTERNAL_ERROR,
-                                   _("I/O helper exited with status %d"),
-                                   WEXITSTATUS(status));
-                } else {
-                    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                                   _("I/O helper exited abnormally"));
-                }
-            } else {
-                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                               buf);
-            }
-            ret = -1;
-        }
-        virCommandFree(fdst->cmd);
-        fdst->cmd = NULL;
-    }
+    if (virFDStreamCloseCommand(fdst) < 0)
+        ret = -1;
 
     if (VIR_CLOSE(fdst->errfd) < 0)
         VIR_DEBUG("ignoring failed close on fd %d", fdst->errfd);
-- 
2.7.3




More information about the libvir-list mailing list