From: Serge Hallyn Date: Tue, 31 Jul 2012 14:04:33 +0000 (+0200) Subject: lxc-execute: find lxc-init X-Git-Tag: lxc-0.8.0~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a0a2066d;p=thirdparty%2Flxc.git 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 --- 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++] = "--";