- struct group *gbufp = &gbuf;
- int ret;
- int old_errno = errno;
- int buflen = MAGIC_LOCAL_GR_BUFLEN;
- char *buf = malloc(buflen);
- if (buf == NULL) {
- *errnop = ENOMEM;
- errno = old_errno;
- return NSS_STATUS_TRYAGAIN;
- }
- ret = getgrgid_r(gid, gbufp, buf, buflen, &gbufp);
- if (ret != 0) {
- *errnop = old_errno;
- status = NSS_STATUS_TRYAGAIN;
- } else if (gbufp != NULL) {
- syslog(LOG_WARNING, "nss_nonlocal: removing local group %u (%s) from non-local user %s\n", gbuf.gr_gid, gbuf.gr_name, user);
+ char *buf;
+ size_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
+ const struct walk_nss w = {
+ .lookup = &__nss_group_lookup, .fct_name = "getgrgid_r",
+ .status = &status, .errnop = errnop, .buf = &buf, .buflen = &buflen
+ };
+ const __typeof__(&_nss_nonlocal_getgrgid_r) self = &_nss_nonlocal_getgrgid_r;
+#define args (gid, &gbuf, buf, buflen, errnop)
+#include "walk_nss.h"
+#undef args
+
+ if (status == NSS_STATUS_SUCCESS) {
+ syslog(LOG_DEBUG, "nss_nonlocal: removing local group %u (%s) from non-local user %s\n", gbuf.gr_gid, gbuf.gr_name, user);
+ free(buf);