Commit fae349da by Daniel Lezcano Committed by Daniel Lezcano

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>
parent aedd9d3f
......@@ -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);
}
......
......@@ -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)
......
......@@ -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
......
......@@ -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);
}
......@@ -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);
......
......@@ -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;
......
......@@ -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[]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment