Quoting Dwight Engen (dwight.en...@oracle.com):
> On Mon, 29 Apr 2013 14:44:47 -0500
> Serge Hallyn <serge.hal...@ubuntu.com> wrote:
> 
> > Quoting Dwight Engen (dwight.en...@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.en...@oracle.com>

Acked-by: Serge E. Hallyn <serge.hal...@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
> 

------------------------------------------------------------------------------
Introducing AppDynamics Lite, a free troubleshooting tool for Java/.NET
Get 100% visibility into your production application - at no cost.
Code-level diagnostics for performance bottlenecks with <2% overhead
Download for free and get started troubleshooting in minutes.
http://p.sf.net/sfu/appdyn_d2d_ap1
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to