- errno = 0;
- ret = getgrnam_r(name, gbufp, buf, len, &gbufp);
- if (ret != 0) {
- *errnop = old_errno;
- status = NSS_STATUS_TRYAGAIN;
- } else if (gbufp != NULL) {
- status = NSS_STATUS_SUCCESS;
- grp->gr_name = strncpy(buffer, gbufp->gr_name, buflen);
- buffer = buffer + strlen(grp->gr_name);
- buflen = buflen - strlen(grp->gr_name);
- grp->gr_passwd = strncpy(buffer, gbufp->gr_passwd, buflen);
- buffer = buffer + strlen(grp->gr_passwd);
- buflen = buflen - strlen(grp->gr_passwd);
- grp->gr_gid = gbufp->gr_gid;
- if (buflen < sizeof(void *)) {
- *errnop = ERANGE;
- status = NSS_STATUS_TRYAGAIN;
- }
- else {
- grp->gr_mem = memset(buffer, 0, sizeof(void *));
+
+ if (fct_start == NULL &&
+ __nss_group_lookup(&startp, fct_name, &fct_start) != 0) {
+ free(*buffer);
+ *buffer = NULL;
+ return NSS_STATUS_UNAVAIL;
+ }
+ nip = startp;
+ fct.ptr = fct_start;
+ do {
+ morebuf:
+ if (fct.l == _nss_nonlocal_getgrnam_r)
+ status = NSS_STATUS_NOTFOUND;
+ else
+ status = DL_CALL_FCT(fct.l, (name, grp, *buffer, buflen, errnop));
+ if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE) {
+ free(*buffer);
+ buflen *= 2;
+ *buffer = malloc(buflen);
+ if (*buffer == NULL) {
+ *errnop = ENOMEM;
+ errno = old_errno;
+ return NSS_STATUS_TRYAGAIN;
+ }
+ goto morebuf;