+static bool
+add_group(gid_t group, long int *start, long int *size, gid_t **groupsp,
+ long int limit, int *errnop, enum nss_status *status)
+{
+ int i, old_errno = errno;
+ for (i = 0; i < *start; ++i)
+ if ((*groupsp)[i] == group)
+ return true;
+ if (*start + 1 > *size) {
+ gid_t *newgroups;
+ long int newsize = 2 * *size;
+ if (limit > 0) {
+ if (*size >= limit) {
+ *status = NSS_STATUS_SUCCESS;
+ return false;
+ }
+ if (newsize > limit)
+ newsize = limit;
+ }
+ newgroups = realloc(*groupsp, newsize * sizeof((*groupsp)[0]));
+ errno = old_errno;
+ if (newgroups == NULL) {
+ *errnop = ENOMEM;
+ *status = NSS_STATUS_TRYAGAIN;
+ return false;
+ }
+ *groupsp = newgroups;
+ *size = newsize;
+ }
+ (*groupsp)[(*start)++] = group;
+ return true;
+}
+