char *name;
virDomainDefPtr def;
+ pid_t initpid;
+
size_t nveths;
char **veths;
};
goto cleanup;
}
+
+static void virLXCControllerStopInit(virLXCControllerPtr ctrl)
+{
+ if (ctrl->initpid == 0)
+ return;
+
+ virPidAbort(ctrl->initpid);
+ ctrl->initpid = 0;
+}
+
+
static void virLXCControllerFree(virLXCControllerPtr ctrl)
{
size_t i;
if (!ctrl)
return;
+ virLXCControllerStopInit(ctrl);
+
for (i = 0 ; i < ctrl->nveths ; i++)
VIR_FREE(ctrl->veths[i]);
VIR_FREE(ctrl->veths);
static virMutex lock;
static int sigpipe[2];
-static void lxcSignalChildHandler(int signum ATTRIBUTE_UNUSED)
+static void virLXCControllerSignalChildHandler(int signum ATTRIBUTE_UNUSED)
{
ignore_value(write(sigpipe[1], "1", 1));
}
-static void lxcSignalChildIO(int watch ATTRIBUTE_UNUSED,
- int fd ATTRIBUTE_UNUSED,
- int events ATTRIBUTE_UNUSED, void *opaque)
+static void virLXCControllerSignalChildIO(int watch ATTRIBUTE_UNUSED,
+ int fd ATTRIBUTE_UNUSED,
+ int events ATTRIBUTE_UNUSED,
+ void *opaque)
{
char buf[1];
int ret;
- int *container = opaque;
+ virLXCControllerPtr ctrl = opaque;
ignore_value(read(sigpipe[0], buf, 1));
ret = waitpid(-1, NULL, WNOHANG);
- if (ret == *container) {
+ if (ret == ctrl->initpid) {
virMutexLock(&lock);
quit = true;
virMutexUnlock(&lock);
*
* Returns 0 on success or -1 in case of error
*/
-static int lxcControllerMain(int serverFd,
- int clientFd,
- int *hostFds,
- int *contFds,
- size_t nFds,
- pid_t container)
+static int virLXCControllerMain(virLXCControllerPtr ctrl,
+ int serverFd,
+ int clientFd,
+ int *hostFds,
+ int *contFds,
+ size_t nFds)
{
struct lxcConsole *consoles = NULL;
struct lxcMonitor monitor = {
if (virEventAddHandle(sigpipe[0],
VIR_EVENT_HANDLE_READABLE,
- lxcSignalChildIO,
- &container,
+ virLXCControllerSignalChildIO,
+ ctrl,
NULL) < 0) {
lxcError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Unable to watch signal pipe"));
goto cleanup;
}
- if (signal(SIGCHLD, lxcSignalChildHandler) == SIG_ERR) {
+ if (signal(SIGCHLD, virLXCControllerSignalChildHandler) == SIG_ERR) {
virReportSystemError(errno, "%s",
_("Cannot install signal handler"));
goto cleanup;
*
* Returns 0 on success or -1 in case of error
*/
-static int virLXCControllerMoveInterfaces(virLXCControllerPtr ctrl,
- pid_t container)
+static int virLXCControllerMoveInterfaces(virLXCControllerPtr ctrl)
{
size_t i;
for (i = 0 ; i < ctrl->nveths ; i++) {
- if (virNetDevSetNamespace(ctrl->veths[i], container) < 0)
+ if (virNetDevSetNamespace(ctrl->veths[i], ctrl->initpid) < 0)
return -1;
}
int containerhandshake[2] = { -1, -1 };
int *containerTtyFDs = NULL;
char **containerTtyPaths = NULL;
- pid_t container = -1;
virDomainFSDefPtr root;
char *devpts = NULL;
char *devptmx = NULL;
if (lxcSetPersonality(ctrl->def) < 0)
goto cleanup;
- if ((container = lxcContainerStart(ctrl->def,
- securityDriver,
- ctrl->nveths,
- ctrl->veths,
- control[1],
- containerhandshake[1],
- containerTtyPaths,
- nttyFDs)) < 0)
+ if ((ctrl->initpid = lxcContainerStart(ctrl->def,
+ securityDriver,
+ ctrl->nveths,
+ ctrl->veths,
+ control[1],
+ containerhandshake[1],
+ containerTtyPaths,
+ nttyFDs)) < 0)
goto cleanup;
VIR_FORCE_CLOSE(control[1]);
VIR_FORCE_CLOSE(containerhandshake[1]);
- if (virLXCControllerMoveInterfaces(ctrl, container) < 0)
+ if (virLXCControllerMoveInterfaces(ctrl) < 0)
goto cleanup;
if (lxcContainerSendContinue(control[0]) < 0) {
}
}
- rc = lxcControllerMain(monitor, client, ttyFDs, containerTtyFDs, nttyFDs, container);
+ rc = virLXCControllerMain(ctrl, monitor, client, ttyFDs, containerTtyFDs, nttyFDs);
monitor = client = -1;
cleanup:
VIR_FORCE_CLOSE(loopDevs[i]);
VIR_FREE(loopDevs);
- virPidAbort(container);
+ virLXCControllerStopInit(ctrl);
return rc;
}