On Tue, Jul 03, 2012 at 16:58:44 +0100, Daniel P. Berrange wrote: > From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> > > Move the veth device name state into the virLXCControllerPtr > object and stop passing it around. Also use size_t instead > of unsigned int for the array length parameters. > > Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx> > --- > src/lxc/lxc_container.c | 10 +++--- > src/lxc/lxc_container.h | 2 +- > src/lxc/lxc_controller.c | 79 ++++++++++++++++++++++++++++++---------------- > 3 files changed, 57 insertions(+), 34 deletions(-) > > diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c > index 910e82b..4f8703c 100644 > --- a/src/lxc/lxc_container.c > +++ b/src/lxc/lxc_container.c > @@ -93,7 +93,7 @@ typedef struct __lxc_child_argv lxc_child_argv_t; > struct __lxc_child_argv { > virDomainDefPtr config; > virSecurityManagerPtr securityDriver; > - unsigned int nveths; > + size_t nveths; > char **veths; > int monitor; > char **ttyPaths; > @@ -262,15 +262,15 @@ int lxcContainerWaitForContinue(int control) > * Returns 0 on success or nonzero in case of error > */ > static int lxcContainerRenameAndEnableInterfaces(bool privNet, > - unsigned int nveths, > + size_t nveths, > char **veths) > { > int rc = 0; > - unsigned int i; > + size_t i; > char *newname = NULL; > > for (i = 0 ; i < nveths ; i++) { > - if (virAsprintf(&newname, "eth%d", i) < 0) { > + if (virAsprintf(&newname, "eth%zu", i) < 0) { > virReportOOMError(); > rc = -1; > goto error_out; > @@ -1775,7 +1775,7 @@ const char *lxcContainerGetAlt32bitArch(const char *arch) > */ > int lxcContainerStart(virDomainDefPtr def, > virSecurityManagerPtr securityDriver, > - unsigned int nveths, > + size_t nveths, > char **veths, > int control, > int handshakefd, > diff --git a/src/lxc/lxc_container.h b/src/lxc/lxc_container.h > index 77fb9b2..6f1cc8b 100644 > --- a/src/lxc/lxc_container.h > +++ b/src/lxc/lxc_container.h > @@ -51,7 +51,7 @@ int lxcContainerWaitForContinue(int control); > > int lxcContainerStart(virDomainDefPtr def, > virSecurityManagerPtr securityDriver, > - unsigned int nveths, > + size_t nveths, > char **veths, > int control, > int handshakefd, > diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c > index 7447f6c..ad11307 100644 > --- a/src/lxc/lxc_controller.c > +++ b/src/lxc/lxc_controller.c > @@ -85,6 +85,9 @@ typedef virLXCController *virLXCControllerPtr; > struct _virLXCController { > char *name; > virDomainDefPtr def; > + > + size_t nveths; > + char **veths; > }; > > static void virLXCControllerFree(virLXCControllerPtr ctrl); > @@ -129,15 +132,35 @@ no_memory: > > static void virLXCControllerFree(virLXCControllerPtr ctrl) > { > + size_t i; > + > if (!ctrl) > return; > > + for (i = 0 ; i < ctrl->nveths ; i++) > + VIR_FREE(ctrl->veths[i]); > + VIR_FREE(ctrl->veths); > + > virDomainDefFree(ctrl->def); > VIR_FREE(ctrl->name); > > VIR_FREE(ctrl); > } > > + > +static int virLXCControllerValidateNICs(virLXCControllerPtr ctrl) > +{ > + if (ctrl->def->nnets != ctrl->nveths) { > + lxcError(VIR_ERR_INTERNAL_ERROR, > + _("expecting %d veths, but got %zu"), > + ctrl->def->nnets, ctrl->nveths); > + return -1; > + } > + > + return 0; > +} > + > + > static int lxcGetLoopFD(char **dev_name) > { > int fd = -1; > @@ -1307,7 +1330,7 @@ cleanup2: > > > /** > - * lxcControllerMoveInterfaces > + * virLXCControllerMoveInterfaces > * @nveths: number of interfaces > * @veths: interface names > * @container: pid of container > @@ -1316,13 +1339,13 @@ cleanup2: > * > * Returns 0 on success or -1 in case of error > */ > -static int lxcControllerMoveInterfaces(unsigned int nveths, > - char **veths, > - pid_t container) > +static int virLXCControllerMoveInterfaces(virLXCControllerPtr ctrl, > + pid_t container) > { > - unsigned int i; > - for (i = 0 ; i < nveths ; i++) > - if (virNetDevSetNamespace(veths[i], container) < 0) > + size_t i; > + > + for (i = 0 ; i < ctrl->nveths ; i++) > + if (virNetDevSetNamespace(ctrl->veths[i], container) < 0) > return -1; Since you are touching this, I think it would be a good idea to add {} around the content of this for loop. > > return 0; > @@ -1330,24 +1353,26 @@ static int lxcControllerMoveInterfaces(unsigned int nveths, > > > /** > - * lxcCleanupInterfaces: > - * @nveths: number of interfaces > - * @veths: interface names > + * virLXCControllerDeleteInterfaces: > + * @ctrl: the LXC controller > * > * Cleans up the container interfaces by deleting the veth device pairs. > * > * Returns 0 on success or -1 in case of error > */ > -static int lxcControllerCleanupInterfaces(unsigned int nveths, > - char **veths) > +static int virLXCControllerDeleteInterfaces(virLXCControllerPtr ctrl) > { > - unsigned int i; > - for (i = 0 ; i < nveths ; i++) > - ignore_value(virNetDevVethDelete(veths[i])); > + size_t i; > + int ret = 0; > > - return 0; > + for (i = 0 ; i < ctrl->nveths ; i++) > + if (virNetDevVethDelete(ctrl->veths[i]) < 0) > + ret = -1; And here as well... > + > + return ret; > } > > + > static int lxcSetPersonality(virDomainDefPtr def) > { > struct utsname utsname; > @@ -1422,8 +1447,6 @@ cleanup: > static int > virLXCControllerRun(virLXCControllerPtr ctrl, > virSecurityManagerPtr securityDriver, > - unsigned int nveths, > - char **veths, > int monitor, > int client, > int *ttyFDs, > @@ -1588,8 +1611,8 @@ virLXCControllerRun(virLXCControllerPtr ctrl, > > if ((container = lxcContainerStart(ctrl->def, > securityDriver, > - nveths, > - veths, > + ctrl->nveths, > + ctrl->veths, > control[1], > containerhandshake[1], > containerTtyPaths, > @@ -1598,7 +1621,7 @@ virLXCControllerRun(virLXCControllerPtr ctrl, > VIR_FORCE_CLOSE(control[1]); > VIR_FORCE_CLOSE(containerhandshake[1]); > > - if (lxcControllerMoveInterfaces(nveths, veths, container) < 0) > + if (virLXCControllerMoveInterfaces(ctrl, container) < 0) > goto cleanup; > > if (lxcContainerSendContinue(control[0]) < 0) { > @@ -1684,7 +1707,7 @@ int main(int argc, char *argv[]) > int rc = 1; > int client; > char *name = NULL; > - int nveths = 0; > + size_t nveths = 0; > char **veths = NULL; > int monitor = -1; > int handshakefd = -1; > @@ -1833,11 +1856,11 @@ int main(int argc, char *argv[]) > NULLSTR(ctrl->def->seclabel.label), > NULLSTR(ctrl->def->seclabel.imagelabel)); > > - if (ctrl->def->nnets != nveths) { > - fprintf(stderr, "%s: expecting %d veths, but got %d\n", > - argv[0], ctrl->def->nnets, nveths); > + ctrl->veths = veths; > + ctrl->nveths = nveths; I was a bit afraid of double free after the two lines above but since we didn't actually free veths array before this patch (which was a little bit wrong), we are safe. > + > + if (virLXCControllerValidateNICs(ctrl) < 0) > goto cleanup; > - } > > if ((sockpath = lxcMonitorPath(ctrl)) == NULL) > goto cleanup; > @@ -1885,12 +1908,12 @@ int main(int argc, char *argv[]) > } > > rc = virLXCControllerRun(ctrl, securityDriver, > - nveths, veths, monitor, client, > + monitor, client, > ttyFDs, nttyFDs, handshakefd); > > cleanup: > virPidFileDelete(LXC_STATE_DIR, name); > - lxcControllerCleanupInterfaces(nveths, veths); > + virLXCControllerDeleteInterfaces(ctrl); > if (sockpath) > unlink(sockpath); > VIR_FREE(sockpath); ACK Jirka -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list