Add lxc_conf_free()

Then after lxcapi container->create(), free whatever lxc_conf may be
loaded and reload from the newly created configuration file.

Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
This commit is contained in:
Serge Hallyn 2012-09-05 21:55:38 -05:00 committed by Stéphane Graber
parent 64fca455ae
commit 8eb5694baf
3 changed files with 39 additions and 7 deletions

View File

@ -2556,3 +2556,21 @@ int lxc_clear_hooks(struct lxc_conf *c)
}
return 0;
}
void lxc_conf_free(struct lxc_conf *conf)
{
if (!conf)
return;
if (conf->console.path)
free(conf->console.path);
if (conf->rootfs.mount != LXCROOTFSMOUNT)
free(conf->rootfs.mount);
lxc_clear_config_network(conf);
if (conf->aa_profile)
free(conf->aa_profile);
lxc_clear_config_caps(conf);
lxc_clear_cgroups(conf, "lxc.cgroup");
lxc_clear_hooks(conf);
lxc_clear_mount_entries(conf);
free(conf);
}

View File

@ -245,6 +245,7 @@ int run_lxc_hooks(const char *name, char *hook, struct lxc_conf *conf);
* Initialize the lxc configuration structure
*/
extern struct lxc_conf *lxc_conf_init(void);
extern void lxc_conf_free(struct lxc_conf *conf);
extern int pin_rootfs(const char *rootfs);

View File

@ -215,6 +215,15 @@ static pid_t lxcapi_init_pid(struct lxc_container *c)
return ret;
}
static bool load_config_locked(struct lxc_container *c, char *fname)
{
if (!c->lxc_conf)
c->lxc_conf = lxc_conf_init();
if (c->lxc_conf && !lxc_config_read(fname, c->lxc_conf))
return true;
return false;
}
static bool lxcapi_load_config(struct lxc_container *c, char *alt_file)
{
bool ret = false;
@ -229,10 +238,7 @@ static bool lxcapi_load_config(struct lxc_container *c, char *alt_file)
return false;
if (lxclock(c->slock, 0))
return false;
if (!c->lxc_conf)
c->lxc_conf = lxc_conf_init();
if (c->lxc_conf && !lxc_config_read(fname, c->lxc_conf))
ret = true;
ret = load_config_locked(c, fname);
lxcunlock(c->slock);
return ret;
}
@ -596,11 +602,18 @@ again:
goto out_unlock;
}
if (WEXITSTATUS(status) != 0)
if (WEXITSTATUS(status) != 0) {
ERROR("container creation template for %s exited with %d\n",
c->name, WEXITSTATUS(status));
else
bret = true;
goto out_unlock;
}
// now clear out the lxc_conf we have, reload from the created
// container
if (c->lxc_conf)
lxc_conf_free(c->lxc_conf);
c->lxc_conf = NULL;
bret = load_config_locked(c, c->configfile);
out_unlock:
lxcunlock(c->slock);