On 2012年03月21日 01:33, Daniel P. Berrange wrote:
From: "Daniel P. Berrange"<berrange(a)redhat.com>
* 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;
virAuthGetConfigFilePath;
virAuthGetPassword;
virAuthGetUsername;
# 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);
*path will be NULL if the last choice of authfile (e.g.
/etc/libvirt/auth.conf) is not readable, while the function
will return 0.
ACK with this fixed.