]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Add and expose fr_getgid(). Addresses #776
authorAlan T. DeKok <aland@freeradius.org>
Tue, 2 Sep 2014 15:47:13 +0000 (11:47 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 2 Sep 2014 16:01:33 +0000 (12:01 -0400)
The current users of getgwnam() don't need the entire group
structure.  They just need the gid.  So we create a function
which returns that.

src/include/radiusd.h
src/main/util.c

index b888bed76300f94122df20f5eb175281ad589b5b..ff252f21cc62a2c8e6f9639d03cbf468a31b3652 100644 (file)
@@ -62,6 +62,10 @@ typedef struct rad_request REQUEST;
 #include <freeradius-devel/realms.h>
 #include <freeradius-devel/map.h>
 
+#ifdef HAVE_GRP_H
+#include <grp.h>
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -551,6 +555,9 @@ int         rad_expand_xlat(REQUEST *request, char const *cmd,
 void           rad_regcapture(REQUEST *request, int compare, char const *value,
                               regmatch_t rxmatch[]);
 void           verify_request(char const *file, int line, REQUEST *request);   /* only for special debug builds */
+#ifdef HAVE_GRP_H
+bool           fr_getgid(char const *name, gid_t *gid);
+#endif
 
 /* client.c */
 RADCLIENT_LIST *clients_init(CONF_SECTION *cs);
index 9b324bd9cc39fa0ca9380572e833ac3dfcb54786..c404436690548d915755421bf6230e49133f0857 100644 (file)
@@ -917,3 +917,51 @@ void verify_request(char const *file, int line, REQUEST *request)
 #endif
 }
 #endif
+
+#ifdef HAVE_GRP_H
+#ifndef HAVE_GETGRNAM_R
+bool fr_getgid(char const *name, gid_t *gid)
+{
+       struct group grp;
+
+       grp =  getgrnam(name);
+       if (!grp) return false;
+
+       *gid = grp->gr_gid;
+
+       return true;
+}
+#else  /* getgrnam_r() exists */
+
+bool fr_getgid(char const *name, gid_t *gid)
+{
+       struct group    *grp, my_group;
+       char            *group_buffer;
+       size_t          group_size = 1024;
+
+       grp = NULL;
+       group_buffer = talloc_array(NULL, char, group_size);
+       while (group_buffer) {
+               int err;
+
+               err = getgrnam_r(name, &my_group, group_buffer, group_size, &grp);
+               if (err == ERANGE) {
+                       group_size *= 2;
+                       group_buffer = talloc_realloc(NULL, group_buffer, char, group_size);
+                       continue;
+               }
+
+               if (err) errno = err; /* so the caller knows what went wrong */
+
+               break;
+       }
+
+       talloc_free(group_buffer);
+
+       if (!grp) return false;
+
+       *gid = grp->gr_gid;
+       return true;
+}
+#endif /* HAVE_GETGRNAM_R */
+#endif /* HAVE_GRP_H */