static int getgrent_to_file(FILE *output) { struct group result; char *buffer; size_t buflen = 1024; int errnop; enum nss_status ret; int idx; _nss_cache_setgrent_path(GROUP_FILE); buffer = malloc(buflen); do { ret = _nss_cache_getgrent_r(&result, buffer, buflen, &errnop); if (ret == NSS_STATUS_SUCCESS) { fprintf(output, "%s:%s:%d:", result.gr_name, result.gr_passwd, result.gr_gid ); // unroll **gr_mem for (idx = 0; result.gr_mem[idx] != NULL; idx++) { fprintf(output, "%s", result.gr_mem[idx]); if (result.gr_mem[idx+1] != NULL) { fprintf(output, ","); } } fprintf(output, "\n"); } if (ret == NSS_STATUS_TRYAGAIN) { buflen = buflen * 2; buffer = realloc(buffer, buflen); } if (ret == NSS_STATUS_UNAVAIL) { fprintf(stderr, "ERROR: failed to access group test data\n"); return 1; } } while (ret == NSS_STATUS_SUCCESS || ret == NSS_STATUS_TRYAGAIN); free(buffer); return 0; }
static int getgrgid_wrapper(gid_t gid) { struct group result; char *buffer = NULL; size_t buflen = 1024; int found = 255; int errnop; int ret; _nss_cache_setgrent_path(GROUP_FILE); buffer = malloc(buflen); do { ret = _nss_cache_getgrgid_r(gid, &result, buffer, buflen, &errnop); if (ret == NSS_STATUS_SUCCESS) { // printf("found %s, %d\n", result.gr_name, result.gr_gid); found = 0; } if (ret == NSS_STATUS_NOTFOUND) { found = 1; } if (ret == NSS_STATUS_TRYAGAIN) { buflen = buflen * 2; buffer = realloc(buffer, buflen); } if (ret == NSS_STATUS_UNAVAIL) { fprintf(stderr, "ERROR: failed to access passwd test data\n"); return 2; } } while (ret == NSS_STATUS_TRYAGAIN); free(buffer); return found; }