[lxc-devel] [PATCH] allow lxc-init to log when rootfs not given
Serge Hallyn
serge.hallyn at ubuntu.com
Thu May 2 13:11:07 UTC 2013
Quoting Dwight Engen (dwight.engen at oracle.com):
> On Mon, 29 Apr 2013 14:44:47 -0500
> Serge Hallyn <serge.hallyn at ubuntu.com> wrote:
>
> > Quoting Dwight Engen (dwight.engen at oracle.com):
> > > So I did this, only to realize that lxc-init is passing "none" for
> > > the file anyway, so it currently doesn't intend to log. This makes
> > > me think that passing NULL for lxcpath is the right thing to do in
> > > this patch. If you want me to make it so lxc-init can log, I can do
> > > that but I think it should be in a different change :)
> >
> > That actually would be very useful, but as you say that's a different
> > feature - thanks.
>
> ... and here is said change.
>
> ---
>
> fixed leak in error case in execute_start(), made lxc_log_init()
> safe to call with NULL lxcpath.
>
> Signed-off-by: Dwight Engen <dwight.engen at oracle.com>
Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>
(compile-tested - I need to look into other lxc-execute failures I'm
having with git head)
> ---
> src/lxc/execute.c | 27 ++++++++++++++++++----
> src/lxc/log.c | 3 +++
> src/lxc/lxc_init.c | 68 +++++++++++++++++++++++++++++++++++++++---------------
> 3 files changed, 75 insertions(+), 23 deletions(-)
>
> diff --git a/src/lxc/execute.c b/src/lxc/execute.c
> index c1f6526..d93e8e1 100644
> --- a/src/lxc/execute.c
> +++ b/src/lxc/execute.c
> @@ -27,6 +27,7 @@
> #include <unistd.h>
> #include <stdlib.h>
>
> +#include "conf.h"
> #include "log.h"
> #include "start.h"
>
> @@ -85,23 +86,37 @@ static int execute_start(struct lxc_handler *handler, void* data)
> int j, i = 0;
> struct execute_args *my_args = data;
> char **argv;
> - int argc = 0;
> + int argc = 2, argc_add;
> char *initpath;
>
> while (my_args->argv[argc++]);
>
> - argv = malloc((argc + my_args->quiet ? 5 : 4) * sizeof(*argv));
> + argc_add = 4;
> + if (my_args->quiet)
> + argc_add++;
> + if (!handler->conf->rootfs.path)
> + argc_add+=6;
> +
> + argv = malloc((argc + argc_add) * sizeof(*argv));
> if (!argv)
> - return 1;
> + goto out1;
>
> initpath = choose_init();
> if (!initpath) {
> ERROR("Failed to find an lxc-init");
> - return 1;
> + goto out2;
> }
> argv[i++] = initpath;
> if (my_args->quiet)
> argv[i++] = "--quiet";
> + if (!handler->conf->rootfs.path) {
> + argv[i++] = "--name";
> + argv[i++] = (char *)handler->name;
> + argv[i++] = "--lxcpath";
> + argv[i++] = (char *)handler->lxcpath;
> + argv[i++] = "--logpriority";
> + argv[i++] = (char *)lxc_log_priority_to_string(lxc_log_get_level());
> + }
> argv[i++] = "--";
> for (j = 0; j < argc; j++)
> argv[i++] = my_args->argv[j];
> @@ -111,6 +126,10 @@ static int execute_start(struct lxc_handler *handler, void* data)
>
> execvp(argv[0], argv);
> SYSERROR("failed to exec %s", argv[0]);
> + free(initpath);
> +out2:
> + free(argv);
> +out1:
> return 1;
> }
>
> diff --git a/src/lxc/log.c b/src/lxc/log.c
> index 8d87a51..d49a544 100644
> --- a/src/lxc/log.c
> +++ b/src/lxc/log.c
> @@ -318,6 +318,9 @@ extern int lxc_log_init(const char *name, const char *file,
> } else {
> ret = -1;
>
> + if (!lxcpath)
> + lxcpath = LOGPATH;
> +
> /* try LOGPATH if lxcpath is the default */
> if (strcmp(lxcpath, default_lxc_path()) == 0)
> ret = _lxc_log_set_file(name, NULL, 0);
> diff --git a/src/lxc/lxc_init.c b/src/lxc/lxc_init.c
> index 663875b..f772f0d 100644
> --- a/src/lxc/lxc_init.c
> +++ b/src/lxc/lxc_init.c
> @@ -43,7 +43,10 @@ lxc_log_define(lxc_init, lxc);
> static int quiet;
>
> static struct option options[] = {
> - { "quiet", no_argument, &quiet, 1 },
> + { "name", required_argument, NULL, 'n' },
> + { "logpriority", required_argument, NULL, 'l' },
> + { "quiet", no_argument, NULL, 'q' },
> + { "lxcpath", required_argument, NULL, 'P' },
> { 0, 0, 0, 0 },
> };
>
> @@ -55,39 +58,66 @@ static void interrupt_handler(int sig)
> was_interrupted = sig;
> }
>
> +static void usage(void) {
> + fprintf(stderr, "Usage: lxc-init [OPTION]...\n\n"
> + "Common options :\n"
> + " -n, --name=NAME NAME for name of the container\n"
> + " -l, --logpriority=LEVEL Set log priority to LEVEL\n"
> + " -q, --quiet Don't produce any output\n"
> + " -P, --lxcpath=PATH Use specified container path\n"
> + " -?, --help Give this help list\n"
> + "\n"
> + "Mandatory or optional arguments to long options are also mandatory or optional\n"
> + "for any corresponding short options.\n"
> + "\n"
> + "NOTE: lxc-init is intended for use by lxc internally\n"
> + " and does not need to be run by hand\n\n");
> +}
> +
> int main(int argc, char *argv[])
> {
> pid_t pid;
> - int nbargs = 0;
> - int err = -1;
> + int err;
> char **aargv;
> sigset_t mask, omask;
> int i, have_status = 0, shutdown = 0;
> + int opt;
> + char *lxcpath = NULL, *name = NULL, *logpriority = NULL;
>
> - while (1) {
> - int ret = getopt_long_only(argc, argv, "", options, NULL);
> - if (ret == -1) {
> + while ((opt = getopt_long(argc, argv, "n:l:qP:", options, NULL)) != -1) {
> + switch(opt) {
> + case 'n':
> + name = optarg;
> + break;
> + case 'l':
> + logpriority = optarg;
> break;
> + case 'q':
> + quiet = 1;
> + break;
> + case 'P':
> + lxcpath = optarg;
> + break;
> + default: /* '?' */
> + usage();
> + exit(EXIT_FAILURE);
> }
> - if (ret == '?')
> - exit(err);
> -
> - nbargs++;
> }
>
> if (lxc_caps_init())
> - exit(err);
> + exit(EXIT_FAILURE);
>
> - if (lxc_log_init(NULL, "none", 0, basename(argv[0]), quiet, NULL))
> - exit(err);
> + err = lxc_log_init(name, name ? NULL : "none", logpriority,
> + basename(argv[0]), quiet, lxcpath);
> + if (err < 0)
> + exit(EXIT_FAILURE);
>
> if (!argv[optind]) {
> ERROR("missing command to launch");
> - exit(err);
> + exit(EXIT_FAILURE);
> }
>
> aargv = &argv[optind];
> - argc -= nbargs;
>
> /*
> * mask all the signals so we are safe to install a
> @@ -125,15 +155,15 @@ int main(int argc, char *argv[])
> }
>
> if (lxc_setup_fs())
> - exit(err);
> + exit(EXIT_FAILURE);
>
> if (lxc_caps_reset())
> - exit(err);
> + exit(EXIT_FAILURE);
>
> pid = fork();
>
> if (pid < 0)
> - exit(err);
> + exit(EXIT_FAILURE);
>
> if (!pid) {
>
> @@ -158,7 +188,7 @@ int main(int argc, char *argv[])
> close(fileno(stdin));
> close(fileno(stdout));
>
> - err = 0;
> + err = EXIT_SUCCESS;
> for (;;) {
> int status;
> pid_t waited_pid;
> --
> 1.8.1.4
>
More information about the lxc-devel
mailing list