From: Stéphane Graber Date: Fri, 28 Mar 2014 18:10:26 +0000 (-0400) Subject: Use on_path to find init.lxc X-Git-Tag: lxc-1.1.0.alpha1~182 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8afb3e612ee8bd0e52560af8a2b0022809f724c9;p=thirdparty%2Flxc.git Use on_path to find init.lxc Signed-off-by: Stéphane Graber Acked-by: Serge E. Hallyn --- diff --git a/src/lxc/conf.c b/src/lxc/conf.c index e34e034aa..06235fb65 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 9a84131a4..651c47d99 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 ded8e8eec..2fb339600 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 a318ec868..b5e054cca 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);