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

Reply via email to