- 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 *));
- }
- }
- free(buf);
- errno = old_errno;
+ gid = strtoul(grp->gr_name, &end, 10);
+ if (errno == 0 && *end == '\0' && (gid_t)gid == gid) {
+ errno = old_errno;
+ status = check_nonlocal_gid(user, gid, errnop);
+ } else
+ errno = old_errno;
+ if (status != NSS_STATUS_SUCCESS)
+ return status;
+
+ return check_nonlocal_gid(user, grp->gr_gid, errnop);
+}
+
+enum nss_status
+get_local_group(const char *name, struct group *grp, char **buffer, int *errnop)
+{
+ enum nss_status status;
+ size_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
+ const struct walk_nss w = {
+ .lookup = &__nss_group_lookup, .fct_name = "getgrnam_r",
+ .status = &status, .errnop = errnop, .buf = buffer, .buflen = &buflen
+ };
+ const __typeof__(&_nss_nonlocal_getgrnam_r) self = &_nss_nonlocal_getgrnam_r;
+#define args (name, grp, *buffer, buflen, errnop)
+#include "walk_nss.h"
+#undef args