A future patch needs to look up pw_gid; but it is wasteful
to crawl through getpwuid_r twice for two separate pieces
of information. Alter the internal-only virGetUserEnt to
give us multiple pieces of information on one traversal.
* src/util/virutil.c (virGetUserEnt): Alter signature.
(virGetUserDirectory, virGetXDGDirectory, virGetUserName): Adjust
callers.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
src/util/virutil.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/src/util/virutil.c b/src/util/virutil.c
index 569d035..de7b532 100644
--- a/src/util/virutil.c
+++ b/src/util/virutil.c
@@ -656,8 +656,12 @@ enum {
VIR_USER_ENT_NAME,
};
-static char *virGetUserEnt(uid_t uid,
- int field)
+/* Look up either the name or home directory for a given uid; if group
+ is non-NULL, also look up the primary group for that user. On
+ failure, error has been reported, errno is set, and NULL is
+ returned. */
+static char *
+virGetUserEnt(uid_t uid, int field, gid_t *group)
{
char *strbuf;
char *ret;
@@ -698,6 +702,8 @@ static char *virGetUserEnt(uid_t uid,
return NULL;
}
+ if (group)
+ *group = pw->pw_gid;
ignore_value(VIR_STRDUP(ret, field == VIR_USER_ENT_DIRECTORY ?
pw->pw_dir : pw->pw_name));
VIR_FREE(strbuf);
@@ -752,7 +758,7 @@ static char *virGetGroupEnt(gid_t gid)
char *virGetUserDirectory(void)
{
- return virGetUserEnt(geteuid(), VIR_USER_ENT_DIRECTORY);
+ return virGetUserEnt(geteuid(), VIR_USER_ENT_DIRECTORY, NULL);
}
static char *virGetXDGDirectory(const char *xdgenvname, const char *xdgdefdir)
@@ -765,7 +771,7 @@ static char *virGetXDGDirectory(const char *xdgenvname, const char
*xdgdefdir)
if (virAsprintf(&ret, "%s/libvirt", path) < 0)
goto no_memory;
} else {
- home = virGetUserEnt(geteuid(), VIR_USER_ENT_DIRECTORY);
+ home = virGetUserEnt(geteuid(), VIR_USER_ENT_DIRECTORY, NULL);
if (virAsprintf(&ret, "%s/%s/libvirt", home, xdgdefdir) < 0)
goto no_memory;
}
@@ -808,7 +814,7 @@ char *virGetUserRuntimeDirectory(void)
char *virGetUserName(uid_t uid)
{
- return virGetUserEnt(uid, VIR_USER_ENT_NAME);
+ return virGetUserEnt(uid, VIR_USER_ENT_NAME, NULL);
}
char *virGetGroupName(gid_t gid)
--
1.8.1.4