Quoting Dwight Engen (dwight.en...@oracle.com): > On Thu, 11 Jul 2013 14:48:21 -0500 > Serge Hallyn <serge.hal...@ubuntu.com> wrote: > > > lxc-create ... -o - > > > > will send template output to standard output (the old default). > > > > lxc-create ... without any -o will hide template output. > > > > lxc-create -o /tmp/xxx will send template output to the file > > /tmp/xxx. > > I like having a -o for lxc-create, but I'm not sure we should change the
Sorry, that was wrong in my commit msg. only '--outfile' works (because 'o' is used by the common options for logfile output) > default of lxc-create to not show the template output. For interactive We could swap the meanings so that '--outfile -' means on output, and not listing '--outfile' shows the output on stdout. > use it can be quite useful, whereas I think silent certainly makes sense > for the API (which is what I think Çağlars original concern was). Oh, hm, yeah. So my approach actually doesn't suffice. I was thinking callers could do the same thing, but that's somewhat silly. > Maybe the API should take fds which we can dup2() onto 0,1,2 of the > forked create process to handle both cases? (and would allow the API to > capture the output if so desired) pass in an int* which is either NULL or contains 3 ints (i.e. -1, 10, 10 if 10 is an output file)? > On a related note, I guess we should make sure that all of the > templates are non-interactive, especially if we're going to give > them /dev/zero for stdin. Just thought I'd mention it given that the > ssh one for example was asking for a passphrase until just recently ;) > > > Reported-by: "S.Çağlar Onur" <cag...@10ur.org> > > Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com> > > --- > > src/lxc/arguments.h | 2 +- > > src/lxc/lxc_create.c | 22 ++++++++++++++++++++++ > > 2 files changed, 23 insertions(+), 1 deletion(-) > > > > diff --git a/src/lxc/arguments.h b/src/lxc/arguments.h > > index 3d1df70..6ab88fc 100644 > > --- a/src/lxc/arguments.h > > +++ b/src/lxc/arguments.h > > @@ -81,7 +81,7 @@ struct lxc_arguments { > > char *fstype; > > unsigned long fssize; > > char *lvname, *vgname; > > - char *zfsroot, *lowerdir, *dir; > > + char *zfsroot, *lowerdir, *dir, *outfile; > > > > /* remaining arguments */ > > char *const *argv; > > diff --git a/src/lxc/lxc_create.c b/src/lxc/lxc_create.c > > index 6d8ca01..32805f4 100644 > > --- a/src/lxc/lxc_create.c > > +++ b/src/lxc/lxc_create.c > > @@ -68,6 +68,7 @@ static int my_parser(struct lxc_arguments* args, > > int c, char* arg) case '3': args->fssize = get_fssize(arg); break; > > case '4': args->zfsroot = arg; break; > > case '5': args->dir = arg; break; > > + case '6': args->outfile = arg; break; > > } > > return 0; > > } > > @@ -82,6 +83,7 @@ static const struct option my_longopts[] = { > > {"fssize", required_argument, 0, '3'}, > > {"zfsroot", required_argument, 0, '4'}, > > {"dir", required_argument, 0, '5'}, > > + {"outfile", required_argument, 0, '6'}, > > LXC_COMMON_OPTIONS > > }; > > > > @@ -134,6 +136,9 @@ Options :\n\ > > --fssize=SIZE Create filesystem of size SIZE\n\ > > (Default: 1G))\n\ > > --dir=DIR Place rootfs directory under DIR\n\ > > + --outfile=FILE Print template output to FILE\n\ > > + Use '-' to indicate stdout\n\ > > + If unspecified, output is hidden\n\ > > --zfsroot=PATH Create zfs under given zfsroot\n\ > > (Default: tank/lxc))\n", > > .options = my_longopts, > > @@ -228,6 +233,23 @@ int main(int argc, char *argv[]) > > > > if (strcmp(my_args.bdevtype, "_unset") == 0) > > my_args.bdevtype = NULL; > > + > > + /* redirect output if requested */ > > + if (!my_args.outfile) { > > + close(0); close(1); close(2); > > + open("/dev/zero", O_RDONLY); > > + open("/dev/null", O_RDWR); > > + open("/dev/null", O_RDWR); > > + } else if (strcmp(my_args.outfile, "-") != 0) { > > + mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP; > > + close(0); close(1); close(2); > > + open("/dev/zero", O_RDONLY); > > + if (open(my_args.outfile, O_RDWR | O_CREAT, mode) < > > 0 || > > + open(my_args.outfile, O_RDWR) < 0) { > > + SYSERROR("Error opening %s\n", > > my_args.outfile); > > + exit(1); > > + } > > + } > > if (!c->create(c, my_args.template, my_args.bdevtype, &spec, > > &argv[optind])) { ERROR("Error creating container %s", c->name); > > lxc_container_put(c); > ------------------------------------------------------------------------------ See everything from the browser to the database with AppDynamics Get end-to-end visibility with application monitoring from AppDynamics Isolate bottlenecks and diagnose root cause in seconds. Start your free trial of AppDynamics Pro today! http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel