[lxc-devel] [PATCH] Set default paths for unprivileged use

Stéphane Graber stgraber at ubuntu.com
Thu Dec 19 22:19:51 UTC 2013


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>
---
 src/lxc/utils.c | 37 ++++++++++++++++++++++++++++++++++---
 1 file changed, 34 insertions(+), 3 deletions(-)

diff --git a/src/lxc/utils.c b/src/lxc/utils.c
index 785f3e6..9fd91b7 100644
--- a/src/lxc/utils.c
+++ b/src/lxc/utils.c
@@ -39,6 +39,7 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <assert.h>
+#include <wordexp.h>
 
 #ifndef HAVE_GETLINE
 #ifdef HAVE_FGETLN
@@ -248,11 +249,30 @@ 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;
+	char *user_lxc_path;
+	wordexp_t exp;
+
+	if (geteuid() > 0) {
+		wordexp("~/.config/lxc/lxc.conf", &exp, 0);
+		user_config_path = strdup(exp.we_wordv[0]);
+		wordfree(&exp);
+
+		wordexp("~/.local/share/lxc/", &exp, 0);
+		user_lxc_path = strdup(exp.we_wordv[0]);
+		wordfree(&exp);
+	}
+	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 +286,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)) {
@@ -315,7 +341,12 @@ const char *lxc_global_config_value(const char *option_name)
 		}
 	}
 	/* could not find value, use default */
-	values[i] = (*ptr)[1];
+	if (strcmp(option_name, "lxcpath") == 0)
+		values[i] = user_lxc_path;
+	else {
+		free(user_config_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



More information about the lxc-devel mailing list