[lxc-devel] [PATCH 2/4] lxc-init: use lxc logging infrastructure
Greg Kurz
gkurz at fr.ibm.com
Tue Nov 8 11:49:14 UTC 2011
Because there are no reasons that a vital component like lxc-init
doesn't log into a file.
Signed-off-by: Greg Kurz <gkurz at fr.ibm.com>
Signed-off-by: Cedric Le Goater <clg at 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);
}
More information about the lxc-devel
mailing list