[lxc-devel] [PATCH] support arguments in lxc.init_cmd
Stéphane Graber
stgraber at ubuntu.com
Fri Nov 6 18:18:20 UTC 2015
On Thu, Nov 05, 2015 at 10:18:52PM +0000, Serge Hallyn wrote:
> Otherwise something like
> lxc.init_cmd = /sbin/init debug verbose
> fails trying to execute a file called "/sbin/init debug verbose"
>
> Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
Acked-by: Stéphane Graber <stgraber at ubuntu.com>
> ---
> src/lxc/lxccontainer.c | 83 +++++++++++++++++++++++++++++++++++++++++---------
> 1 file changed, 69 insertions(+), 14 deletions(-)
>
> diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
> index 42e23e7..c3e8250 100644
> --- a/src/lxc/lxccontainer.c
> +++ b/src/lxc/lxccontainer.c
> @@ -618,10 +618,64 @@ static bool am_single_threaded(void)
> return count == 1;
> }
>
> -/*
> - * I can't decide if it'd be more convenient for callers if we accept '...',
> - * or a null-terminated array (i.e. execl vs execv)
> - */
> +static void push_arg(char ***argp, char *arg, int *nargs)
> +{
> + char **argv;
> + char *copy;
> +
> + do {
> + copy = strdup(arg);
> + } while (!copy);
> + do {
> + argv = realloc(*argp, (*nargs + 2) * sizeof(char *));
> + } while (!argv);
> + *argp = argv;
> + argv[*nargs] = copy;
> + (*nargs)++;
> + argv[*nargs] = NULL;
> +}
> +
> +static char **split_init_cmd(const char *incmd)
> +{
> + size_t len;
> + int nargs = 0;
> + char *copy, *p, *saveptr;
> + char **argv;
> +
> + if (!incmd)
> + return NULL;
> +
> + len = strlen(incmd) + 1;
> + copy = alloca(len);
> + strncpy(copy, incmd, len);
> + copy[len-1] = '\0';
> +
> + do {
> + argv = malloc(sizeof(char *));
> + } while (!argv);
> + argv[0] = NULL;
> + for (p = strtok_r(copy, " ", &saveptr); p != NULL;
> + p = strtok_r(NULL, " ", &saveptr))
> + push_arg(&argv, p, &nargs);
> +
> + if (nargs == 0) {
> + free(argv);
> + return NULL;
> + }
> + return argv;
> +}
> +
> +static void free_init_cmd(char **argv)
> +{
> + int i = 0;
> +
> + if (!argv)
> + return;
> + while (argv[i])
> + free(argv[i++]);
> + free(argv);
> +}
> +
> static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const argv[])
> {
> int ret;
> @@ -632,7 +686,7 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
> "/sbin/init",
> NULL,
> };
> - char *init_cmd[2];
> + char **init_cmd = NULL;
>
> /* container exists */
> if (!c)
> @@ -669,15 +723,14 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
> return ret == 0 ? true : false;
> }
>
> - if (!argv) {
> - if (conf->init_cmd) {
> - init_cmd[0] = conf->init_cmd;
> - init_cmd[1] = NULL;
> - argv = init_cmd;
> - }
> - else
> - argv = default_args;
> - }
> + /* if no argv was passed in, use lxc.init_cmd if provided in
> + * configuration */
> + if (!argv)
> + argv = init_cmd = split_init_cmd(conf->init_cmd);
> +
> + /* ... and otherwise use default_args */
> + if (!argv)
> + argv = default_args;
>
> /*
> * say, I'm not sure - what locks do we want here? Any?
> @@ -786,6 +839,8 @@ out:
> c->pidfile = NULL;
> }
>
> + free_init_cmd(init_cmd);
> +
> if (daemonize)
> exit (ret == 0 ? true : false);
> else
> --
> 2.5.0
>
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel
--
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20151106/f78bc1ac/attachment.sig>
More information about the lxc-devel
mailing list