aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorWilliam Jon McCann <william.jon.mccann@gmail.com>2012-05-03 12:36:27 -0400
committerDaniel P. Berrange <berrange@redhat.com>2012-05-14 15:15:58 +0100
commit32a9aac2e04c991340b66c855a1095e4e6445e54 (patch)
tree8eed8200e2fcaffe072607456290ac5d68d9b089 /src
parentRelease of libvirt-0.9.12 (diff)
downloadlibvirt-32a9aac2e04c991340b66c855a1095e4e6445e54.tar.gz
libvirt-32a9aac2e04c991340b66c855a1095e4e6445e54.tar.bz2
libvirt-32a9aac2e04c991340b66c855a1095e4e6445e54.zip
Use XDG Base Directories instead of storing in home directory
As defined in: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html This offers a number of advantages: * Allows sharing a home directory between different machines, or sessions (eg. using NFS) * Cleanly separates cache, runtime (eg. sockets), or app data from user settings * Supports performing smart or selective migration of settings between different OS versions * Supports reseting settings without breaking things * Makes it possible to clear cache data to make room when the disk is filling up * Allows us to write a robust and efficient backup solution * Allows an admin flexibility to change where data and settings are stored * Dramatically reduces the complexity and incoherence of the system for administrators
Diffstat (limited to 'src')
-rw-r--r--src/libvirt.c4
-rw-r--r--src/libvirt_private.syms4
-rw-r--r--src/network/bridge_driver.c8
-rw-r--r--src/nwfilter/nwfilter_driver.c11
-rw-r--r--src/qemu/qemu_driver.c32
-rw-r--r--src/remote/remote_driver.c4
-rw-r--r--src/remote/remote_driver.h2
-rw-r--r--src/secret/secret_driver.c11
-rw-r--r--src/storage/storage_driver.c13
-rw-r--r--src/uml/uml_driver.c10
-rw-r--r--src/util/util.c62
-rw-r--r--src/util/util.h4
-rw-r--r--src/util/virauth.c4
13 files changed, 115 insertions, 54 deletions
diff --git a/src/libvirt.c b/src/libvirt.c
index cfd77114a..22fc863a7 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -969,11 +969,11 @@ virConnectGetConfigFilePath(void)
SYSCONFDIR) < 0)
goto no_memory;
} else {
- char *userdir = virGetUserDirectory(geteuid());
+ char *userdir = virGetUserConfigDirectory(geteuid());
if (!userdir)
goto error;
- if (virAsprintf(&path, "%s/.libvirt/libvirt.conf",
+ if (virAsprintf(&path, "%s/libvirt.conf",
userdir) < 0) {
VIR_FREE(userdir);
goto no_memory;
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index afb308d90..7d09f3343 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1116,6 +1116,7 @@ virFileFindMountPoint;
virFileHasSuffix;
virFileIsExecutable;
virFileIsLink;
+virFileIsDir;
virFileLinkPointsTo;
virFileLock;
virFileMakePath;
@@ -1136,6 +1137,9 @@ virGetGroupID;
virGetGroupName;
virGetHostname;
virGetUserDirectory;
+virGetUserConfigDirectory;
+virGetUserCacheDirectory;
+virGetUserRuntimeDirectory;
virGetUserID;
virGetUserName;
virHexToBin;
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index d82212f91..cea87c244 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -280,18 +280,20 @@ networkStartup(int privileged) {
if ((base = strdup (SYSCONFDIR "/libvirt")) == NULL)
goto out_of_memory;
} else {
- char *userdir = virGetUserDirectory(uid);
+ char *userdir = virGetUserCacheDirectory(uid);
if (!userdir)
goto error;
if (virAsprintf(&driverState->logDir,
- "%s/.libvirt/qemu/log", userdir) == -1) {
+ "%s/qemu/log", userdir) == -1) {
VIR_FREE(userdir);
goto out_of_memory;
}
+ VIR_FREE(userdir);
- if (virAsprintf(&base, "%s/.libvirt", userdir) == -1) {
+ userdir = virGetUserConfigDirectory(uid);
+ if (virAsprintf(&base, "%s", userdir) == -1) {
VIR_FREE(userdir);
goto out_of_memory;
}
diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c
index ffb4b5df7..3d732ab12 100644
--- a/src/nwfilter/nwfilter_driver.c
+++ b/src/nwfilter/nwfilter_driver.c
@@ -87,16 +87,9 @@ nwfilterDriverStartup(int privileged) {
goto out_of_memory;
} else {
uid_t uid = geteuid();
- char *userdir = virGetUserDirectory(uid);
-
- if (!userdir)
+ base = virGetUserConfigDirectory(uid);
+ if (!base)
goto error;
-
- if (virAsprintf(&base, "%s/.libvirt", userdir) == -1) {
- VIR_FREE(userdir);
- goto out_of_memory;
- }
- VIR_FREE(userdir);
}
if (virAsprintf(&driverState->configDir,
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 385b8615d..9e55cb193 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -520,28 +520,38 @@ qemudStartup(int privileged) {
goto out_of_memory;
} else {
uid_t uid = geteuid();
- char *userdir = virGetUserDirectory(uid);
- if (!userdir)
+ char *rundir;
+ char *cachedir;
+
+ cachedir = virGetUserCacheDirectory(uid);
+ if (!cachedir)
goto error;
if (virAsprintf(&qemu_driver->logDir,
- "%s/.libvirt/qemu/log", userdir) == -1) {
- VIR_FREE(userdir);
+ "%s/qemu/log", cachedir) == -1) {
+ VIR_FREE(cachedir);
goto out_of_memory;
}
-
- if (virAsprintf(&base, "%s/.libvirt", userdir) == -1) {
- VIR_FREE(userdir);
+ if (virAsprintf(&qemu_driver->cacheDir, "%s/qemu/cache", cachedir) == -1) {
+ VIR_FREE(cachedir);
goto out_of_memory;
}
- VIR_FREE(userdir);
+ VIR_FREE(cachedir);
- if (virAsprintf(&qemu_driver->stateDir, "%s/qemu/run", base) == -1)
+ rundir = virGetUserRuntimeDirectory(uid);
+ if (!rundir)
+ goto error;
+ if (virAsprintf(&qemu_driver->stateDir, "%s/qemu/run", rundir) == -1) {
+ VIR_FREE(rundir);
goto out_of_memory;
+ }
+ VIR_FREE(rundir);
+
+ base = virGetUserConfigDirectory(uid);
+ if (!base)
+ goto error;
if (virAsprintf(&qemu_driver->libDir, "%s/qemu/lib", base) == -1)
goto out_of_memory;
- if (virAsprintf(&qemu_driver->cacheDir, "%s/qemu/cache", base) == -1)
- goto out_of_memory;
if (virAsprintf(&qemu_driver->saveDir, "%s/qemu/save", base) == -1)
goto out_of_memory;
if (virAsprintf(&qemu_driver->snapshotDir, "%s/qemu/snapshot", base) == -1)
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index 7863b73e3..4a9299a5e 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -578,12 +578,12 @@ doRemoteOpen (virConnectPtr conn,
case trans_unix:
if (!sockname) {
if (flags & VIR_DRV_OPEN_REMOTE_USER) {
- char *userdir = virGetUserDirectory(getuid());
+ char *userdir = virGetUserRuntimeDirectory(getuid());
if (!userdir)
goto failed;
- if (virAsprintf(&sockname, "@%s" LIBVIRTD_USER_UNIX_SOCKET, userdir) < 0) {
+ if (virAsprintf(&sockname, "@%s/" LIBVIRTD_USER_UNIX_SOCKET, userdir) < 0) {
VIR_FREE(userdir);
goto out_of_memory;
}
diff --git a/src/remote/remote_driver.h b/src/remote/remote_driver.h
index 1504eecc6..aca94125f 100644
--- a/src/remote/remote_driver.h
+++ b/src/remote/remote_driver.h
@@ -37,7 +37,7 @@ unsigned long remoteVersion(void);
# define LIBVIRTD_TCP_PORT "16509"
# define LIBVIRTD_PRIV_UNIX_SOCKET LOCALSTATEDIR "/run/libvirt/libvirt-sock"
# define LIBVIRTD_PRIV_UNIX_SOCKET_RO LOCALSTATEDIR "/run/libvirt/libvirt-sock-ro"
-# define LIBVIRTD_USER_UNIX_SOCKET "/.libvirt/libvirt-sock"
+# define LIBVIRTD_USER_UNIX_SOCKET "libvirt-sock"
# define LIBVIRTD_CONFIGURATION_FILE SYSCONFDIR "/libvirtd.conf"
/* Defaults for PKI directory. */
diff --git a/src/secret/secret_driver.c b/src/secret/secret_driver.c
index 088a2431c..f3fcce233 100644
--- a/src/secret/secret_driver.c
+++ b/src/secret/secret_driver.c
@@ -1013,16 +1013,9 @@ secretDriverStartup(int privileged)
goto out_of_memory;
} else {
uid_t uid = geteuid();
- char *userdir = virGetUserDirectory(uid);
-
- if (!userdir)
+ base = virGetUserConfigDirectory(uid);
+ if (!base)
goto error;
-
- if (virAsprintf(&base, "%s/.libvirt", userdir) == -1) {
- VIR_FREE(userdir);
- goto out_of_memory;
- }
- VIR_FREE(userdir);
}
if (virAsprintf(&driverState->directory, "%s/secrets", base) == -1)
goto out_of_memory;
diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
index f23ec7e02..fd762c044 100644
--- a/src/storage/storage_driver.c
+++ b/src/storage/storage_driver.c
@@ -146,19 +146,12 @@ storageDriverStartup(int privileged)
goto out_of_memory;
} else {
uid_t uid = geteuid();
- char *userdir = virGetUserDirectory(uid);
-
- if (!userdir)
+ base = virGetUserConfigDirectory(uid);
+ if (!base)
goto error;
-
- if (virAsprintf(&base, "%s/.libvirt", userdir) == -1) {
- VIR_FREE(userdir);
- goto out_of_memory;
- }
- VIR_FREE(userdir);
}
- /* Configuration paths are either ~/.libvirt/storage/... (session) or
+ /* Configuration paths are either $USER_CONFIG_HOME/libvirt/storage/... (session) or
* /etc/libvirt/storage/... (system).
*/
if (virAsprintf(&driverState->configDir,
diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
index 4e640ff67..8a39d734f 100644
--- a/src/uml/uml_driver.c
+++ b/src/uml/uml_driver.c
@@ -434,12 +434,12 @@ umlStartup(int privileged)
"%s/run/libvirt/uml-guest", LOCALSTATEDIR) == -1)
goto out_of_memory;
} else {
+ base = virGetUserConfigDirectory(uid);
+ if (!base)
+ goto error;
if (virAsprintf(&uml_driver->logDir,
- "%s/.libvirt/uml/log", userdir) == -1)
- goto out_of_memory;
-
- if (virAsprintf(&base, "%s/.libvirt", userdir) == -1)
+ "%s/uml/log", base) == -1)
goto out_of_memory;
if (virAsprintf(&uml_driver->monitorDir,
@@ -447,7 +447,7 @@ umlStartup(int privileged)
goto out_of_memory;
}
- /* Configuration paths are either ~/.libvirt/uml/... (session) or
+ /* Configuration paths are either $XDG_CONFIG_HOME/libvirt/uml/... (session) or
* /etc/libvirt/uml/... (system).
*/
if (virAsprintf(&uml_driver->configDir, "%s/uml", base) == -1)
diff --git a/src/util/util.c b/src/util/util.c
index 48358b233..ec55118cd 100644
--- a/src/util/util.c
+++ b/src/util/util.c
@@ -665,6 +665,12 @@ char *virFindFileInPath(const char *file)
return fullpath;
}
+bool virFileIsDir(const char *path)
+{
+ struct stat s;
+ return (stat (path, &s) == 0) && S_ISDIR (s.st_mode);
+}
+
bool virFileExists(const char *path)
{
return access(path, F_OK) == 0;
@@ -2304,6 +2310,62 @@ char *virGetUserDirectory(uid_t uid)
return virGetUserEnt(uid, VIR_USER_ENT_DIRECTORY);
}
+static char *virGetXDGDirectory(uid_t uid, const char *xdgenvname, const char *xdgdefdir)
+{
+ const char *path = NULL;
+ char *ret = NULL;
+ char *home = virGetUserEnt(uid, VIR_USER_ENT_DIRECTORY);
+
+ if (uid == getuid())
+ path = getenv(xdgenvname);
+
+ if (path && path[0]) {
+ if (virAsprintf(&ret, "%s/libvirt/", path) < 0)
+ goto no_memory;
+ } else {
+ if (virAsprintf(&ret, "%s/%s/libvirt/", home, xdgdefdir) < 0)
+ goto no_memory;
+ }
+
+ cleanup:
+ VIR_FREE(home);
+ return ret;
+ no_memory:
+ virReportOOMError();
+ goto cleanup;
+}
+
+char *virGetUserConfigDirectory(uid_t uid)
+{
+ return virGetXDGDirectory(uid, "XDG_CONFIG_HOME", ".config");
+}
+
+char *virGetUserCacheDirectory(uid_t uid)
+{
+ return virGetXDGDirectory(uid, "XDG_CACHE_HOME", ".cache");
+}
+
+char *virGetUserRuntimeDirectory(uid_t uid)
+{
+ const char *path = NULL;
+
+ if (uid == getuid ())
+ path = getenv("XDG_RUNTIME_DIR");
+
+ if (!path || !path[0]) {
+ return virGetUserCacheDirectory(uid);
+ } else {
+ char *ret;
+
+ if (virAsprintf(&ret, "%s/libvirt/", path) < 0) {
+ virReportOOMError();
+ return NULL;
+ }
+
+ return ret;
+ }
+}
+
char *virGetUserName(uid_t uid)
{
return virGetUserEnt(uid, VIR_USER_ENT_NAME);
diff --git a/src/util/util.h b/src/util/util.h
index 85e8bd66f..f5fa87659 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -85,6 +85,7 @@ int virFileIsLink(const char *linkpath)
char *virFindFileInPath(const char *file);
+bool virFileIsDir (const char *file) ATTRIBUTE_NONNULL(1);
bool virFileExists(const char *file) ATTRIBUTE_NONNULL(1);
bool virFileIsExecutable(const char *file) ATTRIBUTE_NONNULL(1);
@@ -228,6 +229,9 @@ char *virGetHostname(virConnectPtr conn);
int virKillProcess(pid_t pid, int sig);
char *virGetUserDirectory(uid_t uid);
+char *virGetUserConfigDirectory(uid_t uid);
+char *virGetUserCacheDirectory(uid_t uid);
+char *virGetUserRuntimeDirectory(uid_t uid);
char *virGetUserName(uid_t uid);
char *virGetGroupName(gid_t gid);
int virGetUserID(const char *name,
diff --git a/src/util/virauth.c b/src/util/virauth.c
index c59c55adc..92ecb7c18 100644
--- a/src/util/virauth.c
+++ b/src/util/virauth.c
@@ -65,10 +65,10 @@ int virAuthGetConfigFilePath(virConnectPtr conn,
}
}
- if (!(userdir = virGetUserDirectory(geteuid())))
+ if (!(userdir = virGetUserConfigDirectory(geteuid())))
goto cleanup;
- if (virAsprintf(path, "%s/.libvirt/auth.conf", userdir) < 0)
+ if (virAsprintf(path, "%s/auth.conf", userdir) < 0)
goto no_memory;
VIR_DEBUG("Checking for readability of '%s'", *path);