(root)/
glibc-2.38/
grp/
putgrent.c
       1  /* Copyright (C) 1991-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 <errno.h>
      19  #include <nss.h>
      20  #include <stdio.h>
      21  #include <string.h>
      22  #include <grp.h>
      23  
      24  #define flockfile(s) _IO_flockfile (s)
      25  #define funlockfile(s) _IO_funlockfile (s)
      26  
      27  #define _S(x)	x ? x : ""
      28  
      29  /* Write an entry to the given stream.
      30     This must know the format of the group file.  */
      31  int
      32  putgrent (const struct group *gr, FILE *stream)
      33  {
      34    int retval;
      35  
      36    if (__glibc_unlikely (gr == NULL) || __glibc_unlikely (stream == NULL)
      37        || gr->gr_name == NULL || !__nss_valid_field (gr->gr_name)
      38        || !__nss_valid_field (gr->gr_passwd)
      39        || !__nss_valid_list_field (gr->gr_mem))
      40      {
      41        __set_errno (EINVAL);
      42        return -1;
      43      }
      44  
      45    flockfile (stream);
      46  
      47    if (gr->gr_name[0] == '+' || gr->gr_name[0] == '-')
      48      retval = fprintf (stream, "%s:%s::",
      49  		      gr->gr_name, _S (gr->gr_passwd));
      50    else
      51      retval = fprintf (stream, "%s:%s:%lu:",
      52  		      gr->gr_name, _S (gr->gr_passwd),
      53  		      (unsigned long int) gr->gr_gid);
      54    if (__builtin_expect (retval, 0) < 0)
      55      {
      56        funlockfile (stream);
      57        return -1;
      58      }
      59  
      60    if (gr->gr_mem != NULL)
      61      {
      62        for (size_t i = 0; gr->gr_mem[i] != NULL; i++)
      63  	if (fprintf (stream, i == 0 ? "%s" : ",%s", gr->gr_mem[i]) < 0)
      64  	  {
      65  	    /* What else can we do?  */
      66  	    funlockfile (stream);
      67  	    return -1;
      68  	  }
      69      }
      70  
      71    retval = fputc_unlocked ('\n', stream);
      72  
      73    funlockfile (stream);
      74  
      75    return retval < 0 ? -1 : 0;
      76  }