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;
}
#include <sys/utsname.h>
#include <sys/stat.h>
#include <fcntl.h>
-#include <signal.h>
#include <paths.h>
#include <pwd.h>
#include <stdio.h>
#include "bridge.h"
#include "files.h"
#include "logging.h"
+#include "command.h"
#define VIR_FROM_THIS VIR_FROM_OPENVZ
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);
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) {
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);
}
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);
- for ( ; got >= 0 ; got--)
- VIR_FREE(names[got]);
- return -1;
+ virCommandFree(cmd);
+ if (rc >= 0) {
+ for ( ; got >= 0 ; got--)
+ VIR_FREE(names[got]);
+ }
+ return rc;
}
static int openvzGetProcessInfo(unsigned long long *cpuTime, int vpsid)