const char **largv = NULL;
pid_t child;
int status;
+ fd_set keepfd;
+ char appPtyStr[30];
+
+ FD_ZERO(&keepfd);
#define ADD_ARG_SPACE \
do { \
goto no_memory; \
} while (0)
+ snprintf(appPtyStr, sizeof(appPtyStr), "%d", appPty);
+
ADD_ARG_LIT(vm->def->emulator);
ADD_ARG_LIT("--name");
ADD_ARG_LIT(vm->def->name);
ADD_ARG_LIT("--console");
- ADD_ARG_LIT("0"); /* Passing console master PTY as FD 0 */
+ ADD_ARG_LIT(appPtyStr);
ADD_ARG_LIT("--background");
for (i = 0 ; i < nveths ; i++) {
ADD_ARG(NULL);
- vm->stdin_fd = appPty; /* Passing console master PTY as FD 0 */
+ vm->stdin_fd = -1;
vm->stdout_fd = vm->stderr_fd = logfd;
- if (virExec(conn, largv, NULL, &child,
+ FD_SET(appPty, &keepfd);
+
+ if (virExec(conn, largv, NULL, &keepfd, &child,
vm->stdin_fd, &vm->stdout_fd, &vm->stderr_fd,
VIR_EXEC_NONE) < 0)
goto cleanup;
int *tapfds = NULL;
int ntapfds = 0;
int qemuCmdFlags;
+ fd_set keepfd;
+
+ FD_ZERO(&keepfd);
if (virDomainIsActive(vm)) {
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
vm->stdout_fd = -1;
vm->stderr_fd = -1;
- ret = virExec(conn, argv, NULL, &vm->pid,
+ for (i = 0 ; i < ntapfds ; i++)
+ FD_SET(tapfds[i], &keepfd);
+
+ ret = virExec(conn, argv, NULL, &keepfd, &vm->pid,
vm->stdin_fd, &vm->stdout_fd, &vm->stderr_fd,
VIR_EXEC_NONBLOCK);
if (ret == 0) {
if (qemudBuildDnsmasqArgv(conn, network, &argv) < 0)
return -1;
- ret = virExec(conn, argv, NULL, &network->dnsmasqPid, -1, NULL, NULL, VIR_EXEC_NONBLOCK);
+ ret = virExec(conn, argv, NULL, NULL,
+ &network->dnsmasqPid, -1, NULL, NULL, VIR_EXEC_NONBLOCK);
for (i = 0; argv[i]; i++)
VIR_FREE(argv[i]);
/* Run the program and capture its output */
- if (virExec(conn, prog, NULL, &child, -1, &fd, NULL, VIR_EXEC_NONE) < 0) {
+ if (virExec(conn, prog, NULL, NULL,
+ &child, -1, &fd, NULL, VIR_EXEC_NONE) < 0) {
goto cleanup;
}
v[i] = NULL;
/* Run the program and capture its output */
- if (virExec(conn, prog, NULL, &child, -1, &fd, NULL, VIR_EXEC_NONE) < 0) {
+ if (virExec(conn, prog, NULL, NULL,
+ &child, -1, &fd, NULL, VIR_EXEC_NONE) < 0) {
goto cleanup;
}
virExec(virConnectPtr conn,
const char *const*argv,
const char *const*envp,
+ const fd_set *keepfd,
int *retpid,
int infd, int *outfd, int *errfd,
int flags) {
if (i != infd &&
i != null &&
i != childout &&
- i != childerr)
+ i != childerr &&
+ (!keepfd ||
+ !FD_ISSET(i, keepfd)))
close(i);
if (flags & VIR_EXEC_DAEMON) {
int *status) {
int childpid, exitstatus, ret;
- if ((ret = virExec(conn, argv, NULL, &childpid, -1, NULL, NULL, VIR_EXEC_NONE)) < 0)
+ if ((ret = virExec(conn, argv, NULL, NULL,
+ &childpid, -1, NULL, NULL, VIR_EXEC_NONE)) < 0)
return ret;
while ((ret = waitpid(childpid, &exitstatus, 0) == -1) && errno == EINTR);
#include "util-lib.h"
#include "verify.h"
+#include <sys/select.h>
enum {
VIR_EXEC_NONE = 0,
int virExec(virConnectPtr conn,
const char *const*argv,
const char *const*envp,
+ const fd_set *keepfd,
int *retpid,
int infd,
int *outfd,