[Lxc-users] [RFC PATCH] lxc-execute: search for valid init to run

Serge Hallyn serge.hallyn at canonical.com
Wed Apr 25 19:53:05 UTC 2012


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++] = "--";




More information about the lxc-users mailing list