(root)/
glibc-2.38/
grp/
tst_fgetgrent.c
       1  /* Copyright (C) 1999-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <grp.h>
      19  #include <stdio.h>
      20  #include <stdlib.h>
      21  #include <string.h>
      22  #include <sys/types.h>
      23  #include <unistd.h>
      24  
      25  static int errors;
      26  
      27  static void
      28  write_users (FILE *f, int large_pos, int pos)
      29  {
      30    int i;
      31  
      32    if (pos == large_pos)
      33      {
      34        if (large_pos == 3)
      35  	fprintf (f, ":three");
      36  
      37        /* we need more than 2048 bytes for proper testing.  */
      38        for (i = 0; i < 500; i++)
      39  	fprintf (f, ",user%03d", i);
      40      }
      41    fprintf (f, "\n");
      42  
      43  }
      44  
      45  static void
      46  write_group (const char *filename, int pos)
      47  {
      48    FILE *f;
      49  
      50    f = fopen (filename, "w");
      51    fprintf (f, "one:x:1:one");
      52    write_users (f, pos, 1);
      53    fprintf (f, "two:x:2:two");
      54    write_users (f, pos, 2);
      55    fprintf (f, "three:x:3");
      56    write_users (f, pos, 3);
      57    fclose (f);
      58  }
      59  
      60  static void
      61  test_entry (const char *name, gid_t gid, struct group *g)
      62  {
      63    if (!g)
      64      {
      65        printf ("Error: Entry is empty\n");
      66        errors++;
      67        return;
      68      }
      69  
      70    if ((g->gr_gid == gid) && (strcmp (g->gr_name, name) == 0))
      71      printf ("Ok: %s: %d\n", g->gr_name, g->gr_gid);
      72    else
      73      {
      74        printf ("Error: %s: %d should be: %s: %d\n", g->gr_name, g->gr_gid,
      75  	      name, gid);
      76        errors++;
      77      }
      78  }
      79  
      80  
      81  static void
      82  test_fgetgrent (const char *filename)
      83  {
      84    struct group *g;
      85    FILE *f;
      86  
      87    f = fopen (filename,"r");
      88  
      89    g = fgetgrent (f);
      90    test_entry ("one", 1, g);
      91    g = fgetgrent (f);
      92    test_entry ("two", 2, g);
      93    g = fgetgrent (f);
      94    test_entry ("three", 3, g);
      95    fclose (f);
      96  }
      97  
      98  
      99  int
     100  main (int argc, char *argv[])
     101  {
     102    char file[] = "/tmp/tst_fgetgrent.XXXXXX";
     103    int fd = mkstemp (file);
     104    if (fd == -1)
     105      {
     106        printf ("mkstemp failed: %m\n");
     107        return 1;
     108      }
     109    close (fd);
     110    int i = 0;
     111  
     112    if (argc > 1)
     113      i = atoi (argv[1]);
     114    if (i > 3)
     115      i = 3;
     116    if (i)
     117      printf ("Large group is group: %d\n", i);
     118    else
     119      printf ("Not using a large group\n");
     120    write_group (file, i);
     121    test_fgetgrent (file);
     122  
     123    remove (file);
     124  
     125    return (errors != 0);
     126  }