From a0a2066d93aa10de373a97784e2cb300518a38b0 Mon Sep 17 00:00:00 2001 From: Serge Hallyn Date: Tue, 31 Jul 2012 16:04:33 +0200 Subject: [PATCH] lxc-execute: find lxc-init lxc-init used to be under /usr/lib/lxc. Now it is under /usr/lib//lxc, but old containers will still have it under /usr/lib/lxc. So search for a valid lxc-init to run. Signed-off-by: Serge Hallyn Signed-off-by: Daniel Lezcano --- src/lxc/execute.c | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/lxc/execute.c b/src/lxc/execute.c index 8f428f179..0d52dbf10 100644 --- a/src/lxc/execute.c +++ b/src/lxc/execute.c @@ -21,10 +21,13 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include +#include #include #include #include + #include "log.h" #include "start.h" @@ -35,12 +38,42 @@ struct execute_args { int quiet; }; +/* historically lxc-init has been under /usr/lib/lxc. Now with + * multi-arch it can be under /usr/lib/$ARCH/lxc. Serge thinks + * it makes more sense to put it under /sbin. + * If /usr/lib/$ARCH/lxc exists and is used, then LXCINITDIR will + * point to it. + */ +static char *choose_init(void) +{ + char *retv = malloc(PATH_MAX); + int ret; + struct stat mystat; + if (!retv) + return NULL; + + snprintf(retv, PATH_MAX-1, LXCINITDIR "/lxc/lxc-init"); + ret = stat(retv, &mystat); + if (ret == 0) + return retv; + snprintf(retv, PATH_MAX-1, "/usr/lib/lxc/lxc-init"); + ret = stat(retv, &mystat); + if (ret == 0) + return retv; + snprintf(retv, PATH_MAX-1, "/sbin/lxc-init"); + ret = stat(retv, &mystat); + if (ret == 0) + return retv; + return NULL; +} + static int execute_start(struct lxc_handler *handler, void* data) { int j, i = 0; struct execute_args *my_args = data; char **argv; int argc = 0; + char *initpath; while (my_args->argv[argc++]); @@ -48,7 +81,12 @@ static int execute_start(struct lxc_handler *handler, void* data) if (!argv) return 1; - argv[i++] = LXCINITDIR "/lxc-init"; + initpath = choose_init(); + if (!initpath) { + ERROR("Failed to find an lxc-init"); + return 1; + } + argv[i++] = initpath; if (my_args->quiet) argv[i++] = "--quiet"; argv[i++] = "--"; -- 2.47.2