1#include <gshadow.h>
2#include <stdio.h>
3#include <string.h>
4
5
6static const struct sgrp data[] =
7 {
8 { (char *) "one", (char *) "pwdone",
9 (char *[]) { (char *) "admoneone", (char *) "admonetwo",
10 (char *) "admonethree", NULL },
11 (char *[]) { (char *) "memoneone", (char *) "memonetwo",
12 (char *) "memonethree", NULL } },
13 { (char *) "two", (char *) "pwdtwo",
14 (char *[]) { (char *) "admtwoone", (char *) "admtwotwo", NULL },
15 (char *[]) { (char *) "memtwoone", (char *) "memtwotwo",
16 (char *) "memtwothree", NULL } },
17 { (char *) "three", (char *) "pwdthree",
18 (char *[]) { (char *) "admthreeone", (char *) "admthreetwo", NULL },
19 (char *[]) { (char *) "memthreeone", (char *) "memthreetwo", NULL } },
20 { (char *) "four", (char *) "pwdfour",
21 (char *[]) { (char *) "admfourone", (char *) "admfourtwo", NULL },
22 (char *[]) { NULL } },
23 { (char *) "five", (char *) "pwdfive",
24 (char *[]) { NULL },
25 (char *[]) { (char *) "memfiveone", (char *) "memfivetwo", NULL } },
26 };
27#define ndata (sizeof (data) / sizeof (data[0]))
28
29
30static int
31do_test (void)
32{
33 FILE *fp = tmpfile ();
34 if (fp == NULL)
35 {
36 puts (s: "cannot open temporary file");
37 return 1;
38 }
39
40 for (size_t i = 0; i < ndata; ++i)
41 if (putsgent (g: &data[i], stream: fp) != 0)
42 {
43 printf (format: "putsgent call %zu failed\n", i + 1);
44 return 1;
45 }
46
47 rewind (fp);
48
49 int result = 0;
50 int seen = -1;
51 struct sgrp *g;
52 while ((g = fgetsgent (stream: fp)) != NULL)
53 {
54 ++seen;
55 if (strcmp (g->sg_namp, data[seen].sg_namp) != 0)
56 {
57 printf (format: "sg_namp of entry %d does not match: %s vs %s\n",
58 seen + 1, g->sg_namp, data[seen].sg_namp);
59 result = 1;
60 }
61 if (strcmp (g->sg_passwd, data[seen].sg_passwd) != 0)
62 {
63 printf (format: "sg_passwd of entry %d does not match: %s vs %s\n",
64 seen + 1, g->sg_passwd, data[seen].sg_passwd);
65 result = 1;
66 }
67 if (g->sg_adm == NULL)
68 {
69 printf (format: "sg_adm of entry %d is NULL\n", seen + 1);
70 result = 1;
71 }
72 else
73 {
74 int i = 1;
75 char **sp1 = g->sg_adm;
76 char **sp2 = data[seen].sg_adm;
77 while (*sp1 != NULL && *sp2 != NULL)
78 {
79 if (strcmp (*sp1, *sp2) != 0)
80 {
81 printf (format: "sg_adm[%d] of entry %d does not match: %s vs %s\n",
82 i, seen + 1, *sp1, *sp2);
83 result = 1;
84 }
85 ++sp1;
86 ++sp2;
87 ++i;
88 }
89 if (*sp1 == NULL && *sp2 != NULL)
90 {
91 printf (format: "sg_adm of entry %d has too few entries\n", seen + 1);
92 result = 1;
93 }
94 else if (*sp1 != NULL && *sp2 == NULL)
95 {
96 printf (format: "sg_adm of entry %d has too many entries\n", seen + 1);
97 result = 1;
98 }
99 }
100 if (g->sg_mem == NULL)
101 {
102 printf (format: "sg_mem of entry %d is NULL\n", seen + 1);
103 result = 1;
104 }
105 else
106 {
107 int i = 1;
108 char **sp1 = g->sg_mem;
109 char **sp2 = data[seen].sg_mem;
110 while (*sp1 != NULL && *sp2 != NULL)
111 {
112 if (strcmp (*sp1, *sp2) != 0)
113 {
114 printf (format: "sg_mem[%d] of entry %d does not match: %s vs %s\n",
115 i, seen + 1, *sp1, *sp2);
116 result = 1;
117 }
118 ++sp1;
119 ++sp2;
120 ++i;
121 }
122 if (*sp1 == NULL && *sp2 != NULL)
123 {
124 printf (format: "sg_mem of entry %d has too few entries\n", seen + 1);
125 result = 1;
126 }
127 else if (*sp1 != NULL && *sp2 == NULL)
128 {
129 printf (format: "sg_mem of entry %d has too many entries\n", seen + 1);
130 result = 1;
131 }
132 }
133 }
134
135 fclose (fp);
136
137 return result;
138}
139
140#define TEST_FUNCTION do_test ()
141#include "../test-skeleton.c"
142

source code of glibc/gshadow/tst-gshadow.c