lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 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 ("cannot open temporary file"); |
| 28 | return 1; |
| 29 | } |
| 30 | |
| 31 | for (size_t i = 0; i < ndata; ++i) |
| 32 | if (putspent (&data[i], fp) != 0) |
| 33 | { |
| 34 | printf ("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 (fp)) != NULL) |
| 44 | { |
| 45 | ++seen; |
| 46 | if (strcmp (p->sp_namp, data[seen].sp_namp) != 0) |
| 47 | { |
| 48 | printf ("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 ("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 ("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" |