mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
Fix QEMU domain creation by allowing virExec to preserve certain FDs
This commit is contained in:
parent
2875ed81bd
commit
da1963381b
@ -621,6 +621,10 @@ static int lxcControllerStart(virConnectPtr conn,
|
|||||||
const char **largv = NULL;
|
const char **largv = NULL;
|
||||||
pid_t child;
|
pid_t child;
|
||||||
int status;
|
int status;
|
||||||
|
fd_set keepfd;
|
||||||
|
char appPtyStr[30];
|
||||||
|
|
||||||
|
FD_ZERO(&keepfd);
|
||||||
|
|
||||||
#define ADD_ARG_SPACE \
|
#define ADD_ARG_SPACE \
|
||||||
do { \
|
do { \
|
||||||
@ -644,11 +648,13 @@ static int lxcControllerStart(virConnectPtr conn,
|
|||||||
goto no_memory; \
|
goto no_memory; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
snprintf(appPtyStr, sizeof(appPtyStr), "%d", appPty);
|
||||||
|
|
||||||
ADD_ARG_LIT(vm->def->emulator);
|
ADD_ARG_LIT(vm->def->emulator);
|
||||||
ADD_ARG_LIT("--name");
|
ADD_ARG_LIT("--name");
|
||||||
ADD_ARG_LIT(vm->def->name);
|
ADD_ARG_LIT(vm->def->name);
|
||||||
ADD_ARG_LIT("--console");
|
ADD_ARG_LIT("--console");
|
||||||
ADD_ARG_LIT("0"); /* Passing console master PTY as FD 0 */
|
ADD_ARG_LIT(appPtyStr);
|
||||||
ADD_ARG_LIT("--background");
|
ADD_ARG_LIT("--background");
|
||||||
|
|
||||||
for (i = 0 ; i < nveths ; i++) {
|
for (i = 0 ; i < nveths ; i++) {
|
||||||
@ -658,10 +664,12 @@ static int lxcControllerStart(virConnectPtr conn,
|
|||||||
|
|
||||||
ADD_ARG(NULL);
|
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;
|
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,
|
vm->stdin_fd, &vm->stdout_fd, &vm->stderr_fd,
|
||||||
VIR_EXEC_NONE) < 0)
|
VIR_EXEC_NONE) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
@ -847,6 +847,9 @@ static int qemudStartVMDaemon(virConnectPtr conn,
|
|||||||
int *tapfds = NULL;
|
int *tapfds = NULL;
|
||||||
int ntapfds = 0;
|
int ntapfds = 0;
|
||||||
int qemuCmdFlags;
|
int qemuCmdFlags;
|
||||||
|
fd_set keepfd;
|
||||||
|
|
||||||
|
FD_ZERO(&keepfd);
|
||||||
|
|
||||||
if (virDomainIsActive(vm)) {
|
if (virDomainIsActive(vm)) {
|
||||||
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||||
@ -950,7 +953,10 @@ static int qemudStartVMDaemon(virConnectPtr conn,
|
|||||||
vm->stdout_fd = -1;
|
vm->stdout_fd = -1;
|
||||||
vm->stderr_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,
|
vm->stdin_fd, &vm->stdout_fd, &vm->stderr_fd,
|
||||||
VIR_EXEC_NONBLOCK);
|
VIR_EXEC_NONBLOCK);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
@ -1219,7 +1225,8 @@ dhcpStartDhcpDaemon(virConnectPtr conn,
|
|||||||
if (qemudBuildDnsmasqArgv(conn, network, &argv) < 0)
|
if (qemudBuildDnsmasqArgv(conn, network, &argv) < 0)
|
||||||
return -1;
|
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++)
|
for (i = 0; argv[i]; i++)
|
||||||
VIR_FREE(argv[i]);
|
VIR_FREE(argv[i]);
|
||||||
|
@ -403,7 +403,8 @@ virStorageBackendRunProgRegex(virConnectPtr conn,
|
|||||||
|
|
||||||
|
|
||||||
/* Run the program and capture its output */
|
/* 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;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -537,7 +538,8 @@ virStorageBackendRunProgNul(virConnectPtr conn,
|
|||||||
v[i] = NULL;
|
v[i] = NULL;
|
||||||
|
|
||||||
/* Run the program and capture its output */
|
/* 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;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,6 +132,7 @@ int
|
|||||||
virExec(virConnectPtr conn,
|
virExec(virConnectPtr conn,
|
||||||
const char *const*argv,
|
const char *const*argv,
|
||||||
const char *const*envp,
|
const char *const*envp,
|
||||||
|
const fd_set *keepfd,
|
||||||
int *retpid,
|
int *retpid,
|
||||||
int infd, int *outfd, int *errfd,
|
int infd, int *outfd, int *errfd,
|
||||||
int flags) {
|
int flags) {
|
||||||
@ -293,7 +294,9 @@ virExec(virConnectPtr conn,
|
|||||||
if (i != infd &&
|
if (i != infd &&
|
||||||
i != null &&
|
i != null &&
|
||||||
i != childout &&
|
i != childout &&
|
||||||
i != childerr)
|
i != childerr &&
|
||||||
|
(!keepfd ||
|
||||||
|
!FD_ISSET(i, keepfd)))
|
||||||
close(i);
|
close(i);
|
||||||
|
|
||||||
if (flags & VIR_EXEC_DAEMON) {
|
if (flags & VIR_EXEC_DAEMON) {
|
||||||
@ -403,7 +406,8 @@ virRun(virConnectPtr conn,
|
|||||||
int *status) {
|
int *status) {
|
||||||
int childpid, exitstatus, ret;
|
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;
|
return ret;
|
||||||
|
|
||||||
while ((ret = waitpid(childpid, &exitstatus, 0) == -1) && errno == EINTR);
|
while ((ret = waitpid(childpid, &exitstatus, 0) == -1) && errno == EINTR);
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
#include "util-lib.h"
|
#include "util-lib.h"
|
||||||
#include "verify.h"
|
#include "verify.h"
|
||||||
|
#include <sys/select.h>
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
VIR_EXEC_NONE = 0,
|
VIR_EXEC_NONE = 0,
|
||||||
@ -36,6 +37,7 @@ enum {
|
|||||||
int virExec(virConnectPtr conn,
|
int virExec(virConnectPtr conn,
|
||||||
const char *const*argv,
|
const char *const*argv,
|
||||||
const char *const*envp,
|
const char *const*envp,
|
||||||
|
const fd_set *keepfd,
|
||||||
int *retpid,
|
int *retpid,
|
||||||
int infd,
|
int infd,
|
||||||
int *outfd,
|
int *outfd,
|
||||||
|
Loading…
Reference in New Issue
Block a user