nss_compat: Do not use mmap to read database files (bug 26258)
[platform/upstream/glibc.git] / nss / tst-nss-test4.c
1 /* Test group merging.
2    Copyright (C) 2017-2020 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <https://www.gnu.org/licenses/>.  */
18
19 #include <nss.h>
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23
24 #include <support/support.h>
25
26 #include "nss_test.h"
27
28 /* The name choices here are arbitrary, aside from the merge_1 list
29    needing to be an expected merge of group_1 and group_2.  */
30
31 static const char *group_1[] = {
32   "foo", "bar", NULL
33 };
34
35 static const char *group_2[] = {
36   "foo", "dick", "harry", NULL
37 };
38
39 /* Note that deduplication is NOT supposed to happen.  */
40 static const char *merge_1[] = {
41   "foo", "bar", "foo", "dick", "harry", NULL
42 };
43
44 static const char *group_4[] = {
45   "fred", "wilma", NULL
46 };
47
48 /* This is the data we're giving the service.  */
49 static struct group group_table_data1[] = {
50   GRP_N(1, "name1", group_1),
51   GRP(2),
52   GRP_LAST ()
53 };
54
55 /* This is the data we're giving the service.  */
56 static struct group group_table_data2[] = {
57   GRP_N(1, "name1", group_2),
58   GRP(4),
59   GRP_LAST ()
60 };
61
62 /* This is the data we compare against.  */
63 static struct group group_table[] = {
64   GRP_N(1, "name1", merge_1),
65   GRP(2),
66   GRP(4),
67   GRP_LAST ()
68 };
69
70 void
71 _nss_test1_init_hook(test_tables *t)
72 {
73   t->grp_table = group_table_data1;
74 }
75
76 void
77 _nss_test2_init_hook(test_tables *t)
78 {
79   t->grp_table = group_table_data2;
80 }
81
82 static int
83 do_test (void)
84 {
85   int retval = 0;
86   int i;
87   struct group *g = NULL;
88   uintptr_t align_mask;
89
90   __nss_configure_lookup ("group", "test1 [SUCCESS=merge] test2");
91
92   align_mask = __alignof__ (struct group *) - 1;
93
94   setgrent ();
95
96   for (i = 0; group_table[i].gr_gid; ++i)
97     {
98       g = getgrgid (group_table[i].gr_gid);
99       if (g)
100         {
101           retval += compare_groups (i, g, & group_table[i]);
102           if ((uintptr_t)g & align_mask)
103             {
104               printf("FAIL: [%d] unaligned group %p\n", i, g);
105               ++retval;
106             }
107           if ((uintptr_t)(g->gr_mem) & align_mask)
108             {
109               printf("FAIL: [%d] unaligned member list %p\n", i, g->gr_mem);
110               ++retval;
111             }
112         }
113       else
114         {
115           printf ("FAIL: [%d] group %u.%s not found\n", i,
116               group_table[i].gr_gid, group_table[i].gr_name);
117           ++retval;
118         }
119     }
120
121   endgrent ();
122
123 #define EXPECTED 0
124   if (retval == EXPECTED)
125     {
126       if (retval > 0)
127         printf ("PASS: Found %d expected errors\n", retval);
128       return 0;
129     }
130   else
131     {
132       printf ("FAIL: Found %d errors, expected %d\n", retval, EXPECTED);
133       return 1;
134     }
135 }
136
137 #include <support/test-driver.c>