]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
lxc-start can output the console to a file lxc-0.7.4-rc1
authorDaniel Lezcano <daniel.lezcano@free.fr>
Tue, 1 Feb 2011 13:49:40 +0000 (14:49 +0100)
committerDaniel Lezcano <dlezcano@fr.ibm.com>
Tue, 1 Feb 2011 13:49:40 +0000 (14:49 +0100)
Add the ability to specify a file to output the console.

Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
doc/lxc-start.sgml.in
src/lxc/arguments.c
src/lxc/arguments.h
src/lxc/lxc_start.c

index 0fa43dfd308434070a3c22165a6b8c62ef9bae01..1f6c293176fac536ead0764a04411a62188fa8ea 100644 (file)
@@ -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>
 
@@ -118,6 +120,20 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
        </listitem>
       </varlistentry>
 
+      <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>
index e3d62296ae5e128bca300af769a3196ba7e09d79..3c11661c5403976b87398003522d60dabd554b23 100644 (file)
@@ -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);
index cee10100643cadad65e370c9e54b9517f113b3e8..a2c35c4c53f259cbe11762357562f1709c02ef84 100644 (file)
@@ -44,6 +44,7 @@ struct lxc_arguments {
        int quiet;
        int daemonize;
        const char *rcfile;
+       const char *console;
 
        /* for lxc-checkpoint/restart */
        const char *statefile;
index 4f3d964a8bfca2b3f4109a315ff4ff2820a68ddf..fdd4c72c4fefcc438f948be4147268ea9be175d2 100644 (file)
@@ -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);