static void nss_test_users(void) { struct passwd *pwd; nss_setpwent(); /* loop over all users */ while ((pwd = nss_getpwent())) { printf("Testing user %s\n", pwd->pw_name); printf("getpwent: "); print_passwd(pwd); pwd = nss_getpwuid(pwd->pw_uid); if (!pwd) { total_errors++; printf("ERROR: can't getpwuid\n"); continue; } printf("getpwuid: "); print_passwd(pwd); pwd = nss_getpwnam(pwd->pw_name); if (!pwd) { total_errors++; printf("ERROR: can't getpwnam\n"); continue; } printf("getpwnam: "); print_passwd(pwd); printf("initgroups: "); nss_test_initgroups(pwd->pw_name, pwd->pw_gid); printf("\n"); } nss_endpwent(); }
/* * nss_getattr(name, items, rep) * * Get attributes specified in list 'items' */ int nss_getattr(char *name, attrlist *items, pwu_repository_t *rep) { struct pwbuf *pwbuf; struct passwd *pw; struct spwd *spw; attrlist *w; int res = 0; res = nss_getpwnam(name, items, rep, (void **)&pwbuf); if (res != PWU_SUCCESS) return (res); pw = pwbuf->pwd; spw = pwbuf->spwd; for (w = items; res == PWU_SUCCESS && w != NULL; w = w->next) { switch (w->type) { case ATTR_NAME: if ((w->data.val_s = strdup(pw->pw_name)) == NULL) res = PWU_NOMEM; break; case ATTR_COMMENT: if ((w->data.val_s = strdup(pw->pw_comment)) == NULL) res = PWU_NOMEM; break; case ATTR_GECOS: if ((w->data.val_s = strdup(pw->pw_gecos)) == NULL) res = PWU_NOMEM; break; case ATTR_HOMEDIR: if ((w->data.val_s = strdup(pw->pw_dir)) == NULL) res = PWU_NOMEM; break; case ATTR_SHELL: if ((w->data.val_s = strdup(pw->pw_shell)) == NULL) res = PWU_NOMEM; break; /* * Nothing special needs to be done for * server policy */ case ATTR_PASSWD: case ATTR_PASSWD_SERVER_POLICY: if ((w->data.val_s = strdup(spw->sp_pwdp)) == NULL) res = PWU_NOMEM; break; case ATTR_AGE: if ((w->data.val_s = strdup(pw->pw_age)) == NULL) res = PWU_NOMEM; break; case ATTR_REP_NAME: if ((w->data.val_s = strdup(pwbuf->rep_name)) == NULL) res = PWU_NOMEM; break; /* integer values */ case ATTR_UID: w->data.val_i = pw->pw_uid; break; case ATTR_GID: w->data.val_i = pw->pw_gid; break; case ATTR_LSTCHG: w->data.val_i = spw->sp_lstchg; break; case ATTR_MIN: w->data.val_i = spw->sp_min; break; case ATTR_MAX: w->data.val_i = spw->sp_max; break; case ATTR_WARN: w->data.val_i = spw->sp_warn; break; case ATTR_INACT: w->data.val_i = spw->sp_inact; break; case ATTR_EXPIRE: w->data.val_i = spw->sp_expire; break; case ATTR_FLAG: w->data.val_i = spw->sp_flag; break; case ATTR_FAILED_LOGINS: w->data.val_i = spw->sp_flag & FAILCOUNT_MASK; break; default: break; } } if (pwbuf->pwd) free(pwbuf->pwd); if (pwbuf->pwd_scratch) free(pwbuf->pwd_scratch); if (pwbuf->spwd) free(pwbuf->spwd); if (pwbuf->spwd_scratch) free(pwbuf->spwd_scratch); free(pwbuf); return (res); }