[libvirt] [PATCH 2/9] openvz: Convert virExec usage to virCommand

Cole Robinson crobinso at redhat.com
Fri May 13 20:10:30 UTC 2011


v2:
    Use virCommand's autocleanup

Signed-off-by: Cole Robinson <crobinso at redhat.com>
---
 src/openvz/openvz_conf.c   |   37 +++++++++--------------------
 src/openvz/openvz_driver.c |   55 +++++++++++++++++++++++--------------------
 2 files changed, 41 insertions(+), 51 deletions(-)

diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c
index 45bc398..d038119 100644
--- a/src/openvz/openvz_conf.c
+++ b/src/openvz/openvz_conf.c
@@ -74,53 +74,40 @@ strtoI(const char *str)
 
 
 static int
-openvzExtractVersionInfo(const char *cmd, int *retversion)
+openvzExtractVersionInfo(const char *cmdstr, int *retversion)
 {
-    const char *const vzarg[] = { cmd, "--help", NULL };
-    const char *const vzenv[] = { "LC_ALL=C", NULL };
-    pid_t child;
-    int newstdout = -1;
-    int ret = -1, status;
+    int ret = -1;
     unsigned long version;
+    char *help = NULL;
     char *tmp;
+    virCommandPtr cmd = virCommandNewArgList(cmdstr, "--help", NULL);
 
     if (retversion)
         *retversion = 0;
 
-    if (virExec(vzarg, vzenv, NULL,
-                &child, -1, &newstdout, NULL, VIR_EXEC_NONE) < 0)
-        return -1;
+    virCommandAddEnvString(cmd, "LC_ALL=C");
+    virCommandSetOutputBuffer(cmd, &help);
 
-    char *help = NULL;
-    int len = virFileReadLimFD(newstdout, 4096, &help);
-    if (len < 0)
-        goto cleanup2;
+    if (virCommandRun(cmd, NULL) < 0)
+        goto cleanup;
 
     tmp = help;
 
     /* expected format: vzctl version <major>.<minor>.<micro> */
     if ((tmp = STRSKIP(tmp, "vzctl version ")) == NULL)
-        goto cleanup2;
+        goto cleanup;
 
     if (virParseVersionString(tmp, &version) < 0)
-        goto cleanup2;
+        goto cleanup;
 
     if (retversion)
         *retversion = version;
 
     ret = 0;
 
-cleanup2:
+cleanup:
+    virCommandFree(cmd);
     VIR_FREE(help);
-    if (VIR_CLOSE(newstdout) < 0)
-        ret = -1;
-
-rewait:
-    if (waitpid(child, &status, 0) != child) {
-        if (errno == EINTR)
-            goto rewait;
-        ret = -1;
-    }
 
     return ret;
 }
diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
index 3e1952f..7d43272 100644
--- a/src/openvz/openvz_driver.c
+++ b/src/openvz/openvz_driver.c
@@ -41,7 +41,6 @@
 #include <sys/utsname.h>
 #include <sys/stat.h>
 #include <fcntl.h>
-#include <signal.h>
 #include <paths.h>
 #include <pwd.h>
 #include <stdio.h>
@@ -59,6 +58,7 @@
 #include "bridge.h"
 #include "files.h"
 #include "logging.h"
+#include "command.h"
 
 #define VIR_FROM_THIS VIR_FROM_OPENVZ
 
@@ -1363,21 +1363,16 @@ static int openvzListDomains(virConnectPtr conn ATTRIBUTE_UNUSED,
                              int *ids, int nids) {
     int got = 0;
     int veid;
-    pid_t pid;
     int outfd = -1;
+    int rc = -1;
     int ret;
     char buf[32];
     char *endptr;
-    const char *cmd[] = {VZLIST, "-ovpsid", "-H" , NULL};
-
-    ret = virExec(cmd, NULL, NULL,
-                  &pid, -1, &outfd, NULL, VIR_EXEC_NONE);
-    if (ret == -1) {
-        openvzError(VIR_ERR_INTERNAL_ERROR,
-                    _("Could not exec %s"), VZLIST);
-        VIR_FORCE_CLOSE(outfd);
-        return -1;
-    }
+    virCommandPtr cmd = virCommandNewArgList(VZLIST, "-ovpsid", "-H" , NULL);
+
+    virCommandSetOutputFD(cmd, &outfd);
+    if (virCommandRunAsync(cmd, NULL) < 0)
+        goto cleanup;
 
     while (got < nids) {
         ret = openvz_readline(outfd, buf, 32);
@@ -1391,13 +1386,20 @@ static int openvzListDomains(virConnectPtr conn ATTRIBUTE_UNUSED,
         ids[got] = veid;
         got ++;
     }
-    waitpid(pid, NULL, 0);
+
+    if (virCommandWait(cmd, NULL) < 0)
+        goto cleanup;
 
     if (VIR_CLOSE(outfd) < 0) {
         virReportSystemError(errno, "%s", _("failed to close file"));
-        return -1;
+        goto cleanup;
     }
-    return got;
+
+    rc = got;
+cleanup:
+    VIR_FORCE_CLOSE(outfd);
+    virCommandFree(cmd);
+    return rc;
 }
 
 static int openvzNumDomains(virConnectPtr conn) {
@@ -1415,20 +1417,17 @@ static int openvzListDefinedDomains(virConnectPtr conn ATTRIBUTE_UNUSED,
                                     char **const names, int nnames) {
     int got = 0;
     int veid, outfd = -1, ret;
-    pid_t pid;
+    int rc = -1;
     char vpsname[32];
     char buf[32];
     char *endptr;
-    const char *cmd[] = {VZLIST, "-ovpsid", "-H", "-S", NULL};
+    virCommandPtr cmd = virCommandNewArgList(VZLIST,
+                                             "-ovpsid", "-H", "-S", NULL);
 
     /* the -S options lists only stopped domains */
-    ret = virExec(cmd, NULL, NULL,
-                  &pid, -1, &outfd, NULL, VIR_EXEC_NONE);
-    if (ret == -1) {
-        openvzError(VIR_ERR_INTERNAL_ERROR,
-                    _("Could not exec %s"), VZLIST);
+    virCommandSetOutputFD(cmd, &outfd);
+    if (virCommandRunAsync(cmd, NULL) < 0)
         goto out;
-    }
 
     while (got < nnames) {
         ret = openvz_readline(outfd, buf, 32);
@@ -1446,18 +1445,22 @@ static int openvzListDefinedDomains(virConnectPtr conn ATTRIBUTE_UNUSED,
         }
         got ++;
     }
-    waitpid(pid, NULL, 0);
+
+    if (virCommandWait(cmd, NULL) < 0)
+        goto out;
+
     if (VIR_CLOSE(outfd) < 0) {
         virReportSystemError(errno, "%s", _("failed to close file"));
         goto out;
     }
-    return got;
 
+    rc = got;
 out:
     VIR_FORCE_CLOSE(outfd);
+    virCommandFree(cmd);
     for ( ; got >= 0 ; got--)
         VIR_FREE(names[got]);
-    return -1;
+    return rc;
 }
 
 static int openvzGetProcessInfo(unsigned long long *cpuTime, int vpsid)
-- 
1.7.4.4




More information about the libvir-list mailing list