aboutsummaryrefslogtreecommitdiffstats
path: root/ports/uids_generic/guts/getgrnam.c
diff options
context:
space:
mode:
Diffstat (limited to 'ports/uids_generic/guts/getgrnam.c')
-rw-r--r--ports/uids_generic/guts/getgrnam.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/ports/uids_generic/guts/getgrnam.c b/ports/uids_generic/guts/getgrnam.c
index 0e26444..19006ad 100644
--- a/ports/uids_generic/guts/getgrnam.c
+++ b/ports/uids_generic/guts/getgrnam.c
@@ -8,10 +8,29 @@
*/
static struct group grp;
- static char grbuf[PSEUDO_PWD_MAX];
- int r_rc;
+ static size_t grbufsz = PSEUDO_PWD_MAX;
+ static char *grbuf = NULL;
+ int r_rc = ERANGE;
+
+ do {
+ char *new_grbuf = grbuf;
+
+ if (r_rc != 0)
+ new_grbuf = realloc(grbuf, grbufsz);
+
+ if (!new_grbuf) {
+ r_rc = ENOMEM;
+ break;
+ }
+
+ grbuf = new_grbuf;
+
+ r_rc = wrap_getgrnam_r(name, &grp, grbuf, grbufsz, &rc);
+
+ if (r_rc == ERANGE)
+ grbufsz = grbufsz << 1;
+ } while (r_rc == ERANGE);
- r_rc = wrap_getgrnam_r(name, &grp, grbuf, PSEUDO_PWD_MAX, &rc);
/* different error return conventions */
if (r_rc != 0) {
errno = r_rc;