[lxc-devel] [PATCH] Set default paths for unprivileged use (v2)
Serge Hallyn
serge.hallyn at ubuntu.com
Mon Dec 23 16:13:40 UTC 2013
Quoting Stéphane Graber (stgraber at ubuntu.com):
> When running unprivileged (euid != 0), LXC will now use the following paths:
> - Default lxc path: ~/.local/share/lxc/
> - Default config path: ~/.config/lxc/lxc.conf
>
> Those two paths are based on standard XDG paths (though ignoring all the
> possible override paths for now at least) and so probably don't need to
> be configurable at build time.
>
> Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>
> ---
> src/lxc/utils.c | 43 ++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 40 insertions(+), 3 deletions(-)
>
> diff --git a/src/lxc/utils.c b/src/lxc/utils.c
> index 785f3e6..832dbe5 100644
> --- a/src/lxc/utils.c
> +++ b/src/lxc/utils.c
> @@ -248,11 +248,36 @@ const char *lxc_global_config_value(const char *option_name)
> { "lvm_vg", DEFAULT_VG },
> { "lvm_thin_pool", DEFAULT_THIN_POOL },
> { "zfsroot", DEFAULT_ZFSROOT },
> - { "lxcpath", LXCPATH },
> + { "lxcpath", NULL },
> { "cgroup.pattern", DEFAULT_CGROUP_PATTERN },
> { "cgroup.use", NULL },
> { NULL, NULL },
> };
> +
> + char *user_config_path = NULL;
> + char *user_lxc_path = NULL;
> + char *user_home = NULL;
> +
> + if (geteuid() > 0) {
> + user_home = getenv("HOME");
> + if (user_home)
> + user_home = strdup(user_home);
> + else
> + user_home = "/";
> +
> + user_config_path = malloc(sizeof(char) * (22 + strlen(user_home)));
> + user_lxc_path = malloc(sizeof(char) * (19 + strlen(user_home)));
> +
> + sprintf(user_config_path, "%s/.config/lxc/lxc.conf", user_home);
> + sprintf(user_lxc_path, "%s/.local/share/lxc/", user_home);
> +
> + free(user_home);
> + }
> + else {
> + user_config_path = strdup(LXC_GLOBAL_CONF);
> + user_lxc_path = strdup(LXCPATH);
> + }
> +
> /* placed in the thread local storage pool */
> static __thread const char *values[sizeof(options) / sizeof(options[0])] = { 0 };
> const char *(*ptr)[2];
> @@ -266,17 +291,23 @@ const char *lxc_global_config_value(const char *option_name)
> break;
> }
> if (!(*ptr)[0]) {
> + free(user_config_path);
> + free(user_lxc_path);
> errno = EINVAL;
> return NULL;
> }
>
> if (values[i]) {
> + free(user_config_path);
> + free(user_lxc_path);
> value = values[i];
> +
> return value;
> }
>
> process_lock();
> - fin = fopen_cloexec(LXC_GLOBAL_CONF, "r");
> + fin = fopen_cloexec(user_config_path, "r");
> + free(user_config_path);
> process_unlock();
> if (fin) {
> while (fgets(buf, 1024, fin)) {
> @@ -311,11 +342,17 @@ const char *lxc_global_config_value(const char *option_name)
> if (!*p)
> continue;
> values[i] = copy_global_config_value(p);
> + free(user_lxc_path);
> goto out;
> }
> }
> /* could not find value, use default */
> - values[i] = (*ptr)[1];
> + if (strcmp(option_name, "lxcpath") == 0)
> + values[i] = user_lxc_path;
> + else {
> + free(user_lxc_path);
> + values[i] = (*ptr)[1];
> + }
> /* special case: if default value is NULL,
> * and there is no config, don't view that
> * as an error... */
> --
> 1.8.5.2
>
> _______________________________________________
> 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