From: Serge Hallyn Date: Mon, 22 Jul 2013 19:09:19 +0000 (-0500) Subject: lxclock: use XDG_RUNTIME_DIR for lock if appropriate (v2) X-Git-Tag: lxc-1.0.0.alpha1~1^2~110 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=469b57873977afcb5d9f5adb00097c944caedd2a;p=thirdparty%2Flxc.git lxclock: use XDG_RUNTIME_DIR for lock if appropriate (v2) If we are euid==0 or XDG_RUNTIME_DIR is not set, then use /run/lock/lxc/$lxcpath/$lxcname as before. Otherwise, use $XDG_RUNTIME_DIR/lock/lxc/$lxcpath/$lxcname. Signed-off-by: Serge Hallyn Cc: Stéphane Graber Acked-by: Stéphane Graber --- diff --git a/src/lxc/lxclock.c b/src/lxc/lxclock.c index 31bedd8ab..43e76fa73 100644 --- a/src/lxc/lxclock.c +++ b/src/lxc/lxclock.c @@ -24,6 +24,8 @@ #include #include #include +#define _GNU_SOURCE +#include #include #include #include @@ -40,14 +42,29 @@ pthread_mutex_t thread_mutex = PTHREAD_MUTEX_INITIALIZER; static char *lxclock_name(const char *p, const char *n) { int ret; - // /run/lock/lxc/$lxcpath/$lxcname + '\0' - int len = strlen(p) + strlen(n) + strlen("/run/lock/lxc/") + 2; - char *dest = malloc(len); + int len; + char *dest; + const char *rundir; struct stat sb; - if (!dest) + /* lockfile will be: + * "/run" + "/lock/lxc/$lxcpath/$lxcname + '\0' if root + * or + * $XDG_RUNTIME_DIR + "/lock/lxc/$lxcpath/$lxcname + '\0' if non-root + */ + + /* length of "/lock/lxc/" + $lxcpath + "/" + $lxcname + '\0' */ + len = strlen("/lock/lxc/") + strlen(n) + strlen(p) + 2; + rundir = getenv("XDG_RUNTIME_DIR"); + if (geteuid() == 0 || rundir == NULL) + rundir = "/run"; + + len += strlen(rundir); + + if ((dest = malloc(len)) == NULL) return NULL; - ret = snprintf(dest, len, "/run/lock/lxc/%s", p); + + ret = snprintf(dest, len, "%s/lock/lxc/%s", rundir, p); if (ret < 0 || ret >= len) { free(dest); return NULL; @@ -69,7 +86,7 @@ static char *lxclock_name(const char *p, const char *n) ERROR("Failed to set mode for lockdir %s\n", dest); } - ret = snprintf(dest, len, "/run/lock/lxc/%s/%s", p, n); + ret = snprintf(dest, len, "%s/lock/lxc/%s/%s", rundir, p, n); if (ret < 0 || ret >= len) { free(dest); return NULL;