Normal lxc-start usage tends to be "lxc-start -n name [-P lxcpath]". This causes $lxcpath/$name/config to be the configuration for the container. However, lxc-start is more flexible than that. You can specify a custom configuration file, in which case $lxcpath/$name/config is not used. You can also (in addition or in place of either of these) specify configuration entries one-by-one using "-s lxc.utsname=xxx".
To support this using the API, if we are not using $lxcpath/$name/config then we put ourselves into a custom lxcpath called (configurable using LXCPATH) /var/lib/lxc_anon. To stop a container so created, then, you would use lxc-stop -P /var/lib/lxc_anon -n name TODO: we should walk over the list of &defines by hand and set them using c->set_config_item. I haven't done that in this patch. Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com> --- src/lxc/lxc_start.c | 74 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 43 insertions(+), 31 deletions(-) diff --git a/src/lxc/lxc_start.c b/src/lxc/lxc_start.c index 3a12410..125284c 100644 --- a/src/lxc/lxc_start.c +++ b/src/lxc/lxc_start.c @@ -43,6 +43,7 @@ #include "log.h" #include "caps.h" #include "lxc.h" +#include "lxccontainer.h" #include "conf.h" #include "cgroup.h" #include "utils.h" @@ -151,6 +152,8 @@ int main(int argc, char *argv[]) '\0', }; FILE *pid_fp = NULL; + struct lxc_container *c; + char *anonpath; lxc_list_init(&defines); @@ -169,13 +172,32 @@ int main(int argc, char *argv[]) my_args.progname, my_args.quiet, my_args.lxcpath[0])) return err; + anonpath = alloca(strlen(LXCPATH) + 6); + sprintf(anonpath, "%s_anon", LXCPATH); + /* + * rcfile possibilities: + * 1. rcfile from random path specified in cli option + * 2. rcfile not specified, use $lxcpath/$lxcname/config + * 3. rcfile not specified and does not exist. + */ /* rcfile is specified in the cli option */ - if (my_args.rcfile) + if (my_args.rcfile) { rcfile = (char *)my_args.rcfile; - else { + c = lxc_container_new(my_args.name, anonpath); + if (!c) { + ERROR("Failed to create lxc_container"); + return err; + } + if (!c->load_config(c, rcfile)) { + ERROR("Failed to load rcfile"); + lxc_container_put(c); + return err; + } + } else { int rc; + const char *lxcpath = my_args.lxcpath[0]; - rc = asprintf(&rcfile, "%s/%s/config", my_args.lxcpath[0], my_args.name); + rc = asprintf(&rcfile, "%s/%s/config", lxcpath, my_args.name); if (rc == -1) { SYSERROR("failed to allocate memory"); return err; @@ -186,25 +208,28 @@ int main(int argc, char *argv[]) if (access(rcfile, F_OK)) { free(rcfile); rcfile = NULL; + lxcpath = anonpath; + } + c = lxc_container_new(my_args.name, lxcpath); + if (!c) { + ERROR("Failed to create lxc_container"); + return err; } } - conf = lxc_conf_init(); - if (!conf) { - ERROR("failed to initialize configuration"); - return err; - } - - if (rcfile && lxc_config_read(rcfile, conf)) { - ERROR("failed to read configuration file"); - goto out; - } + /* + * We should use set_config_item() over &defines, which would handle + * unset c->lxc_conf for us and let us not use lxc_config_define_load() + */ + if (!c->lxc_conf) + c->lxc_conf = lxc_conf_init(); + conf = c->lxc_conf; if (lxc_config_define_load(&defines, conf)) goto out; if (!rcfile && !strcmp("/sbin/init", args[0])) { - ERROR("no configuration file for '/sbin/init' (may crash the host)"); + ERROR("Executing '/sbin/init' with no configuration file may crash the host"); goto out; } @@ -228,10 +253,7 @@ int main(int argc, char *argv[]) } if (my_args.daemonize) { - if (daemon(0, 0)) { - SYSERROR("failed to daemonize '%s'", my_args.name); - goto out; - } + c->want_daemonize(c); } if (pid_fp != NULL) { @@ -245,23 +267,13 @@ int main(int argc, char *argv[]) if (my_args.close_all_fds) conf->close_all_fds = 1; - err = lxc_start(my_args.name, args, conf, my_args.lxcpath[0]); - - /* - * exec ourself, that requires to have all opened fd - * with the close-on-exec flag set - */ - if (conf->reboot) { - INFO("rebooting container"); - execvp(argv[0], argv); - SYSERROR("failed to exec"); - err = -1; - } + err = c->start(c, 0, args) ? 0 : -1; if (my_args.pidfile) unlink(my_args.pidfile); + out: - lxc_conf_free(conf); + lxc_container_put(c); return err; } -- 1.8.3.2 ------------------------------------------------------------------------------ Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today! http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel