From: Alan T. DeKok Date: Tue, 2 Sep 2014 15:47:13 +0000 (-0400) Subject: Add and expose fr_getgid(). Addresses #776 X-Git-Tag: release_3_0_5~647 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d61c04de07e05f2ec9356ff1b6db4f00352fc1a2;p=thirdparty%2Ffreeradius-server.git Add and expose fr_getgid(). Addresses #776 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. --- diff --git a/src/include/radiusd.h b/src/include/radiusd.h index b888bed7630..ff252f21cc6 100644 --- a/src/include/radiusd.h +++ b/src/include/radiusd.h @@ -62,6 +62,10 @@ typedef struct rad_request REQUEST; #include #include +#ifdef HAVE_GRP_H +#include +#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); diff --git a/src/main/util.c b/src/main/util.c index 9b324bd9cc3..c4044366905 100644 --- a/src/main/util.c +++ b/src/main/util.c @@ -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 */