aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Lezcano <daniel.lezcano@free.fr>2009-11-26 16:46:24 +0100
committerDiego Elio 'Flameeyes' Pettenò <flameeyes@gmail.com>2009-12-11 17:49:11 +0100
commit6a11fa4e4b451a4f7fca8bc8022f3f147bbac734 (patch)
tree8f73bde906b2c599201590a144812576a3dd31c4
parentallow lxc.network.pair to specify host-side name for veth interface (diff)
downloadlxc-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.c2
-rw-r--r--src/lxc/console.c2
-rw-r--r--src/lxc/lxc.h3
-rw-r--r--src/lxc/lxc_execute.c20
-rw-r--r--src/lxc/lxc_start.c24
-rw-r--r--src/lxc/start.c42
-rw-r--r--src/lxc/start.h4
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[]);