v2:
Use virCommand's autocleanup
Signed-off-by: Cole Robinson <crobinso(a)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