diff options
author | Daniel Lezcano <daniel.lezcano@free.fr> | 2009-11-26 16:46:24 +0100 |
---|---|---|
committer | Diego Elio 'Flameeyes' Pettenò <flameeyes@gmail.com> | 2009-12-11 17:49:11 +0100 |
commit | 6a11fa4e4b451a4f7fca8bc8022f3f147bbac734 (patch) | |
tree | 8f73bde906b2c599201590a144812576a3dd31c4 | |
parent | allow lxc.network.pair to specify host-side name for veth interface (diff) | |
download | lxc-6a11fa4e4b451a4f7fca8bc8022f3f147bbac734.tar.gz lxc-6a11fa4e4b451a4f7fca8bc8022f3f147bbac734.tar.bz2 lxc-6a11fa4e4b451a4f7fca8bc8022f3f147bbac734.zip |
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 <dlezcano@fr.ibm.com>
-rw-r--r-- | src/lxc/commands.c | 2 | ||||
-rw-r--r-- | src/lxc/console.c | 2 | ||||
-rw-r--r-- | src/lxc/lxc.h | 3 | ||||
-rw-r--r-- | src/lxc/lxc_execute.c | 20 | ||||
-rw-r--r-- | src/lxc/lxc_start.c | 24 | ||||
-rw-r--r-- | src/lxc/start.c | 42 | ||||
-rw-r--r-- | src/lxc/start.h | 4 |
7 files changed, 53 insertions, 44 deletions
diff --git a/src/lxc/commands.c b/src/lxc/commands.c index 02239e5..4c48571 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 52f6cec..96a6edd 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 66cb3b8..8cf21c1 100644 --- a/src/lxc/lxc.h +++ b/src/lxc/lxc.h @@ -31,6 +31,7 @@ extern "C" { #include <lxc/state.h> 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 846a96f..40a4b93 100644 --- a/src/lxc/lxc_execute.c +++ b/src/lxc/lxc_execute.c @@ -31,10 +31,11 @@ #include <sys/stat.h> #include <sys/param.h> -#include <lxc/log.h> -#include <lxc/confile.h> -#include <lxc/lxc.h> +#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 cf87abf..b8d03e8 100644 --- a/src/lxc/lxc_start.c +++ b/src/lxc/lxc_start.c @@ -40,12 +40,13 @@ #include <netinet/in.h> #include <net/if.h> -#include <lxc/lxc.h> -#include <lxc/log.h> -#include <lxc/utils.h> - -#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 7143421..7e9d924 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 3390411..ba55562 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[]); |