1 | #include <shadow.h> |
2 | #include <stdio.h> |
3 | #include <string.h> |
4 | |
5 | |
6 | static const struct spwd data[] = |
7 | { |
8 | { (char *) "one" , (char *) "pwdone" , 1, 2, 3, 4, 5, 6, 7 }, |
9 | { (char *) "two" , (char *) "pwdtwo" , 11, 12, 13, 14, 15, 16, 17 }, |
10 | { (char *) "three" , (char *) "pwdthree" , -1, 22, 23, 24, 25, 26, 27 }, |
11 | { (char *) "four" , (char *) "pwdfour" , 31, -1, 33, 34, 35, 36, 37 }, |
12 | { (char *) "five" , (char *) "pwdfive" , 41, 42, -1, 44, 45, 46, 47 }, |
13 | { (char *) "six" , (char *) "pwdsix" , 51, 52, 53, -1, 55, 56, 57 }, |
14 | { (char *) "seven" , (char *) "pwdseven" , 61, 62, 63, 64, -1, 66, 67 }, |
15 | { (char *) "eight" , (char *) "pwdeigth" , 71, 72, 73, 74, 75, -1, 77 }, |
16 | { (char *) "nine" , (char *) "pwdnine" , 81, 82, 83, 84, 85, 86, ~0ul }, |
17 | }; |
18 | #define ndata (sizeof (data) / sizeof (data[0])) |
19 | |
20 | |
21 | static int |
22 | do_test (void) |
23 | { |
24 | FILE *fp = tmpfile (); |
25 | if (fp == NULL) |
26 | { |
27 | puts (s: "cannot open temporary file" ); |
28 | return 1; |
29 | } |
30 | |
31 | for (size_t i = 0; i < ndata; ++i) |
32 | if (putspent (p: &data[i], stream: fp) != 0) |
33 | { |
34 | printf (format: "putspent call %zu failed\n" , i + 1); |
35 | return 1; |
36 | } |
37 | |
38 | rewind (fp); |
39 | |
40 | int result = 0; |
41 | int seen = -1; |
42 | struct spwd *p; |
43 | while ((p = fgetspent (stream: fp)) != NULL) |
44 | { |
45 | ++seen; |
46 | if (strcmp (p->sp_namp, data[seen].sp_namp) != 0) |
47 | { |
48 | printf (format: "sp_namp of entry %d does not match: %s vs %s\n" , |
49 | seen + 1, p->sp_namp, data[seen].sp_namp); |
50 | result = 1; |
51 | } |
52 | if (strcmp (p->sp_pwdp, data[seen].sp_pwdp) != 0) |
53 | { |
54 | printf (format: "sp_pwdp of entry %d does not match: %s vs %s\n" , |
55 | seen + 1, p->sp_pwdp, data[seen].sp_pwdp); |
56 | result = 1; |
57 | } |
58 | #define T(f) \ |
59 | if (p->f != data[seen].f) \ |
60 | { \ |
61 | printf ("%s of entry %d wrong: %ld vs %ld\n", \ |
62 | #f, seen + 1, p->f, data[seen].f); \ |
63 | result = 1; \ |
64 | } |
65 | T (sp_lstchg); |
66 | T (sp_min); |
67 | T (sp_max); |
68 | T (sp_warn); |
69 | T (sp_expire); |
70 | if (p->sp_flag != data[seen].sp_flag) |
71 | { |
72 | printf (format: "sp_flag of entry %d wrong: %lu vs %lu\n" , |
73 | seen + 1, p->sp_flag, data[seen].sp_flag); |
74 | result = 1; |
75 | } |
76 | } |
77 | |
78 | fclose (fp); |
79 | |
80 | return result; |
81 | } |
82 | |
83 | #define TEST_FUNCTION do_test () |
84 | #include "../test-skeleton.c" |
85 | |