diff options
Diffstat (limited to 'ports/uids_generic/guts/getgrnam.c')
-rw-r--r-- | ports/uids_generic/guts/getgrnam.c | 25 |
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; |