| lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 1 | #include <gshadow.h> | 
|  | 2 | #include <stdio.h> | 
|  | 3 | #include <string.h> | 
|  | 4 |  | 
|  | 5 |  | 
|  | 6 | static 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 |  | 
|  | 30 | static int | 
|  | 31 | do_test (void) | 
|  | 32 | { | 
|  | 33 | FILE *fp = tmpfile (); | 
|  | 34 | if (fp == NULL) | 
|  | 35 | { | 
|  | 36 | puts ("cannot open temporary file"); | 
|  | 37 | return 1; | 
|  | 38 | } | 
|  | 39 |  | 
|  | 40 | for (size_t i = 0; i < ndata; ++i) | 
|  | 41 | if (putsgent (&data[i], fp) != 0) | 
|  | 42 | { | 
|  | 43 | printf ("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 (fp)) != NULL) | 
|  | 53 | { | 
|  | 54 | ++seen; | 
|  | 55 | if (strcmp (g->sg_namp, data[seen].sg_namp) != 0) | 
|  | 56 | { | 
|  | 57 | printf ("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 ("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 ("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 ("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 ("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 ("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 ("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 ("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 ("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 ("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" |