1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20: #include <grp.h>
21: #include <stdio.h>
22: #include <stdlib.h>
23: #include <string.h>
24: #include <sys/types.h>
25:
26: static int errors;
27:
28: static void
29: write_users (FILE *f, int large_pos, int pos)
30: {
31: int i;
32:
33: if (pos == large_pos)
34: {
35: if (large_pos == 3)
36: fprintf (f, ":three");
37:
38:
39: for (i = 0; i < 500; i++)
40: fprintf (f, ",user%03d", i);
41: }
42: fprintf (f, "\n");
43:
44: }
45:
46: static void
47: write_group (const char *filename, int pos)
48: {
49: FILE *f;
50:
51: f = fopen (filename, "w");
52: fprintf (f, "one:x:1:one");
53: write_users (f, pos, 1);
54: fprintf (f, "two:x:2:two");
55: write_users (f, pos, 2);
56: fprintf (f, "three:x:3");
57: write_users (f, pos, 3);
58: fclose (f);
59: }
60:
61: static void
62: test_entry (const char *name, gid_t gid, struct group *g)
63: {
64: if (!g)
65: {
66: printf ("Error: Entry is empty\n");
67: errors++;
68: return;
69: }
70:
71: if ((g->gr_gid == gid) && (strcmp (g->gr_name, name) == 0))
72: printf ("Ok: %s: %d\n", g->gr_name, g->gr_gid);
73: else
74: {
75: printf ("Error: %s: %d should be: %s: %d\n", g->gr_name, g->gr_gid,
76: name, gid);
77: errors++;
78: }
79: }
80:
81:
82: static void
83: test_fgetgrent (const char *filename)
84: {
85: struct group *g;
86: FILE *f;
87:
88: f = fopen (filename,"r");
89:
90: g = fgetgrent (f);
91: test_entry ("one", 1, g);
92: g = fgetgrent (f);
93: test_entry ("two", 2, g);
94: g = fgetgrent (f);
95: test_entry ("three", 3, g);
96: fclose (f);
97: }
98:
99:
100: int
101: main (int argc, char *argv[])
102: {
103: char *file = tmpnam (NULL);
104: int i = 0;
105:
106: if (argc > 1)
107: i = atoi (argv[1]);
108: if (i > 3)
109: i = 3;
110: if (i)
111: printf ("Large group is group: %d\n", i);
112: else
113: printf ("Not using a large group\n");
114: write_group (file, i);
115: test_fgetgrent (file);
116:
117: remove (file);
118:
119: return (errors != 0);
120: }