43fe83
From 4e04f5df15242cceaba6c60992cfb2347afee457 Mon Sep 17 00:00:00 2001
43fe83
Message-Id: <4e04f5df15242cceaba6c60992cfb2347afee457.1377873638.git.jdenemar@redhat.com>
43fe83
From: Dan Walsh <dwalsh@redhat.com>
43fe83
Date: Tue, 13 Aug 2013 15:20:39 +0100
43fe83
Subject: [PATCH] util: add virGetUserDirectoryByUID
43fe83
43fe83
For https://bugzilla.redhat.com/show_bug.cgi?id=988491
43fe83
43fe83
This function is needed for virt-login-shell.  Also modify virGirUserDirectory
43fe83
to use the new function, to simplify the code.
43fe83
43fe83
Signed-off-by: Eric Blake <eblake@redhat.com>
43fe83
(cherry picked from commit fbd7682706d52445fbc0f6fa1c4b7965256e733f)
43fe83
---
43fe83
 src/libvirt_private.syms |  1 +
43fe83
 src/util/virutil.c       | 22 ++++++++++++++++++----
43fe83
 src/util/virutil.h       |  1 +
43fe83
 3 files changed, 20 insertions(+), 4 deletions(-)
43fe83
43fe83
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
43fe83
index 9cfb84c..faa67ad 100644
43fe83
--- a/src/libvirt_private.syms
43fe83
+++ b/src/libvirt_private.syms
43fe83
@@ -2047,6 +2047,7 @@ virGetUnprivSGIOSysfsPath;
43fe83
 virGetUserCacheDirectory;
43fe83
 virGetUserConfigDirectory;
43fe83
 virGetUserDirectory;
43fe83
+virGetUserDirectoryByUID;
43fe83
 virGetUserID;
43fe83
 virGetUserName;
43fe83
 virGetUserRuntimeDirectory;
43fe83
diff --git a/src/util/virutil.c b/src/util/virutil.c
43fe83
index adcdb3c..3abcd53 100644
43fe83
--- a/src/util/virutil.c
43fe83
+++ b/src/util/virutil.c
43fe83
@@ -647,6 +647,14 @@ cleanup:
43fe83
     return result;
43fe83
 }
43fe83
 
43fe83
+
43fe83
+char *
43fe83
+virGetUserDirectory(void)
43fe83
+{
43fe83
+    return virGetUserDirectoryByUID(geteuid());
43fe83
+}
43fe83
+
43fe83
+
43fe83
 #ifdef HAVE_GETPWUID_R
43fe83
 /* Look up fields from the user database for the given user.  On
43fe83
  * error, set errno, report the error, and return -1.  */
43fe83
@@ -750,13 +758,16 @@ static char *virGetGroupEnt(gid_t gid)
43fe83
     return ret;
43fe83
 }
43fe83
 
43fe83
-char *virGetUserDirectory(void)
43fe83
+
43fe83
+char *
43fe83
+virGetUserDirectoryByUID(uid_t uid)
43fe83
 {
43fe83
     char *ret;
43fe83
-    virGetUserEnt(geteuid(), NULL, NULL, &ret;;
43fe83
+    virGetUserEnt(uid, NULL, NULL, &ret;;
43fe83
     return ret;
43fe83
 }
43fe83
 
43fe83
+
43fe83
 static char *virGetXDGDirectory(const char *xdgenvname, const char *xdgdefdir)
43fe83
 {
43fe83
     const char *path = getenv(xdgenvname);
43fe83
@@ -1092,8 +1103,11 @@ virGetWin32DirectoryRoot(char **path)
43fe83
 
43fe83
 
43fe83
 char *
43fe83
-virGetUserDirectory(void)
43fe83
+virGetUserDirectoryByUID(uid_t uid ATTRIBUTE_UNUSED)
43fe83
 {
43fe83
+    /* Since Windows lacks setuid binaries, and since we already fake
43fe83
+     * geteuid(), we can safely assume that this is only called when
43fe83
+     * querying about the current user */
43fe83
     const char *dir;
43fe83
     char *ret;
43fe83
 
43fe83
@@ -1177,7 +1191,7 @@ virGetUserRuntimeDirectory(void)
43fe83
 
43fe83
 # else /* !HAVE_GETPWUID_R && !WIN32 */
43fe83
 char *
43fe83
-virGetUserDirectory(void)
43fe83
+virGetUserDirectoryByUID(uid_t uid ATTRIBUTE_UNUSED)
43fe83
 {
43fe83
     virReportError(VIR_ERR_INTERNAL_ERROR,
43fe83
                    "%s", _("virGetUserDirectory is not available"));
43fe83
diff --git a/src/util/virutil.h b/src/util/virutil.h
43fe83
index 526c610..4b06992 100644
43fe83
--- a/src/util/virutil.h
43fe83
+++ b/src/util/virutil.h
43fe83
@@ -111,6 +111,7 @@ static inline int getgid (void) { return 0; }
43fe83
 char *virGetHostname(void);
43fe83
 
43fe83
 char *virGetUserDirectory(void);
43fe83
+char *virGetUserDirectoryByUID(uid_t uid);
43fe83
 char *virGetUserConfigDirectory(void);
43fe83
 char *virGetUserCacheDirectory(void);
43fe83
 char *virGetUserRuntimeDirectory(void);
43fe83
-- 
43fe83
1.8.3.2
43fe83