
On 09/12/2013 11:53 AM, Martin Kletzander wrote:
Currently, we have two configuration file paths, one global (where "global" means root-only and we're probably not changing this in near future) and one per-user. Unfortunately root user cannot use the second option because until now we were choosing the file path depending only on whether the user is root or not.
This patch modifies the mentioned behavior for root only, allowing him to set his own configuration files without changing anything in system-wide configuration folders.
This also makes the virsh-uriprecedence test pass its first test case when ran as root.
Signed-off-by: Martin Kletzander <mkletzan@redhat.com> ---
Notes: I'm playing along previously mentioned "proper behavior" in this patch. However, IMNSHO, our "global" or "system-wide" configuration file (defaulting to '/etc/libvirt/libvirt.conf') should be accessible for all users since this has no security impact (security information may be in files 'libvirtd.conf' or 'qemu.conf'). This file should be also read and used for all users. After that, settings in user configuration file (defaulting to '~/.config/libvirt/libvirt.conf') may override some of these settings for that user.
This is how all sensible configurations are loaded and that's also what I'd prefer. Unfortunately some developers feels this should be done in completely different way.
src/libvirt.c | 56 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 20 deletions(-)
If someone doesn't like the 'bool global' parameter, I'm fine with splitting the functions. If mentioned with an ACK, I'll squash this in: diff --git a/src/libvirt.c b/src/libvirt.c index bfc466b..927868f 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -961,25 +961,31 @@ error: * Return code 0 means no error, but doesn't guarantee path != NULL. */ static int -virConnectGetConfigFilePath(char **path, bool global) +virConnectGetGlobalConfigFilePath(char **path) { - char *userdir = NULL; - int ret = -1; *path = NULL; /* Don't provide the global configuration file to non-root users */ - if (geteuid() != 0 && global) + if (geteuid() != 0) return 0; - if (global) { - if (virAsprintf(path, "%s/libvirt/libvirt.conf", - SYSCONFDIR) < 0) - goto cleanup; - } else { - if (!(userdir = virGetUserConfigDirectory()) || - virAsprintf(path, "%s/libvirt.conf", userdir) < 0) - goto cleanup; - } + if (virAsprintf(path, "%s/libvirt/libvirt.conf", + SYSCONFDIR) < 0) + return -1; + + return 0; +} + +static int +virConnectGetUserConfigFilePath(char **path) +{ + char *userdir = NULL; + int ret = -1; + *path = NULL; + + if (!(userdir = virGetUserConfigDirectory()) || + virAsprintf(path, "%s/libvirt.conf", userdir) < 0) + goto cleanup; ret = 0; cleanup: @@ -996,14 +1002,14 @@ virConnectGetConfigFile(virConfPtr *conf) *conf = NULL; /* Try reading user configuration file unconditionally */ - if (virConnectGetConfigFilePath(&filename, false) < 0) + if (virConnectGetUserConfigFilePath(&filename) < 0) goto cleanup; if (!virFileExists(filename)) { /* and in case there is none, try the global one. */ VIR_FREE(filename); - if (virConnectGetConfigFilePath(&filename, true) < 0) + if (virConnectGetGlobalConfigFilePath(&filename) < 0) goto cleanup; if (!filename || -- Martin