#include #include #include static const struct sgrp data[] = { { (char *) "one", (char *) "pwdone", (char *[]) { (char *) "admoneone", (char *) "admonetwo", (char *) "admonethree", NULL }, (char *[]) { (char *) "memoneone", (char *) "memonetwo", (char *) "memonethree", NULL } }, { (char *) "two", (char *) "pwdtwo", (char *[]) { (char *) "admtwoone", (char *) "admtwotwo", NULL }, (char *[]) { (char *) "memtwoone", (char *) "memtwotwo", (char *) "memtwothree", NULL } }, { (char *) "three", (char *) "pwdthree", (char *[]) { (char *) "admthreeone", (char *) "admthreetwo", NULL }, (char *[]) { (char *) "memthreeone", (char *) "memthreetwo", NULL } }, { (char *) "four", (char *) "pwdfour", (char *[]) { (char *) "admfourone", (char *) "admfourtwo", NULL }, (char *[]) { NULL } }, { (char *) "five", (char *) "pwdfive", (char *[]) { NULL }, (char *[]) { (char *) "memfiveone", (char *) "memfivetwo", NULL } }, }; #define ndata (sizeof (data) / sizeof (data[0])) static int do_test (void) { FILE *fp = tmpfile (); if (fp == NULL) { puts ("cannot open temporary file"); return 1; } for (size_t i = 0; i < ndata; ++i) if (putsgent (&data[i], fp) != 0) { printf ("putsgent call %zu failed\n", i + 1); return 1; } rewind (fp); int result = 0; int seen = -1; struct sgrp *g; while ((g = fgetsgent (fp)) != NULL) { ++seen; if (strcmp (g->sg_namp, data[seen].sg_namp) != 0) { printf ("sg_namp of entry %d does not match: %s vs %s\n", seen + 1, g->sg_namp, data[seen].sg_namp); result = 1; } if (strcmp (g->sg_passwd, data[seen].sg_passwd) != 0) { printf ("sg_passwd of entry %d does not match: %s vs %s\n", seen + 1, g->sg_passwd, data[seen].sg_passwd); result = 1; } if (g->sg_adm == NULL) { printf ("sg_adm of entry %d is NULL\n", seen + 1); result = 1; } else { int i = 1; char **sp1 = g->sg_adm; char **sp2 = data[seen].sg_adm; while (*sp1 != NULL && *sp2 != NULL) { if (strcmp (*sp1, *sp2) != 0) { printf ("sg_adm[%d] of entry %d does not match: %s vs %s\n", i, seen + 1, *sp1, *sp2); result = 1; } ++sp1; ++sp2; ++i; } if (*sp1 == NULL && *sp2 != NULL) { printf ("sg_adm of entry %d has too few entries\n", seen + 1); result = 1; } else if (*sp1 != NULL && *sp2 == NULL) { printf ("sg_adm of entry %d has too many entries\n", seen + 1); result = 1; } } if (g->sg_mem == NULL) { printf ("sg_mem of entry %d is NULL\n", seen + 1); result = 1; } else { int i = 1; char **sp1 = g->sg_mem; char **sp2 = data[seen].sg_mem; while (*sp1 != NULL && *sp2 != NULL) { if (strcmp (*sp1, *sp2) != 0) { printf ("sg_mem[%d] of entry %d does not match: %s vs %s\n", i, seen + 1, *sp1, *sp2); result = 1; } ++sp1; ++sp2; ++i; } if (*sp1 == NULL && *sp2 != NULL) { printf ("sg_mem of entry %d has too few entries\n", seen + 1); result = 1; } else if (*sp1 != NULL && *sp2 == NULL) { printf ("sg_mem of entry %d has too many entries\n", seen + 1); result = 1; } } } fclose (fp); return result; } #define TEST_FUNCTION do_test () #include "../test-skeleton.c"