From: Daniel Lezcano Date: Thu, 26 Nov 2009 15:46:24 +0000 (+0100) Subject: pass lxc_conf to the lxc_start function instead of the rcfile X-Git-Tag: lxc-0.6.5~56 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fae349da89b9ad063f0080970558b7f02ce233c2;p=thirdparty%2Flxc.git pass lxc_conf to the lxc_start function instead of the rcfile The rcfile is parsed in the lxc_start function. This is not the place to do that. Let's the caller to do that. In the meantime, we have the lxc_conf structure filled right before calling the lxc_start function so we can do some sanity check on the configuration to not break the system when we launch the container. Signed-off-by: Daniel Lezcano --- diff --git a/src/lxc/commands.c b/src/lxc/commands.c index 02239e541..4c48571a2 100644 --- a/src/lxc/commands.c +++ b/src/lxc/commands.c @@ -135,7 +135,7 @@ static int trigger_command(int fd, struct lxc_request *request, static void command_fd_cleanup(int fd, struct lxc_handler *handler, struct lxc_epoll_descr *descr) { - lxc_console_remove_fd(fd, &handler->conf.tty_info); + lxc_console_remove_fd(fd, &handler->conf->tty_info); lxc_mainloop_del_handler(descr, fd); close(fd); } diff --git a/src/lxc/console.c b/src/lxc/console.c index 52f6cecf1..96a6edd85 100644 --- a/src/lxc/console.c +++ b/src/lxc/console.c @@ -98,7 +98,7 @@ extern int lxc_console_callback(int fd, struct lxc_request *request, struct lxc_handler *handler) { int ttynum = request->data; - struct lxc_tty_info *tty_info = &handler->conf.tty_info; + struct lxc_tty_info *tty_info = &handler->conf->tty_info; if (ttynum > 0) { if (ttynum > tty_info->nbtty) diff --git a/src/lxc/lxc.h b/src/lxc/lxc.h index 66cb3b8c2..8cf21c173 100644 --- a/src/lxc/lxc.h +++ b/src/lxc/lxc.h @@ -31,6 +31,7 @@ extern "C" { #include struct lxc_msg; +struct lxc_conf; /** Following code is for liblxc. @@ -44,7 +45,7 @@ struct lxc_msg; * @argv : an array of char * corresponding to the commande line * Returns 0 on sucess, < 0 otherwise */ -extern int lxc_start(const char *name, char *const argv[], const char *rcfile); +extern int lxc_start(const char *name, char *const argv[], struct lxc_conf *); /* * Stop the container previously started with lxc_start, all diff --git a/src/lxc/lxc_execute.c b/src/lxc/lxc_execute.c index 846a96fad..40a4b93c5 100644 --- a/src/lxc/lxc_execute.c +++ b/src/lxc/lxc_execute.c @@ -31,10 +31,11 @@ #include #include -#include -#include -#include +#include "lxc.h" +#include "log.h" +#include "conf.h" +#include "confile.h" #include "arguments.h" #include "config.h" @@ -83,6 +84,7 @@ int main(int argc, char *argv[]) { static char **args; char *rcfile; + struct lxc_conf conf; if (lxc_arguments_parse(&my_args, argc, argv)) return -1; @@ -111,6 +113,16 @@ int main(int argc, char *argv[]) } } - return lxc_start(my_args.name, args, my_args.rcfile); + if (lxc_conf_init(&conf)) { + ERROR("failed to initialze configuration"); + return -1; + } + + if (rcfile && lxc_config_read(rcfile, &conf)) { + ERROR("failed to read configuration file"); + return -1; + } + + return lxc_start(my_args.name, args, &conf); } diff --git a/src/lxc/lxc_start.c b/src/lxc/lxc_start.c index cf87abfb0..b8d03e850 100644 --- a/src/lxc/lxc_start.c +++ b/src/lxc/lxc_start.c @@ -40,12 +40,13 @@ #include #include -#include -#include -#include - -#include "arguments.h" +#include "log.h" +#include "lxc.h" +#include "conf.h" +#include "utils.h" #include "config.h" +#include "confile.h" +#include "arguments.h" lxc_log_define(lxc_start, lxc); @@ -132,6 +133,7 @@ int main(int argc, char *argv[]) }; char *rcfile = NULL; + struct lxc_conf conf; if (lxc_arguments_parse(&my_args, argc, argv)) return err; @@ -161,6 +163,16 @@ int main(int argc, char *argv[]) } } + if (lxc_conf_init(&conf)) { + ERROR("failed to initialze configuration"); + return err; + } + + if (rcfile && lxc_config_read(rcfile, &conf)) { + ERROR("failed to read configuration file"); + return err; + } + if (my_args.daemonize) { /* do not chdir as we want to open the log file, @@ -187,7 +199,7 @@ int main(int argc, char *argv[]) save_tty(&tios); - err = lxc_start(my_args.name, args, rcfile); + err = lxc_start(my_args.name, args, &conf); restore_tty(&tios); diff --git a/src/lxc/start.c b/src/lxc/start.c index 714342168..7e9d92414 100644 --- a/src/lxc/start.c +++ b/src/lxc/start.c @@ -230,7 +230,7 @@ static int console_init(char *console, size_t size) return 0; } -struct lxc_handler *lxc_init(const char *name, const char *rcfile) +struct lxc_handler *lxc_init(const char *name, struct lxc_conf *conf) { struct lxc_handler *handler; @@ -240,36 +240,20 @@ struct lxc_handler *lxc_init(const char *name, const char *rcfile) memset(handler, 0, sizeof(*handler)); + handler->conf = conf; + /* Begin the set the state to STARTING*/ if (lxc_set_state(name, handler, STARTING)) { ERROR("failed to set state '%s'", lxc_state2str(STARTING)); goto out_free; } - if (lxc_conf_init(&handler->conf)) { - ERROR("failed to initialize the configuration"); - goto out_aborting; - } - - if (rcfile) { - if (access(rcfile, F_OK)) { - ERROR("failed to access '%s'", rcfile); - goto out_aborting; - } - - if (lxc_config_read(rcfile, &handler->conf)) { - ERROR("failed to read '%s'", rcfile); - goto out_aborting; - } - } - - if (console_init(handler->conf.console, - sizeof(handler->conf.console))) { + if (console_init(conf->console, sizeof(conf->console))) { ERROR("failed to initialize the console"); goto out_aborting; } - if (lxc_create_tty(name, &handler->conf)) { + if (lxc_create_tty(name, conf)) { ERROR("failed to create the ttys"); goto out_aborting; } @@ -294,7 +278,7 @@ out: return handler; out_delete_tty: - lxc_delete_tty(&handler->conf.tty_info); + lxc_delete_tty(&conf->tty_info); out_aborting: lxc_set_state(name, handler, ABORTING); out_free: @@ -313,7 +297,7 @@ void lxc_fini(const char *name, struct lxc_handler *handler) lxc_unlink_nsgroup(name); if (handler) { - lxc_delete_tty(&handler->conf.tty_info); + lxc_delete_tty(&handler->conf->tty_info); free(handler); } @@ -366,7 +350,7 @@ static int do_start(void *arg) } /* Setup the container, ip, names, utsname, ... */ - if (lxc_setup(name, &handler->conf)) { + if (lxc_setup(name, handler->conf)) { ERROR("failed to setup the container"); goto out_warn_father; } @@ -414,14 +398,14 @@ int lxc_spawn(const char *name, struct lxc_handler *handler, char *const argv[]) } clone_flags = CLONE_NEWUTS|CLONE_NEWPID|CLONE_NEWIPC|CLONE_NEWNS; - if (!lxc_list_empty(&handler->conf.network)) { + if (!lxc_list_empty(&handler->conf->network)) { clone_flags |= CLONE_NEWNET; /* that should be done before the clone because we will * fill the netdev index and use them in the child */ - if (lxc_create_network(&handler->conf.network)) { + if (lxc_create_network(&handler->conf->network)) { ERROR("failed to create the network"); goto out_close; } @@ -447,7 +431,7 @@ int lxc_spawn(const char *name, struct lxc_handler *handler, char *const argv[]) /* Create the network configuration */ if (clone_flags & CLONE_NEWNET) { - if (lxc_assign_network(&handler->conf.network, handler->pid)) { + if (lxc_assign_network(&handler->conf->network, handler->pid)) { ERROR("failed to create the configured network"); goto out_abort; } @@ -486,13 +470,13 @@ out_abort: goto out_close; } -int lxc_start(const char *name, char *const argv[], const char *rcfile) +int lxc_start(const char *name, char *const argv[], struct lxc_conf *conf) { struct lxc_handler *handler; int err = -1; int status; - handler = lxc_init(name, rcfile); + handler = lxc_init(name, conf); if (!handler) { ERROR("failed to initialize the container"); return -1; diff --git a/src/lxc/start.h b/src/lxc/start.h index 339041136..ba555621d 100644 --- a/src/lxc/start.h +++ b/src/lxc/start.h @@ -34,10 +34,10 @@ struct lxc_handler { int sigfd; char nsgroup[MAXPATHLEN]; sigset_t oldmask; - struct lxc_conf conf; + struct lxc_conf *conf; }; -extern struct lxc_handler *lxc_init(const char *name, const char *rcfile); +extern struct lxc_handler *lxc_init(const char *name, struct lxc_conf *); extern int lxc_spawn(const char *name, struct lxc_handler *handler, char *const argv[]);