From 4878dac496543dae0a26f5c1156bbfda63c8ea62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= Date: Fri, 20 Dec 2013 14:28:32 +0100 Subject: [PATCH] Set default paths for unprivileged use (v2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Serge Hallyn --- 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 785f3e6b0..832dbe5be 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... */