aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Lezcano <daniel.lezcano@free.fr>2011-02-01 14:49:40 +0100
committerDaniel Lezcano <dlezcano@fr.ibm.com>2011-02-01 14:49:40 +0100
commit829dd9183cbefccdf38f87463fa5c2719e774204 (patch)
tree17d67a0284357abaf0391d2b8af30ccbfde4c52a
parentlxc-0.7.4-rc1 (diff)
downloadlxc-829dd9183cbefccdf38f87463fa5c2719e774204.tar.gz
lxc-829dd9183cbefccdf38f87463fa5c2719e774204.tar.bz2
lxc-829dd9183cbefccdf38f87463fa5c2719e774204.zip
lxc-start can output the console to a filelxc-0.7.4-rc1
Add the ability to specify a file to output the console. Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
-rw-r--r--doc/lxc-start.sgml.in18
-rw-r--r--src/lxc/arguments.c1
-rw-r--r--src/lxc/arguments.h1
-rw-r--r--src/lxc/lxc_start.c49
4 files changed, 51 insertions, 18 deletions
diff --git a/doc/lxc-start.sgml.in b/doc/lxc-start.sgml.in
index 0fa43df..1f6c293 100644
--- a/doc/lxc-start.sgml.in
+++ b/doc/lxc-start.sgml.in
@@ -49,7 +49,9 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
<refsynopsisdiv>
<cmdsynopsis><command>lxc-start <replaceable>-n
name</replaceable> <optional>-f
- config_file</optional> <optional>-s KEY=VAL</optional>
+ config_file</optional> <optional>-c
+ console_file</optional> <optional>-d</optional> <optional>-s
+ KEY=VAL</optional>
<optional>command</optional></command></cmdsynopsis>
</refsynopsisdiv>
@@ -120,6 +122,20 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
<varlistentry>
<term>
+ <option>-c,
+ --console <replaceable>console_file</replaceable></option>
+ </term>
+ <listitem>
+ <para>
+ Specify a file to output the container console. If the
+ option is not specified the output will go the terminal
+ except if the <option>-d</option> is specified.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
<option>-s, --define <replaceable>KEY=VAL</replaceable></option>
</term>
<listitem>
diff --git a/src/lxc/arguments.c b/src/lxc/arguments.c
index e3d6229..3c11661 100644
--- a/src/lxc/arguments.c
+++ b/src/lxc/arguments.c
@@ -168,6 +168,7 @@ extern int lxc_arguments_parse(struct lxc_arguments *args,
case 'n': args->name = optarg; break;
case 'o': args->log_file = optarg; break;
case 'l': args->log_priority = optarg; break;
+ case 'c': args->console = optarg; break;
case 'q': args->quiet = 1; break;
case OPT_USAGE: print_usage(args->options, args);
case '?': print_help(args, 1);
diff --git a/src/lxc/arguments.h b/src/lxc/arguments.h
index cee1010..a2c35c4 100644
--- a/src/lxc/arguments.h
+++ b/src/lxc/arguments.h
@@ -44,6 +44,7 @@ struct lxc_arguments {
int quiet;
int daemonize;
const char *rcfile;
+ const char *console;
/* for lxc-checkpoint/restart */
const char *statefile;
diff --git a/src/lxc/lxc_start.c b/src/lxc/lxc_start.c
index 4f3d964..fdd4c72 100644
--- a/src/lxc/lxc_start.c
+++ b/src/lxc/lxc_start.c
@@ -57,6 +57,7 @@ static struct lxc_list defines;
static int my_parser(struct lxc_arguments* args, int c, char* arg)
{
switch (c) {
+ case 'c': args->console = arg; break;
case 'd': args->daemonize = 1; break;
case 'f': args->rcfile = arg; break;
case 's': return lxc_config_define_add(&defines, arg);
@@ -68,6 +69,7 @@ static const struct option my_longopts[] = {
{"daemon", no_argument, 0, 'd'},
{"rcfile", required_argument, 0, 'f'},
{"define", required_argument, 0, 's'},
+ {"console", required_argument, 0, 'c'},
LXC_COMMON_OPTIONS
};
@@ -82,6 +84,7 @@ Options :\n\
-n, --name=NAME NAME for name of the container\n\
-d, --daemon daemonize the container\n\
-f, --rcfile=FILE Load configuration file FILE\n\
+ -c, --console=FILE Set the file output for the container console\n\
-s, --define KEY=VAL Assign VAL to configuration variable KEY\n",
.options = my_longopts,
.parser = my_parser,
@@ -160,28 +163,40 @@ int main(int argc, char *argv[])
return err;
}
- if (my_args.daemonize) {
+ if (my_args.console) {
- /* do not chdir as we want to open the log file,
- * change the directory right after.
- * do not close 0, 1, 2, we want to do that
- * ourself because we don't want /dev/null
- * being reopened.
- */
- if (daemon(1, 1)) {
- SYSERROR("failed to daemonize '%s'", my_args.name);
- return err;
+ char *console, fd;
+
+ if (access(my_args.console, W_OK)) {
+
+ fd = creat(my_args.console, 0600);
+ if (fd < 0) {
+ SYSERROR("failed to touch file '%s'",
+ my_args.console);
+ return err;
+ }
+ close(fd);
}
- close(0);
- close(1);
- close(2);
+ console = realpath(my_args.console, NULL);
+ if (!console) {
+ SYSERROR("failed to get the real path of '%s'",
+ my_args.console);
+ return err;
+ }
- if (my_args.log_file) {
- open(my_args.log_file, O_WRONLY | O_CLOEXEC);
- open(my_args.log_file, O_RDONLY | O_CLOEXEC);
- open(my_args.log_file, O_RDONLY | O_CLOEXEC);
+ conf->console.path = strdup(console);
+ if (!conf->console.path) {
+ ERROR("failed to dup string '%s'", console);
+ return err;
}
+
+ free(console);
+ }
+
+ if (my_args.daemonize && daemon(0, 0)) {
+ SYSERROR("failed to daemonize '%s'", my_args.name);
+ return err;
}
err = lxc_start(my_args.name, args, conf);