[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