[lxc-devel] [PATCH] Use on_path to find init.lxc

Stéphane Graber stgraber at ubuntu.com
Fri Mar 28 20:40:22 UTC 2014


Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 src/lxc/conf.c    | 19 ++++++++++++++++---
 src/lxc/execute.c | 24 ++++++++++++++++++++++--
 src/lxc/utils.c   | 10 +++++-----
 src/lxc/utils.h   |  2 +-
 4 files changed, 44 insertions(+), 11 deletions(-)

diff --git a/src/lxc/conf.c b/src/lxc/conf.c
index e34e034..06235fb 100644
--- a/src/lxc/conf.c
+++ b/src/lxc/conf.c
@@ -3197,10 +3197,23 @@ int lxc_map_ids(struct lxc_list *idmap, pid_t pid)
 {
 	struct lxc_list *iterator;
 	struct id_map *map;
-	int ret = 0;
+	int ret = 0, use_shadow = 0;
 	enum idtype type;
-	char *buf = NULL, *pos;
-	int use_shadow = (on_path("newuidmap") && on_path("newgidmap"));
+	char *buf = NULL, *pos, *cmdpath = NULL;
+
+	cmdpath = on_path("newuidmap");
+	if (cmdpath) {
+		use_shadow = 1;
+		free(cmdpath);
+	}
+
+	if (!use_shadow) {
+		cmdpath = on_path("newgidmap");
+		if (cmdpath) {
+			use_shadow = 1;
+			free(cmdpath);
+		}
+	}
 
 	if (!use_shadow && geteuid()) {
 		ERROR("Missing newuidmap/newgidmap");
diff --git a/src/lxc/execute.c b/src/lxc/execute.c
index 9a84131..651c47d 100644
--- a/src/lxc/execute.c
+++ b/src/lxc/execute.c
@@ -30,6 +30,7 @@
 #include "conf.h"
 #include "log.h"
 #include "start.h"
+#include "utils.h"
 
 lxc_log_define(lxc_execute, lxc_start);
 
@@ -43,9 +44,27 @@ struct execute_args {
  */
 static char *choose_init(void)
 {
-	char *retv = malloc(PATH_MAX);
-	int ret;
+	char *retv = NULL;
+	int ret, env_set = 0;
 	struct stat mystat;
+
+	if (!getenv("PATH")) {
+		if (setenv("PATH", "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", 0))
+			SYSERROR("Failed to setenv");
+		env_set = 1;
+	}
+
+	retv = on_path("init.lxc");
+
+	if (env_set) {
+		if (unsetenv("PATH"))
+			SYSERROR("Failed to unsetenv");
+	}
+
+	if (retv)
+		return retv;
+
+	retv = malloc(PATH_MAX);
 	if (!retv)
 		return NULL;
 
@@ -54,6 +73,7 @@ static char *choose_init(void)
 		ERROR("pathname too long");
 		goto out1;
 	}
+
 	ret = stat(retv, &mystat);
 	if (ret == 0)
 		return retv;
diff --git a/src/lxc/utils.c b/src/lxc/utils.c
index ded8e8e..2fb3396 100644
--- a/src/lxc/utils.c
+++ b/src/lxc/utils.c
@@ -1274,7 +1274,7 @@ int detect_ramfs_rootfs(void)
 	return 0;
 }
 
-bool on_path(char *cmd) {
+char *on_path(char *cmd) {
 	char *path = NULL;
 	char *entry = NULL;
 	char *saveptr = NULL;
@@ -1283,11 +1283,11 @@ bool on_path(char *cmd) {
 
 	path = getenv("PATH");
 	if (!path)
-		return false;
+		return NULL;
 
 	path = strdup(path);
 	if (!path)
-		return false;
+		return NULL;
 
 	entry = strtok_r(path, ":", &saveptr);
 	while (entry) {
@@ -1298,7 +1298,7 @@ bool on_path(char *cmd) {
 
 		if (access(cmdpath, X_OK) == 0) {
 			free(path);
-			return true;
+			return strdup(cmdpath);
 		}
 
 next_loop:
@@ -1306,5 +1306,5 @@ next_loop:
 	}
 
 	free(path);
-	return false;
+	return NULL;
 }
diff --git a/src/lxc/utils.h b/src/lxc/utils.h
index a318ec8..b5e054c 100644
--- a/src/lxc/utils.h
+++ b/src/lxc/utils.h
@@ -279,4 +279,4 @@ uint64_t fnv_64a_buf(void *buf, size_t len, uint64_t hval);
 
 int detect_shared_rootfs(void);
 int detect_ramfs_rootfs(void);
-bool on_path(char *cmd);
+char *on_path(char *cmd);
-- 
1.9.1



More information about the lxc-devel mailing list