Description: 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.
Author: Serge Hallyn <serge.hallyn@ubuntu.com>
Forwarded: yes

Index: lxc-0.8.0~rc1/src/lxc/execute.c
===================================================================
--- lxc-0.8.0~rc1.orig/src/lxc/execute.c	2012-04-25 14:15:50.929101176 -0500
+++ lxc-0.8.0~rc1/src/lxc/execute.c	2012-04-25 17:39:49.174409120 -0500
@@ -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,12 @@
 	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++] = "--";
