]> git.proxmox.com Git - mirror_lxc.git/commitdiff
pass lxc_conf to the lxc_start function instead of the rcfile
authorDaniel Lezcano <daniel.lezcano@free.fr>
Thu, 26 Nov 2009 15:46:24 +0000 (16:46 +0100)
committerDaniel Lezcano <dlezcano@fr.ibm.com>
Thu, 26 Nov 2009 15:46:24 +0000 (16:46 +0100)
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
src/lxc/console.c
src/lxc/lxc.h
src/lxc/lxc_execute.c
src/lxc/lxc_start.c
src/lxc/start.c
src/lxc/start.h

index 02239e5413e2e8449b9f2f7367a8d9dec41d2b15..4c48571a2a816d73daa46fdd5990d45e888e8085 100644 (file)
@@ -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);
 }
index 52f6cecf1e1c9ac7fa3e0e9df14598d12b1c64b6..96a6edd85b36f0e37245020e46e127351b72f26b 100644 (file)
@@ -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)
index 66cb3b8c24b5c739a9d447f5feaab454d94740bd..8cf21c173755bfc7f6c35e1249f00b7c3d6fcb91 100644 (file)
@@ -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 846a96fad814ea6efc50a2958d8e91ceac2c30d0..40a4b93c523470b5ccd5dfbd539fb08263e53dc2 100644 (file)
 #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 cf87abfb0ac1c7036fcbde71818ca1bca0719efa..b8d03e8508908483411766ce23a000e555a9a59b 100644 (file)
 #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 714342168db3cab45db3ece80fbc804d0c5f6fbe..7e9d924141aa84a6b26529f5f01402cdc374b46e 100644 (file)
@@ -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;
index 339041136c5455fd62309902989190b235019d9a..ba555621d7b3daf29a8d6107428a5c64eb65ac98 100644 (file)
@@ -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[]);