/* Test error checking for passwd entries. Copyright (C) 2017-2018 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ #include <nss.h> #include <pwd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <support/support.h> #include "nss_test.h" /* The specific values and names used here are arbitrary, other than correspondence (with suitable differences according to the tests as commented) between the given and expected entries. */ static struct passwd pwd_table[] = { PWD (100), /* baseline, matches */ PWD (300), /* wrong name and uid */ PWD_N (200, NULL), /* missing name */ PWD (60), /* unexpected name */ { .pw_name = (char *)"name20000", .pw_passwd = (char *) "*", .pw_uid = 20000, \ .pw_gid = 200, .pw_gecos = (char *) "*", .pw_dir = (char *) "*", \ .pw_shell = (char *) "*" }, /* wrong gid */ { .pw_name = (char *)"name2", .pw_passwd = (char *) "x", .pw_uid = 2, \ .pw_gid = 2, .pw_gecos = (char *) "y", .pw_dir = (char *) "z", \ .pw_shell = (char *) "*" }, /* spot check other text fields */ PWD_LAST () }; static struct passwd exp_table[] = { PWD (100), PWD (30), PWD (200), PWD_N (60, NULL), PWD (20000), PWD (2), PWD_LAST () }; void _nss_test1_init_hook(test_tables *t) { t->pwd_table = pwd_table; } static int do_test (void) { int retval = 0; int i; struct passwd *p; __nss_configure_lookup ("passwd", "test1"); setpwent (); i = 0; for (p = getpwent (); p != NULL && ! PWD_ISLAST (& exp_table[i]); ++i, p = getpwent ()) retval += compare_passwds (i, p, & exp_table[i]); endpwent (); if (p) { printf ("FAIL: [?] passwd entry %u.%s unexpected\n", p->pw_uid, p->pw_name); ++retval; } if (! PWD_ISLAST (& exp_table[i])) { printf ("FAIL: [%d] passwd entry %u.%s missing\n", i, exp_table[i].pw_uid, exp_table[i].pw_name); ++retval; } #define EXPECTED 9 if (retval == EXPECTED) { if (retval > 0) printf ("PASS: Found %d expected errors\n", retval); return 0; } else { printf ("FAIL: Found %d errors, expected %d\n", retval, EXPECTED); return 1; } } #include <support/test-driver.c>