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> 
---
 src/lxc/commands.c    |    2 +-
 src/lxc/console.c     |    2 +-
 src/lxc/lxc.h         |    3 ++-
 src/lxc/lxc_execute.c |   20 ++++++++++++++++----
 src/lxc/lxc_start.c   |   24 ++++++++++++++++++------
 src/lxc/start.c       |   42 +++++++++++++-----------------------------
 src/lxc/start.h       |    4 ++--
 7 files changed, 53 insertions(+), 44 deletions(-)

Index: lxc/src/lxc/commands.c
===================================================================
--- lxc.orig/src/lxc/commands.c
+++ lxc/src/lxc/commands.c
@@ -135,7 +135,7 @@ static int trigger_command(int fd, struc
 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);
 }
Index: lxc/src/lxc/console.c
===================================================================
--- lxc.orig/src/lxc/console.c
+++ lxc/src/lxc/console.c
@@ -98,7 +98,7 @@ extern int lxc_console_callback(int fd, 
 			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)
Index: lxc/src/lxc/lxc.h
===================================================================
--- lxc.orig/src/lxc/lxc.h
+++ lxc/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
Index: lxc/src/lxc/lxc_execute.c
===================================================================
--- lxc.orig/src/lxc/lxc_execute.c
+++ lxc/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);
 }
 
Index: lxc/src/lxc/lxc_start.c
===================================================================
--- lxc.orig/src/lxc/lxc_start.c
+++ lxc/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);
 
Index: lxc/src/lxc/start.c
===================================================================
--- lxc.orig/src/lxc/start.c
+++ lxc/src/lxc/start.c
@@ -230,7 +230,7 @@ static int console_init(char *console, s
 	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 
 
 	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 l
 	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 l
 	}
 
 	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 l
 
 	/* 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;
Index: lxc/src/lxc/start.h
===================================================================
--- lxc.orig/src/lxc/start.h
+++ lxc/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[]);
 



