static int getpwent_to_file(FILE *output) { struct passwd result; char *buffer; size_t buflen = 1024; int errnop; enum nss_status ret; _nss_cache_setpwent_path(PASSWD_FILE); buffer = malloc(buflen); do { ret = _nss_cache_getpwent_r(&result, buffer, buflen, &errnop); if (ret == NSS_STATUS_SUCCESS) { fprintf(output, "%s:%s:%d:%d:%s:%s:%s\n", result.pw_name, result.pw_passwd, result.pw_uid, result.pw_gid, result.pw_gecos, result.pw_dir, result.pw_shell); } 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 1; } } while (ret == NSS_STATUS_SUCCESS || ret == NSS_STATUS_TRYAGAIN); free(buffer); return 0; }
static int getpwuid_wrapper(uid_t uid) { struct passwd result; char *buffer = NULL; size_t buflen = 1024; int found = 255; int errnop; int ret; _nss_cache_setpwent_path(PASSWD_FILE); buffer = malloc(buflen); do { ret = _nss_cache_getpwuid_r(uid, &result, buffer, buflen, &errnop); if (ret == NSS_STATUS_SUCCESS) { // printf("found %s, %d\n", result.pw_name, result.pw_uid); 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; }
static int getspent_to_file(FILE *output) { struct spwd result; char *buffer; size_t buflen = 1024; int errnop; enum nss_status ret; _nss_cache_setpwent_path(SHADOW_FILE); buffer = malloc(buflen); do { ret = _nss_cache_getspent_r(&result, buffer, buflen, &errnop); if (ret == NSS_STATUS_SUCCESS) { fprintf(output, "%s:%s:", result.sp_namp, result.sp_pwdp); // sigh, empty numberical fields are -1 in the struct, // so if necessary convert back to empty fields if (result.sp_lstchg != -1) { fprintf(output, "%ld:", result.sp_lstchg); } else { fprintf(output, ":"); } if (result.sp_min != -1) { fprintf(output, "%ld:", result.sp_min); } else { fprintf(output, ":"); } if (result.sp_max != -1) { fprintf(output, "%ld:", result.sp_max); } else { fprintf(output, ":"); } if (result.sp_warn != -1) { fprintf(output, "%ld:", result.sp_warn); } else { fprintf(output, ":"); } if (result.sp_inact != -1) { fprintf(output, "%ld:", result.sp_inact); } else { fprintf(output, ":"); } if (result.sp_expire != -1) { fprintf(output, "%ld:", result.sp_expire); } else { fprintf(output, ":"); } if (result.sp_flag != -1) { fprintf(output, "%ld", result.sp_flag); } fprintf(output, "\n"); } if (ret == NSS_STATUS_TRYAGAIN) { buflen = buflen * 2; buffer = realloc(buffer, buflen); } if (ret == NSS_STATUS_UNAVAIL) { perror("ERROR: failed to access shadow test data"); return 1; } } while (ret == NSS_STATUS_SUCCESS || ret == NSS_STATUS_TRYAGAIN); free(buffer); return 0; }