]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
Set default paths for unprivileged use (v2)
authorStéphane Graber <stgraber@ubuntu.com>
Fri, 20 Dec 2013 13:28:32 +0000 (14:28 +0100)
committerSerge Hallyn <serge.hallyn@ubuntu.com>
Mon, 23 Dec 2013 16:16:07 +0000 (10:16 -0600)
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@ubuntu.com>
Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
src/lxc/utils.c

index 785f3e6b072bb3e3e0e0248fb01f610b7ccb933a..832dbe5befd05bbc925b6bd4048cff6591ddf32c 100644 (file)
@@ -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... */