diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index d9615ea09a76432b46a3af24fe181c4189945b30..201b2cb5c2c23a827c6c34419513f9abda17313f 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2044,6 +2044,7 @@ virGetUnprivSGIOSysfsPath; virGetUserCacheDirectory; virGetUserConfigDirectory; virGetUserDirectory; +virGetUserDirectoryByUID; virGetUserID; virGetUserName; virGetUserRuntimeDirectory; diff --git a/src/util/virutil.c b/src/util/virutil.c index adcdb3c96063eb009a863c8c97aad6588b8b1666..3abcd53a47b68ff4938207872b4f31a42a17165e 100644 --- a/src/util/virutil.c +++ b/src/util/virutil.c @@ -647,6 +647,14 @@ cleanup: return result; } + +char * +virGetUserDirectory(void) +{ + return virGetUserDirectoryByUID(geteuid()); +} + + #ifdef HAVE_GETPWUID_R /* Look up fields from the user database for the given user. On * error, set errno, report the error, and return -1. */ @@ -750,13 +758,16 @@ static char *virGetGroupEnt(gid_t gid) return ret; } -char *virGetUserDirectory(void) + +char * +virGetUserDirectoryByUID(uid_t uid) { char *ret; - virGetUserEnt(geteuid(), NULL, NULL, &ret); + virGetUserEnt(uid, NULL, NULL, &ret); return ret; } + static char *virGetXDGDirectory(const char *xdgenvname, const char *xdgdefdir) { const char *path = getenv(xdgenvname); @@ -1092,8 +1103,11 @@ virGetWin32DirectoryRoot(char **path) char * -virGetUserDirectory(void) +virGetUserDirectoryByUID(uid_t uid ATTRIBUTE_UNUSED) { + /* Since Windows lacks setuid binaries, and since we already fake + * geteuid(), we can safely assume that this is only called when + * querying about the current user */ const char *dir; char *ret; @@ -1177,7 +1191,7 @@ virGetUserRuntimeDirectory(void) # else /* !HAVE_GETPWUID_R && !WIN32 */ char * -virGetUserDirectory(void) +virGetUserDirectoryByUID(uid_t uid ATTRIBUTE_UNUSED) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("virGetUserDirectory is not available")); diff --git a/src/util/virutil.h b/src/util/virutil.h index 526c610877eac4f96f83be11b40a370302fd354e..4b06992346d853b02b49a200bb9f60e2832ddf66 100644 --- a/src/util/virutil.h +++ b/src/util/virutil.h @@ -111,6 +111,7 @@ static inline int getgid (void) { return 0; } char *virGetHostname(void); char *virGetUserDirectory(void); +char *virGetUserDirectoryByUID(uid_t uid); char *virGetUserConfigDirectory(void); char *virGetUserCacheDirectory(void); char *virGetUserRuntimeDirectory(void);