Because there are no reasons that a vital component like lxc-init doesn't log into a file.
Signed-off-by: Greg Kurz <gk...@fr.ibm.com> Signed-off-by: Cedric Le Goater <c...@fr.ibm.com> --- src/lxc/execute.c | 22 ++++++++++++++++- src/lxc/lxc.h | 1 + src/lxc/lxc_execute.c | 3 ++ src/lxc/lxc_init.c | 62 ++++++++++++++++++++++++++----------------------- 4 files changed, 56 insertions(+), 32 deletions(-) diff --git a/src/lxc/execute.c b/src/lxc/execute.c index 43210e2..5b52771 100644 --- a/src/lxc/execute.c +++ b/src/lxc/execute.c @@ -25,6 +25,7 @@ #include <unistd.h> #include <stdlib.h> +#include "lxc.h" #include "log.h" #include "start.h" @@ -33,6 +34,8 @@ lxc_log_define(lxc_execute, lxc_start); struct execute_args { char *const *argv; int quiet; + char *log_file; + char *log_priority; }; static int execute_start(struct lxc_handler *handler, void* data) @@ -44,11 +47,23 @@ static int execute_start(struct lxc_handler *handler, void* data) while (my_args->argv[argc++]); - argv = malloc((argc + my_args->quiet ? 5 : 4) * sizeof(*argv)); + /* We add at most 10 strings (including the terminating NULL). + */ + argv = malloc((argc + 10) * sizeof(*argv)); if (!argv) return 1; argv[i++] = LXCINITDIR "/lxc-init"; + argv[i++] = "--name"; + argv[i++] = handler->name; + if (my_args->log_file) { + argv[i++] = "--logfile"; + argv[i++] = my_args->log_file; + } + if (my_args->log_priority) { + argv[i++] = "--logpriority"; + argv[i++] = my_args->log_priority; + } if (my_args->quiet) argv[i++] = "--quiet"; argv[i++] = "--"; @@ -76,11 +91,14 @@ static struct lxc_operations execute_start_ops = { }; int lxc_execute(const char *name, char *const argv[], int quiet, + char *log_file, char *log_priority, struct lxc_conf *conf) { struct execute_args args = { .argv = argv, - .quiet = quiet + .quiet = quiet, + .log_file = log_file, + .log_priority = log_priority }; if (lxc_check_inherited(-1)) diff --git a/src/lxc/lxc.h b/src/lxc/lxc.h index ae8a3f7..96cd735 100644 --- a/src/lxc/lxc.h +++ b/src/lxc/lxc.h @@ -66,6 +66,7 @@ extern int lxc_stop(const char *name); * Returns 0 on sucess, < 0 otherwise */ extern int lxc_execute(const char *name, char *const argv[], int quiet, + char *log_file, char *log_priority, struct lxc_conf *conf); /* diff --git a/src/lxc/lxc_execute.c b/src/lxc/lxc_execute.c index 1eb25a7..82a9235 100644 --- a/src/lxc/lxc_execute.c +++ b/src/lxc/lxc_execute.c @@ -136,5 +136,6 @@ int main(int argc, char *argv[]) if (lxc_config_define_load(&defines, conf)) return -1; - return lxc_execute(my_args.name, my_args.argv, my_args.quiet, conf); + return lxc_execute(my_args.name, my_args.argv, my_args.quiet, + my_args.log_file, my_args.log_priority, conf); } diff --git a/src/lxc/lxc_init.c b/src/lxc/lxc_init.c index 17704cd..2f209d1 100644 --- a/src/lxc/lxc_init.c +++ b/src/lxc/lxc_init.c @@ -31,9 +31,8 @@ #include <sys/types.h> #include <sys/wait.h> #include <sys/signalfd.h> -#define _GNU_SOURCE -#include <getopt.h> +#include "arguments.h" #include "log.h" #include "caps.h" #include "error.h" @@ -42,11 +41,31 @@ lxc_log_define(lxc_init, lxc); -static int quiet; +static int my_checker(const struct lxc_arguments* args) +{ + if (!args->argc) { + lxc_error(args, "missing command to execute !"); + return -1; + } + + return 0; +} + +static const struct option my_longopts[] = { + LXC_COMMON_OPTIONS +}; -static struct option options[] = { - { "quiet", no_argument, &quiet, 1 }, - { 0, 0, 0, 0 }, +static struct lxc_arguments my_args = { + .progname = "lxc-init", + .help = "\ +--name=NAME -- COMMAND\n\ +\n\ +lxc-init execs COMMAND into this container acts as a minimal init process\n\ +\n\ +Options :\n\ + -n, --name=NAME NAME for name of the container\n", + .options = my_longopts, + .checker = my_checker, }; static pid_t child_pid; @@ -119,6 +138,8 @@ static int handle_signal(int fd, void* data, struct lxc_epoll_descr *descr) break; default: + NOTICE("forwarding signal %d to child <%d>", siginfo.ssi_signo, + child_pid); kill(child_pid, siginfo.ssi_signo); break; } @@ -128,37 +149,20 @@ static int handle_signal(int fd, void* data, struct lxc_epoll_descr *descr) int main(int argc, char *argv[]) { - int nbargs = 0; int err = -1; - char **aargv; sigset_t mask; struct lxc_epoll_descr mainloop_descr; int signal_fd; - while (1) { - int ret = getopt_long_only(argc, argv, "", options, NULL); - if (ret == -1) { - break; - } - if (ret == '?') - exit(err); - - nbargs++; - } - if (lxc_caps_init()) exit(err); - if (lxc_log_init(NULL, 0, basename(argv[0]), quiet)) + if (lxc_arguments_parse(&my_args, argc, argv)) exit(err); - if (!argv[optind]) { - ERROR("missing command to launch"); + if (lxc_log_init(my_args.log_file, my_args.log_priority, + my_args.progname, my_args.quiet)) exit(err); - } - - aargv = &argv[optind]; - argc -= nbargs; if (lxc_setup_fs()) exit(err); @@ -172,10 +176,10 @@ int main(int argc, char *argv[]) exit(err); if (!child_pid) { - NOTICE("about to exec '%s'", aargv[0]); + NOTICE("about to exec '%s'", my_args.argv[0]); - execvp(aargv[0], aargv); - ERROR("failed to exec: '%s' : %m", aargv[0]); + execvp(my_args.argv[0], my_args.argv); + ERROR("failed to exec: '%s' : %m", my_args.argv[0]); exit(err); } ------------------------------------------------------------------------------ The demand for IT networking professionals continues to grow, and the demand for specialized networking skills is growing even more rapidly. Take a complimentary Learning@Cisco Self-Assessment and learn about Cisco certifications, training, and career opportunities. http://p.sf.net/sfu/cisco-dev2dev _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel