+ gid_t local_users_gid;
+ int is_local = 0;
+
+ // Check that the user is a nonlocal user before adding any groups
+ status = check_nonlocal_user(user, errnop);
+ if (status == NSS_STATUS_NOTFOUND) {
+ is_local = 1;
+ }
+ else if (status != NSS_STATUS_SUCCESS) {
+ return status;
+ }
+
+ int buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
+ char *buffer = malloc(buflen);
+ if (buffer == NULL) {
+ *errnop = ENOMEM;
+ return NSS_STATUS_TRYAGAIN;
+ }
+ struct group local_users_group;
+ status = get_local_group(MAGIC_LOCAL_GROUPNAME,
+ &local_users_group, buffer, buflen, errnop);
+ free(buffer);
+ if (status == NSS_STATUS_NOTFOUND) {
+ syslog(LOG_WARNING, "nss_nonlocal: Group %s does not exist locally!",
+ MAGIC_LOCAL_GROUPNAME);
+ local_users_gid = 0;
+ }
+ else if (status == NSS_STATUS_SUCCESS) {
+ if (is_local == 1) {
+ // add the (local) user to the magic local users group, and finish
+ (*groupsp)[out++] = local_users_group.gr_gid;
+ syslog(LOG_DEBUG, "nss_nonlocal: Added %s to special group %s",
+ user, MAGIC_LOCAL_GROUPNAME);
+ *start = out;
+ return NSS_STATUS_SUCCESS;
+ }
+ else {
+ local_users_gid = local_users_group.gr_gid;
+ }
+ }
+ else {
+ return status;
+ }