On Fri, Jul 12, 2013 at 09:44:41AM -0500, Serge Hallyn wrote:
> 
> If set, then fds 0,1,2 will be redirected while the creation
> template is executed.
> 
> Note, as Dwight has pointed out, if fd 0 is redirected, then if
> templates ask for input there will be a problem.  We could simply
> not redirect fd 0, or we could require that templates work without
> interaction.  I'm assuming here that we want to do the latter, but
> I'm open to changing that.
> 
> Reported-by: "S.Çağlar Onur" <cag...@10ur.org>
> Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com>

Acked-by: Stéphane Graber <stgra...@ubuntu.com>

> ---
>  src/lua-lxc/core.c       |    2 +-
>  src/lxc/lxc_create.c     |    5 ++++-
>  src/lxc/lxccontainer.c   |   20 ++++++++++++++------
>  src/lxc/lxccontainer.h   |    7 +++++--
>  src/python-lxc/lxc.c     |    2 +-
>  src/tests/cgpath.c       |    2 +-
>  src/tests/clonetest.c    |    2 +-
>  src/tests/console.c      |    2 +-
>  src/tests/createtest.c   |    2 +-
>  src/tests/get_item.c     |    2 +-
>  src/tests/shutdowntest.c |    2 +-
>  11 files changed, 31 insertions(+), 17 deletions(-)
> 
> diff --git a/src/lua-lxc/core.c b/src/lua-lxc/core.c
> index 778ef99..642dbfc 100644
> --- a/src/lua-lxc/core.c
> +++ b/src/lua-lxc/core.c
> @@ -111,7 +111,7 @@ static int container_create(lua_State *L)
>       argv[i] = strdupa(luaL_checkstring(L, i+3));
>      argv[i] = NULL;
>  
> -    lua_pushboolean(L, !!c->create(c, template_name, NULL, NULL, argv));
> +    lua_pushboolean(L, !!c->create(c, template_name, NULL, NULL, 0, argv));
>      return 1;
>  }
>  
> diff --git a/src/lxc/lxc_create.c b/src/lxc/lxc_create.c
> index 6d8ca01..bd08ea2 100644
> --- a/src/lxc/lxc_create.c
> +++ b/src/lxc/lxc_create.c
> @@ -169,6 +169,7 @@ int main(int argc, char *argv[])
>  {
>       struct lxc_container *c;
>       struct bdev_specs spec;
> +     int flags = 0;
>  
>       /* this is a short term test.  We'll probably want to check for
>        * write access to lxcpath instead */
> @@ -228,7 +229,9 @@ int main(int argc, char *argv[])
>  
>       if (strcmp(my_args.bdevtype, "_unset") == 0)
>               my_args.bdevtype = NULL;
> -     if (!c->create(c, my_args.template, my_args.bdevtype, &spec, 
> &argv[optind])) {
> +     if (my_args.quiet)
> +             flags = LXC_CREATE_QUIET;
> +     if (!c->create(c, my_args.template, my_args.bdevtype, &spec, flags, 
> &argv[optind])) {
>               ERROR("Error creating container %s", c->name);
>               lxc_container_put(c);
>               exit(1);
> diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
> index 4b26051..3da23b7 100644
> --- a/src/lxc/lxccontainer.c
> +++ b/src/lxc/lxccontainer.c
> @@ -752,7 +752,7 @@ static char *lxcbasename(char *path)
>       return p;
>  }
>  
> -static bool create_run_template(struct lxc_container *c, char *tpath,
> +static bool create_run_template(struct lxc_container *c, char *tpath, bool 
> quiet,
>                               char *const argv[])
>  {
>       pid_t pid;
> @@ -773,6 +773,14 @@ static bool create_run_template(struct lxc_container *c, 
> char *tpath,
>               int ret, len, nargs = 0;
>               char **newargv;
>  
> +             if (quiet) {
> +                     close(0);
> +                     close(1);
> +                     close(2);
> +                     open("/dev/zero", O_RDONLY);
> +                     open("/dev/null", O_RDWR);
> +                     open("/dev/null", O_RDWR);
> +             }
>               if (unshare(CLONE_NEWNS) < 0) {
>                       ERROR("error unsharing mounts");
>                       exit(1);
> @@ -974,7 +982,7 @@ static bool lxcapi_destroy(struct lxc_container *c);
>   * arguments, you can just pass NULL.
>   */
>  static bool lxcapi_create(struct lxc_container *c, const char *t,
> -             const char *bdevtype, struct bdev_specs *specs,
> +             const char *bdevtype, struct bdev_specs *specs, int flags,
>               char *const argv[])
>  {
>       bool bret = false;
> @@ -1047,7 +1055,7 @@ static bool lxcapi_create(struct lxc_container *c, 
> const char *t,
>       if (!load_config_locked(c, c->configfile))
>               goto out;
>  
> -     if (!create_run_template(c, tpath, argv))
> +     if (!create_run_template(c, tpath, !!(flags & LXC_CREATE_QUIET), argv))
>               goto out_unlock;
>  
>       // now clear out the lxc_conf we have, reload from the created
> @@ -1115,7 +1123,7 @@ static bool lxcapi_shutdown(struct lxc_container *c, 
> int timeout)
>  }
>  
>  static bool lxcapi_createl(struct lxc_container *c, const char *t,
> -             const char *bdevtype, struct bdev_specs *specs, ...)
> +             const char *bdevtype, struct bdev_specs *specs, int flags, ...)
>  {
>       bool bret = false;
>       char **args = NULL, **temp;
> @@ -1129,7 +1137,7 @@ static bool lxcapi_createl(struct lxc_container *c, 
> const char *t,
>        * since we're going to wait for create to finish, I don't think we
>        * need to get a copy of the arguments.
>        */
> -     va_start(ap, specs);
> +     va_start(ap, flags);
>       while (1) {
>               char *arg;
>               arg = va_arg(ap, char *);
> @@ -1148,7 +1156,7 @@ static bool lxcapi_createl(struct lxc_container *c, 
> const char *t,
>       if (args)
>               args[nargs] = NULL;
>  
> -     bret = c->create(c, t, bdevtype, specs, args);
> +     bret = c->create(c, t, bdevtype, specs, flags, args);
>  
>  out:
>       if (args)
> diff --git a/src/lxc/lxccontainer.h b/src/lxc/lxccontainer.h
> index 5449a46..3399c7f 100644
> --- a/src/lxc/lxccontainer.h
> +++ b/src/lxc/lxccontainer.h
> @@ -12,6 +12,9 @@
>  #define LXC_CLONE_SNAPSHOT        (1 << 3)
>  #define LXC_CLONE_MAXFLAGS        (1 << 4)
>  
> +#define LXC_CREATE_QUIET       (1 << 0)
> +#define LXC_CREATE_MAXFLAGS       (1 << 1)
> +
>  struct bdev_specs;
>  
>  struct lxc_container {
> @@ -51,9 +54,9 @@ struct lxc_container {
>       bool (*destroy)(struct lxc_container *c);
>       bool (*save_config)(struct lxc_container *c, const char *alt_file);
>       bool (*create)(struct lxc_container *c, const char *t, const char 
> *bdevtype,
> -                     struct bdev_specs *specs, char *const argv[]);
> +                     struct bdev_specs *specs, int flags, char *const 
> argv[]);
>       bool (*createl)(struct lxc_container *c, const char *t, const char 
> *bdevtype,
> -                     struct bdev_specs *specs, ...);
> +                     struct bdev_specs *specs, int flags, ...);
>       /* send SIGINT to ask container to reboot */
>       bool (*reboot)(struct lxc_container *c);
>       /* send SIGPWR.  if timeout is not 0 or -1, do a hard stop after 
> timeout seconds */
> diff --git a/src/python-lxc/lxc.c b/src/python-lxc/lxc.c
> index 02428d4..18f2224 100644
> --- a/src/python-lxc/lxc.c
> +++ b/src/python-lxc/lxc.c
> @@ -249,7 +249,7 @@ Container_create(Container *self, PyObject *args, 
> PyObject *kwds)
>          }
>      }
>  
> -    if (self->container->create(self->container, template_name, NULL, NULL, 
> create_args))
> +    if (self->container->create(self->container, template_name, NULL, NULL, 
> 0, create_args))
>          retval = Py_True;
>      else
>          retval = Py_False;
> diff --git a/src/tests/cgpath.c b/src/tests/cgpath.c
> index 55c6664..944769c 100644
> --- a/src/tests/cgpath.c
> +++ b/src/tests/cgpath.c
> @@ -279,7 +279,7 @@ static int test_container(const char *lxcpath,
>               c = lxc_container_new(name, lxcpath);
>       }
>       c->set_config_item(c, "lxc.network.type", "empty");
> -     if (!c->createl(c, template, NULL, NULL, NULL)) {
> +     if (!c->createl(c, template, NULL, NULL, 0, NULL)) {
>               TSTERR("creating container %s", name);
>               goto out2;
>       }
> diff --git a/src/tests/clonetest.c b/src/tests/clonetest.c
> index f15f400..da3ce75 100644
> --- a/src/tests/clonetest.c
> +++ b/src/tests/clonetest.c
> @@ -53,7 +53,7 @@ int main(int argc, char *argv[])
>               goto out;
>       }
>       c->save_config(c, NULL);
> -     if (!c->createl(c, "ubuntu", NULL, NULL, NULL)) {
> +     if (!c->createl(c, "ubuntu", NULL, NULL, 0, NULL)) {
>               fprintf(stderr, "%d: failed to create a container\n", __LINE__);
>               goto out;
>       }
> diff --git a/src/tests/console.c b/src/tests/console.c
> index 434f7f2..cd63981 100644
> --- a/src/tests/console.c
> +++ b/src/tests/console.c
> @@ -137,7 +137,7 @@ static int test_console(const char *lxcpath,
>               c->destroy(c);
>               c = lxc_container_new(name, lxcpath);
>       }
> -     if (!c->createl(c, template, NULL, NULL, NULL)) {
> +     if (!c->createl(c, template, NULL, NULL, 0, NULL)) {
>               TSTERR("creating container %s", name);
>               goto out2;
>       }
> diff --git a/src/tests/createtest.c b/src/tests/createtest.c
> index f33f59b..879d0a1 100644
> --- a/src/tests/createtest.c
> +++ b/src/tests/createtest.c
> @@ -50,7 +50,7 @@ int main(int argc, char *argv[])
>       }
>       c->set_config_item(c, "lxc.network.link", "lxcbr0");
>       c->set_config_item(c, "lxc.network.flags", "up");
> -     if (!c->createl(c, "ubuntu", NULL, NULL, "-r", "lucid", NULL)) {
> +     if (!c->createl(c, "ubuntu", NULL, NULL, 0, "-r", "lucid", NULL)) {
>               fprintf(stderr, "%d: failed to create a lucid container\n", 
> __LINE__);
>               goto out;
>       }
> diff --git a/src/tests/get_item.c b/src/tests/get_item.c
> index 9511899..c4c95cb 100644
> --- a/src/tests/get_item.c
> +++ b/src/tests/get_item.c
> @@ -170,7 +170,7 @@ int main(int argc, char *argv[])
>               ret = 1;
>               goto out;
>       }
> -     if (!c->createl(c, "ubuntu", NULL, NULL, "-r", "lucid", NULL)) {
> +     if (!c->createl(c, "ubuntu", NULL, NULL, 0, "-r", "lucid", NULL)) {
>               fprintf(stderr, "%d: failed to create a lucid container\n", 
> __LINE__);
>               ret = 1;
>               goto out;
> diff --git a/src/tests/shutdowntest.c b/src/tests/shutdowntest.c
> index 6e50cb0..f67995e 100644
> --- a/src/tests/shutdowntest.c
> +++ b/src/tests/shutdowntest.c
> @@ -51,7 +51,7 @@ int main(int argc, char *argv[])
>       }
>       c->set_config_item(c, "lxc.network.link", "lxcbr0");
>       c->set_config_item(c, "lxc.network.flags", "up");
> -     if (!c->createl(c, "ubuntu", NULL, NULL, "-r", "lucid", NULL)) {
> +     if (!c->createl(c, "ubuntu", NULL, NULL, 0, "-r", "lucid", NULL)) {
>               fprintf(stderr, "%d: failed to create a lucid container\n", 
> __LINE__);
>               goto out;
>       }
> -- 
> 1.7.9.5
> 
> 
> ------------------------------------------------------------------------------
> 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

-- 
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com

Attachment: signature.asc
Description: Digital signature

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

Reply via email to