diff options
Diffstat (limited to 'ports/uids_generic/guts/getgrgid.c')
-rw-r--r-- | ports/uids_generic/guts/getgrgid.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/ports/uids_generic/guts/getgrgid.c b/ports/uids_generic/guts/getgrgid.c index c1824e7..0d3dafb 100644 --- a/ports/uids_generic/guts/getgrgid.c +++ b/ports/uids_generic/guts/getgrgid.c @@ -7,10 +7,30 @@ * struct group * rc = NULL; */ static struct group grp; - static char grbuf[PSEUDO_PWD_MAX]; - int r_rc; + static size_t grbuflen = PSEUDO_PWD_MAX; + static char *grbuf = NULL; + int r_rc = ERANGE; + + do { + char *new_grbuf = grbuf; + + if (r_rc == ERANGE) + new_grbuf = realloc(grbuf, grbuflen); + + if (!new_grbuf) { + r_rc = ENOMEM; + break; + } + + grbuf = new_grbuf; + + r_rc = wrap_getgrgid_r(gid, &grp, grbuf, grbuflen, &rc); + + if (r_rc == ERANGE) + grbuflen = grbuflen << 1; + + } while (r_rc == ERANGE); - r_rc = wrap_getgrgid_r(gid, &grp, grbuf, PSEUDO_PWD_MAX, &rc); /* different error return conventions */ if (r_rc != 0) { errno = r_rc; |