mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-05 07:33:38 +08:00
3b055b4786
* shadow/tst-shadow.c: New file. (public_sET_STATe): Pretty printing.
142 lines
3.4 KiB
C
142 lines
3.4 KiB
C
#include <gshadow.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
|
|
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"
|