From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> * src/util/virauth.c, src/util/virauth.h: Add virAuthGetConfigFilePath * include/libvirt/virterror.h, src/util/virterror.c: Add VIR_FROM_AUTH error domain --- include/libvirt/virterror.h | 1 + src/libvirt_private.syms | 1 + src/util/virauth.c | 74 +++++++++++++++++++++++++++++++++++++++++++ src/util/virauth.h | 3 ++ src/util/virterror.c | 3 ++ 5 files changed, 82 insertions(+), 0 deletions(-) diff --git a/include/libvirt/virterror.h b/include/libvirt/virterror.h index c8ec8d4..e04d29e 100644 --- a/include/libvirt/virterror.h +++ b/include/libvirt/virterror.h @@ -86,6 +86,7 @@ typedef enum { VIR_FROM_HYPERV = 43, /* Error from Hyper-V driver */ VIR_FROM_CAPABILITIES = 44, /* Error from capabilities */ VIR_FROM_URI = 45, /* Error from URI handling */ + VIR_FROM_AUTH = 46, /* Error from auth handling */ } virErrorDomain; diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 07302cd..6f53aa8 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1168,6 +1168,7 @@ virUUIDParse; # virauth.h virAuthGetUsername; virAuthGetPassword; +virAuthGetConfigFilePath; # viraudit.h diff --git a/src/util/virauth.c b/src/util/virauth.c index d7375e9..150b8e7 100644 --- a/src/util/virauth.c +++ b/src/util/virauth.c @@ -21,9 +21,83 @@ #include <config.h> +#include <stdlib.h> + #include "virauth.h" #include "util.h" #include "memory.h" +#include "logging.h" +#include "datatypes.h" +#include "virterror_internal.h" +#include "configmake.h" + +#define VIR_FROM_THIS VIR_FROM_AUTH + + +int virAuthGetConfigFilePath(virConnectPtr conn, + char **path) +{ + int ret = -1; + size_t i; + const char *authenv = getenv("LIBVIRT_AUTH_FILE"); + char *userdir = NULL; + + *path = NULL; + + VIR_DEBUG("Determining auth config file path"); + + if (authenv) { + VIR_DEBUG("Using path from env '%s'", authenv); + if (!(*path = strdup(authenv))) + goto no_memory; + return 0; + } + + for (i = 0 ; i < conn->uri->paramsCount ; i++) { + if (STREQ_NULLABLE(conn->uri->params[i].name, "authfile") && + conn->uri->params[i].value) { + VIR_DEBUG("Using path from URI '%s'", + conn->uri->params[i].value); + if (!(*path = strdup(conn->uri->params[i].value))) + goto no_memory; + return 0; + } + } + + if (!(userdir = virGetUserDirectory(geteuid()))) + goto cleanup; + + if (virAsprintf(path, "%s/.libvirt/auth.conf", userdir) < 0) + goto no_memory; + + VIR_DEBUG("Checking for readability of '%s'", *path); + if (access(*path, R_OK) == 0) + goto done; + + VIR_FREE(*path); + + if (!(*path = strdup(SYSCONFDIR "/libvirt/auth.conf"))) + goto no_memory; + + VIR_DEBUG("Checking for readability of '%s'", *path); + if (access(*path, R_OK) == 0) + goto done; + + VIR_FREE(*path); + +done: + ret = 0; + + VIR_DEBUG("Using auth file '%s'", NULLSTR(*path)); +cleanup: + VIR_FREE(userdir); + + return ret; + +no_memory: + virReportOOMError(); + goto cleanup; +} char * diff --git a/src/util/virauth.h b/src/util/virauth.h index 8856701..7f43bee 100644 --- a/src/util/virauth.h +++ b/src/util/virauth.h @@ -24,6 +24,9 @@ # include "internal.h" +int virAuthGetConfigFilePath(virConnectPtr conn, + char **path); + char *virAuthGetUsername(virConnectAuthPtr auth, const char *defaultUsername, const char *hostname); char *virAuthGetPassword(virConnectAuthPtr auth, const char *username, diff --git a/src/util/virterror.c b/src/util/virterror.c index e1fe522..9dc40a8 100644 --- a/src/util/virterror.c +++ b/src/util/virterror.c @@ -181,6 +181,9 @@ static const char *virErrorDomainName(virErrorDomain domain) { case VIR_FROM_URI: dom = "URI "; break; + case VIR_FROM_AUTH: + dom = "Auth "; + break; } return(dom); } -- 1.7.7.6 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list