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