]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
lxc-execute: find lxc-init
authorSerge Hallyn <serge.hallyn@ubuntu.com>
Tue, 31 Jul 2012 14:04:33 +0000 (16:04 +0200)
committerDaniel Lezcano <daniel.lezcano@free.fr>
Tue, 31 Jul 2012 14:04:33 +0000 (16:04 +0200)
lxc-init used to be under /usr/lib/lxc.  Now it is under
/usr/lib/<multiarch>/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 <serge.hallyn@ubuntu.com>
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
src/lxc/execute.c

index 8f428f179ecdbba532225c8f1465b0c80e46dcb7..0d52dbf101a21bcb373994a9f5708b7eda57a6c7 100644 (file)
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  */
 
+#include <sys/types.h>
+#include <sys/stat.h>
 #include <errno.h>
 #include <unistd.h>
 #include <stdlib.h>
 
+
 #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++] = "--";