[libvirt] [PATCH 13/16] util: Implement virRun as a wrapper around virCommand

Cole Robinson crobinso at redhat.com
Tue May 10 20:07:52 UTC 2011


Signed-off-by: Cole Robinson <crobinso at redhat.com>
---
 src/util/util.c |   68 ++++++------------------------------------------------
 1 files changed, 8 insertions(+), 60 deletions(-)

diff --git a/src/util/util.c b/src/util/util.c
index 2f2fbc8..f83b2d0 100644
--- a/src/util/util.c
+++ b/src/util/util.c
@@ -769,69 +769,17 @@ virExecWithHook(const char *const*argv,
 int
 virRun(const char *const*argv, int *status)
 {
-    pid_t childpid;
-    int exitstatus, execret, waitret;
-    int ret = -1;
-    int errfd = -1, outfd = -1;
-    char *outbuf = NULL;
-    char *errbuf = NULL;
-
-    if ((execret = virExecWithHook(argv, NULL, NULL,
-                             &childpid, -1, &outfd, &errfd,
-                             VIR_EXEC_NONE, NULL, NULL, NULL)) < 0) {
-        ret = execret;
-        goto error;
-    }
-
-    if (virPipeReadUntilEOF(outfd, errfd, &outbuf, &errbuf) < 0) {
-        while (waitpid(childpid, &exitstatus, 0) == -1 && errno == EINTR)
-            ;
-        goto error;
-    }
-
-    if (outbuf)
-        VIR_DEBUG("Command stdout: %s", outbuf);
-    if (errbuf)
-        VIR_DEBUG("Command stderr: %s", errbuf);
-
-    while ((waitret = waitpid(childpid, &exitstatus, 0) == -1) &&
-            errno == EINTR);
-    if (waitret == -1) {
-        virReportSystemError(errno,
-                             _("cannot wait for '%s'"),
-                             argv[0]);
-        goto error;
-    }
-
-    if (status == NULL) {
-        errno = EINVAL;
-        if (exitstatus) {
-            char *str = virCommandTranslateStatus(exitstatus);
-            char *argv_str = virArgvToString(argv);
-            if (!argv_str) {
-                virReportOOMError();
-                goto error;
-            }
-
-            virUtilError(VIR_ERR_INTERNAL_ERROR,
-                         _("'%s' exited unexpectedly: %s"),
-                         argv_str, NULLSTR(str));
+    virCommandPtr cmd = virCommandNew(argv[0]);
+    const char * const *tmp;
+    int ret;
 
-            VIR_FREE(str);
-            VIR_FREE(argv_str);
-            goto error;
-        }
-    } else {
-        *status = exitstatus;
+    tmp = argv;
+    while (*(++tmp)) {
+        virCommandAddArg(cmd, *tmp);
     }
 
-    ret = 0;
-
-  error:
-    VIR_FREE(outbuf);
-    VIR_FREE(errbuf);
-    VIR_FORCE_CLOSE(outfd);
-    VIR_FORCE_CLOSE(errfd);
+    ret = virCommandRun(cmd, status);
+    virCommandFree(cmd);
     return ret;
 }
 
-- 
1.7.4.4




More information about the libvir-list mailing list