diff --git a/src/lxc/Makefile.am b/src/lxc/Makefile.am index f13b77de9..e659b4bd7 100644 --- a/src/lxc/Makefile.am +++ b/src/lxc/Makefile.am @@ -71,7 +71,7 @@ lxc_start_LDADD = liblxc.la lxc_stop_SOURCES = lxc_stop.c lxc_stop_LDADD = liblxc.la -lxc_execute_SOURCES = lxc_execute.c +lxc_execute_SOURCES = lxc_execute.c lxc_config.c lxc_config.h lxc_execute_LDADD = liblxc.la lxc_monitor_SOURCES = lxc_monitor.c diff --git a/src/lxc/lxc_execute.c b/src/lxc/lxc_execute.c index 53cad0d11..11a2a32f1 100644 --- a/src/lxc/lxc_execute.c +++ b/src/lxc/lxc_execute.c @@ -21,32 +21,44 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include +#include #include #include #include #include +#include +#include #include +#include void usage(char *cmd) { fprintf(stderr, "%s \n", basename(cmd)); - fprintf(stderr, "\t -n : name of the container\n"); + fprintf(stderr, "\t -n : name of the container\n"); + fprintf(stderr, "\t [-f ] : path of the configuration file\n"); _exit(1); } int main(int argc, char *argv[]) { char opt; - char *name = NULL; + char *name = NULL, *file = NULL; char **args; + char path[MAXPATHLEN]; int nbargs = 0; + int autodestroy = 0; + int ret = 1; + struct lxc_conf lxc_conf; - while ((opt = getopt(argc, argv, "n:")) != -1) { + while ((opt = getopt(argc, argv, "f:n:")) != -1) { switch (opt) { case 'n': name = optarg; break; + case 'f': + file = optarg; + break; } nbargs++; @@ -57,12 +69,44 @@ int main(int argc, char *argv[]) args = &argv[optind]; argc -= nbargs; - - if (lxc_execute(name, argc, args, NULL, NULL)) { - fprintf(stderr, "failed to start '%s'\n", name); - return 1; + + if (lxc_config_init(&lxc_conf)) { + fprintf(stderr, "failed to initialize the configuration\n"); + goto out; } - return 0; + if (file) { + + if (lxc_config_read(file, &lxc_conf)) { + fprintf(stderr, "invalid configuration file\n"); + goto out; + } + + } + + if (access(path, R_OK)) { + if (lxc_create(name, &lxc_conf)) { + fprintf(stderr, "failed to create the container '%s'\n", name); + goto out; + } + autodestroy = 1; + } + + if (lxc_execute(name, argc, args, NULL, NULL)) { + fprintf(stderr, "failed to execute '%s'\n", name); + goto out; + } + + ret = 0; + +out: + if (autodestroy) { + if (lxc_destroy(name)) { + fprintf(stderr, "failed to destroy '%s'\n", name); + ret = 1; + } + } + + return ret; }