}
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);
+}
* 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);
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;
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;
}
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);