[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