mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-31 22:10:34 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			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"
 |