From d624ad6a3d2db9b79a5c0a4e56e1ef19a80aeada Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 3 Jul 2012 11:54:09 +0100 Subject: [PATCH] Introduce a virLXCControllerPtr object to hold LXC controller state 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 --- src/lxc/lxc_controller.c | 131 ++++++++++++++++++++++++++------------- 1 file changed, 89 insertions(+), 42 deletions(-) diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c index b0e9f46a31..d94b045e37 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 error; + + if ((configFile = virDomainConfigFile(LXC_STATE_DIR, + ctrl->name)) == NULL) + goto error; + + if ((ctrl->def = virDomainDefParseFile(caps, + configFile, + 1 << VIR_DOMAIN_VIRT_LXC, + 0)) == NULL) + goto error; + +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, @@ -1629,9 +1687,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 +1701,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 +1822,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 +1882,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; }