]> xenbits.xensource.com Git - libvirt.git/commitdiff
Add virGetGroupName to convert from GID to group name
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 16 Dec 2011 00:55:19 +0000 (00:55 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 19 Jan 2012 13:30:04 +0000 (13:30 +0000)
src/libvirt_private.syms
src/util/util.c
src/util/util.h

index 0dfd4c1f1cc2da0807af908049a9e3a5002472dd..8301c78800f68ff98fbfd1f7f4d6060a406fb8fc 100644 (file)
@@ -1112,6 +1112,7 @@ virFindFileInPath;
 virFormatMacAddr;
 virGenerateMacAddr;
 virGetGroupID;
+virGetGroupName;
 virGetHostname;
 virGetUserDirectory;
 virGetUserID;
index 8663c4d664dafbf06416901238fdffe83b700881..fdfceaafd215dfaff6d5f12e0f29405511b1fda3 100644 (file)
@@ -2187,6 +2187,56 @@ static char *virGetUserEnt(uid_t uid,
     return ret;
 }
 
+static char *virGetGroupEnt(gid_t gid)
+{
+    char *strbuf;
+    char *ret;
+    struct group grbuf;
+    struct group *gr = NULL;
+    long val = sysconf(_SC_GETGR_R_SIZE_MAX);
+    size_t strbuflen = val;
+    int rc;
+
+    /* sysconf is a hint; if it fails, fall back to a reasonable size */
+    if (val < 0)
+        strbuflen = 1024;
+
+    if (VIR_ALLOC_N(strbuf, strbuflen) < 0) {
+        virReportOOMError();
+        return NULL;
+    }
+
+    /*
+     * From the manpage (terrifying but true):
+     *
+     * ERRORS
+     *  0 or ENOENT or ESRCH or EBADF or EPERM or ...
+     *        The given name or gid was not found.
+     */
+    while ((rc = getgrgid_r(gid, &grbuf, strbuf, strbuflen, &gr)) == ERANGE) {
+        if (VIR_RESIZE_N(strbuf, strbuflen, strbuflen, strbuflen) < 0) {
+            virReportOOMError();
+            VIR_FREE(strbuf);
+            return NULL;
+        }
+    }
+    if (rc != 0 || gr == NULL) {
+        virReportSystemError(rc,
+                             _("Failed to find group record for gid '%u'"),
+                             (unsigned int) gid);
+        VIR_FREE(strbuf);
+        return NULL;
+    }
+
+    ret = strdup(gr->gr_name);
+
+    VIR_FREE(strbuf);
+    if (!ret)
+        virReportOOMError();
+
+    return ret;
+}
+
 char *virGetUserDirectory(uid_t uid)
 {
     return virGetUserEnt(uid, VIR_USER_ENT_DIRECTORY);
@@ -2197,6 +2247,11 @@ char *virGetUserName(uid_t uid)
     return virGetUserEnt(uid, VIR_USER_ENT_NAME);
 }
 
+char *virGetGroupName(gid_t gid)
+{
+    return virGetGroupEnt(gid);
+}
+
 
 int virGetUserID(const char *name,
                  uid_t *uid)
index 977ab6cc6470a67b245ae64774c660e251c07826..a380144e53c3c6aac50dd0f645757a006df53b12 100644 (file)
@@ -236,6 +236,7 @@ int virKillProcess(pid_t pid, int sig);
 
 char *virGetUserDirectory(uid_t uid);
 char *virGetUserName(uid_t uid);
+char *virGetGroupName(gid_t gid);
 int virGetUserID(const char *name,
                  uid_t *uid) ATTRIBUTE_RETURN_CHECK;
 int virGetGroupID(const char *name,