allow lxc-init to log when rootfs not given

On Mon, 29 Apr 2013 14:44:47 -0500
Serge Hallyn <serge.hallyn@ubuntu.com> wrote:

> Quoting Dwight Engen (dwight.engen@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.

Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
This commit is contained in:
Dwight Engen 2013-05-01 19:07:16 -04:00 committed by Serge Hallyn
parent eee3ba81c8
commit e0b0b533fe
3 changed files with 75 additions and 23 deletions

View File

@ -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 = 0, 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;
}

View File

@ -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);

View File

@ -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;