From: "Daniel P. Berrange" <berrange(a)redhat.com>
The LXC controller code is having to pass around an ever increasing
number of parameters between methods. To make the code more managable
introduce a virLXCControllerPtr to hold all this state, starting with
the container name and virDomainDefPtr object
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
src/lxc/lxc_controller.c | 133 +++++++++++++++++++++++++++++++---------------
1 file changed, 91 insertions(+), 42 deletions(-)
diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
index b0e9f46..7447f6c 100644
--- a/src/lxc/lxc_controller.c
+++ b/src/lxc/lxc_controller.c
@@ -80,6 +80,64 @@ struct cgroup_device_policy {
};
+typedef struct _virLXCController virLXCController;
+typedef virLXCController *virLXCControllerPtr;
+struct _virLXCController {
+ char *name;
+ virDomainDefPtr def;
+};
+
+static void virLXCControllerFree(virLXCControllerPtr ctrl);
+
+static virLXCControllerPtr virLXCControllerNew(const char *name)
+{
+ virLXCControllerPtr ctrl = NULL;
+ virCapsPtr caps = NULL;
+ char *configFile = NULL;
+
+ if (VIR_ALLOC(ctrl) < 0)
+ goto no_memory;
+
+ if (!(ctrl->name = strdup(name)))
+ goto no_memory;
+
+ if ((caps = lxcCapsInit(NULL)) == NULL)
+ goto cleanup;
+
+ if ((configFile = virDomainConfigFile(LXC_STATE_DIR,
+ ctrl->name)) == NULL)
+ goto cleanup;
+
+ if ((ctrl->def = virDomainDefParseFile(caps,
+ configFile,
+ 1 << VIR_DOMAIN_VIRT_LXC,
+ 0)) == NULL)
+ goto cleanup;
+
+cleanup:
+ VIR_FREE(configFile);
+ virCapabilitiesFree(caps);
+ return ctrl;
+
+no_memory:
+ virReportOOMError();
+//error:
+ virLXCControllerFree(ctrl);
+ ctrl = NULL;
+ goto cleanup;
+}
+
+static void virLXCControllerFree(virLXCControllerPtr ctrl)
+{
+ if (!ctrl)
+ return;
+
+ virDomainDefFree(ctrl->def);
+ VIR_FREE(ctrl->name);
+
+ VIR_FREE(ctrl);
+}
+
static int lxcGetLoopFD(char **dev_name)
{
int fd = -1;
@@ -625,12 +683,12 @@ cleanup:
return rc;
}
-static char*lxcMonitorPath(virDomainDefPtr def)
+static char*lxcMonitorPath(virLXCControllerPtr ctrl)
{
char *sockpath;
if (virAsprintf(&sockpath, "%s/%s.sock",
- LXC_STATE_DIR, def->name) < 0)
+ LXC_STATE_DIR, ctrl->def->name) < 0)
virReportOOMError();
return sockpath;
}
@@ -1362,15 +1420,15 @@ cleanup:
}
static int
-lxcControllerRun(virDomainDefPtr def,
- virSecurityManagerPtr securityDriver,
- unsigned int nveths,
- char **veths,
- int monitor,
- int client,
- int *ttyFDs,
- size_t nttyFDs,
- int handshakefd)
+virLXCControllerRun(virLXCControllerPtr ctrl,
+ virSecurityManagerPtr securityDriver,
+ unsigned int nveths,
+ char **veths,
+ int monitor,
+ int client,
+ int *ttyFDs,
+ size_t nttyFDs,
+ int handshakefd)
{
int rc = -1;
int control[2] = { -1, -1};
@@ -1407,12 +1465,12 @@ lxcControllerRun(virDomainDefPtr def,
goto cleanup;
}
- if (lxcSetupLoopDevices(def, &nloopDevs, &loopDevs) < 0)
+ if (lxcSetupLoopDevices(ctrl->def, &nloopDevs, &loopDevs) < 0)
goto cleanup;
- root = virDomainGetRootFilesystem(def);
+ root = virDomainGetRootFilesystem(ctrl->def);
- if (lxcSetContainerResources(def) < 0)
+ if (lxcSetContainerResources(ctrl->def) < 0)
goto cleanup;
/*
@@ -1436,7 +1494,7 @@ lxcControllerRun(virDomainDefPtr def,
* marked as shared
*/
if (root) {
- mount_options = virSecurityManagerGetMountOptions(securityDriver, def);
+ mount_options = virSecurityManagerGetMountOptions(securityDriver, ctrl->def);
char *opts;
VIR_DEBUG("Setting up private /dev/pts");
@@ -1525,10 +1583,10 @@ lxcControllerRun(virDomainDefPtr def,
}
}
- if (lxcSetPersonality(def) < 0)
+ if (lxcSetPersonality(ctrl->def) < 0)
goto cleanup;
- if ((container = lxcContainerStart(def,
+ if ((container = lxcContainerStart(ctrl->def,
securityDriver,
nveths,
veths,
@@ -1618,6 +1676,8 @@ cleanup:
}
+
+
int main(int argc, char *argv[])
{
pid_t pid;
@@ -1629,9 +1689,6 @@ int main(int argc, char *argv[])
int monitor = -1;
int handshakefd = -1;
int bg = 0;
- virCapsPtr caps = NULL;
- virDomainDefPtr def = NULL;
- char *configFile = NULL;
char *sockpath = NULL;
const struct option options[] = {
{ "background", 0, NULL, 'b' },
@@ -1646,6 +1703,7 @@ int main(int argc, char *argv[])
int *ttyFDs = NULL;
size_t nttyFDs = 0;
virSecurityManagerPtr securityDriver = NULL;
+ virLXCControllerPtr ctrl = NULL;
if (setlocale(LC_ALL, "") == NULL ||
bindtextdomain(PACKAGE, LOCALEDIR) == NULL ||
@@ -1766,31 +1824,22 @@ int main(int argc, char *argv[])
virEventRegisterDefaultImpl();
- if ((caps = lxcCapsInit(NULL)) == NULL)
- goto cleanup;
-
- if ((configFile = virDomainConfigFile(LXC_STATE_DIR,
- name)) == NULL)
- goto cleanup;
-
- if ((def = virDomainDefParseFile(caps, configFile,
- 1 << VIR_DOMAIN_VIRT_LXC,
- 0)) == NULL)
+ if (!(ctrl = virLXCControllerNew(name)))
goto cleanup;
VIR_DEBUG("Security model %s type %s label %s imagelabel %s",
- NULLSTR(def->seclabel.model),
- virDomainSeclabelTypeToString(def->seclabel.type),
- NULLSTR(def->seclabel.label),
- NULLSTR(def->seclabel.imagelabel));
+ NULLSTR(ctrl->def->seclabel.model),
+ virDomainSeclabelTypeToString(ctrl->def->seclabel.type),
+ NULLSTR(ctrl->def->seclabel.label),
+ NULLSTR(ctrl->def->seclabel.imagelabel));
- if (def->nnets != nveths) {
+ if (ctrl->def->nnets != nveths) {
fprintf(stderr, "%s: expecting %d veths, but got %d\n",
- argv[0], def->nnets, nveths);
+ argv[0], ctrl->def->nnets, nveths);
goto cleanup;
}
- if ((sockpath = lxcMonitorPath(def)) == NULL)
+ if ((sockpath = lxcMonitorPath(ctrl)) == NULL)
goto cleanup;
if ((monitor = lxcMonitorServer(sockpath)) < 0)
@@ -1835,17 +1884,17 @@ int main(int argc, char *argv[])
goto cleanup;
}
- rc = lxcControllerRun(def, securityDriver,
- nveths, veths, monitor, client,
- ttyFDs, nttyFDs, handshakefd);
+ rc = virLXCControllerRun(ctrl, securityDriver,
+ nveths, veths, monitor, client,
+ ttyFDs, nttyFDs, handshakefd);
cleanup:
- if (def)
- virPidFileDelete(LXC_STATE_DIR, def->name);
+ virPidFileDelete(LXC_STATE_DIR, name);
lxcControllerCleanupInterfaces(nveths, veths);
if (sockpath)
unlink(sockpath);
VIR_FREE(sockpath);
+ virLXCControllerFree(ctrl);
return rc ? EXIT_FAILURE : EXIT_SUCCESS;
}
--
1.7.10.4