]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
Use on_path to find init.lxc
authorStéphane Graber <stgraber@ubuntu.com>
Fri, 28 Mar 2014 18:10:26 +0000 (14:10 -0400)
committerStéphane Graber <stgraber@ubuntu.com>
Mon, 31 Mar 2014 23:56:16 +0000 (19:56 -0400)
Signed-off-by: Stéphane Graber <stgraber@ubuntu.com>
Acked-by: Serge E. Hallyn <serge.hallyn@ubuntu.com>
src/lxc/conf.c
src/lxc/execute.c
src/lxc/utils.c
src/lxc/utils.h

index e34e034aade1165b66db09f965c58c860f059063..06235fb65365bc866e14659e99ad58be5a2de5b3 100644 (file)
@@ -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");
index 9a84131a4f14dbf6463d3820f5250eac2fbf2b4f..651c47d990e2253aa3bf340050d8f460d3f4016f 100644 (file)
@@ -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;
index ded8e8eec535467ffa8c1479bf7e0b2c3110c1ed..2fb339600dfb5fc9d3647ae387764077b080f7fa 100644 (file)
@@ -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;
 }
index a318ec86857ef78511398c3f09e90f69edcb79e2..b5e054cca30ea5bcec9198a3ef9fd7ac60190d99 100644 (file)
@@ -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);