[lxc-devel] [PATCH] Use on_path to find init.lxc
Serge Hallyn
serge.hallyn at ubuntu.com
Sat Mar 29 02:22:07 UTC 2014
Quoting Stéphane Graber (stgraber at ubuntu.com):
> Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>
(just one bit of whining below)
> ---
> 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))
I don't know if standards say otherwise, but personally I don't like
having it check /usr/local before /. Often there's cruft in /usr/local
from development attempts.
> + 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
>
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel
More information about the lxc-devel
mailing list