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.

[ This has been tested in a ubuntu package based on the debian one,
  but I haven't yet tested it against lxc.git.  Note snprintf return
  values should be checked before this is committed. ]

Does this look reasonable?

Index: lxc-0.8.0~rc1/src/lxc/execute.c
===================================================================
--- lxc-0.8.0~rc1.orig/src/lxc/execute.c        2012-03-01 21:42:19.000000000 
+0000
+++ lxc-0.8.0~rc1/src/lxc/execute.c     2012-04-25 17:41:19.835015340 +0000
@@ -21,10 +21,13 @@
  * 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 @@
        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-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,10 @@
        if (!argv)
                return 1;
 
-       argv[i++] = LXCINITDIR "/lxc-init";
+       initpath = choose_init();
+    if (!initpath)
+        return 1;
+       argv[i++] = initpath;
        if (my_args->quiet)
                argv[i++] = "--quiet";
        argv[i++] = "--";

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Lxc-users mailing list
Lxc-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-users

Reply via email to