1 /* Copyright (C) 2009-2021 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 <stdbool.h>
20 #include <stdio.h>
21 #include <gshadow.h>
22 #include <nss.h>
23 
24 #define _S(x)	x ? x : ""
25 
26 
27 /* Write an entry to the given stream.
28    This must know the format of the group file.  */
29 int
putsgent(const struct sgrp * g,FILE * stream)30 putsgent (const struct sgrp *g, FILE *stream)
31 {
32   int errors = 0;
33 
34   if (g->sg_namp == NULL || !__nss_valid_field (g->sg_namp)
35       || !__nss_valid_field (g->sg_passwd)
36       || !__nss_valid_list_field (g->sg_adm)
37       || !__nss_valid_list_field (g->sg_mem))
38     {
39       __set_errno (EINVAL);
40       return -1;
41     }
42 
43   _IO_flockfile (stream);
44 
45   if (fprintf (stream, "%s:%s:", g->sg_namp, _S (g->sg_passwd)) < 0)
46     ++errors;
47 
48   bool first = true;
49   char **sp = g->sg_adm;
50   if (sp != NULL)
51     while (*sp != NULL)
52       {
53 	if (fprintf (stream, "%s%s", first ? "" : ",", *sp++) < 0)
54 	  {
55 	    ++errors;
56 	    break;
57 	  }
58 	first = false;
59       }
60   if (putc_unlocked (':', stream) == EOF)
61     ++errors;
62 
63   first = true;
64   sp = g->sg_mem;
65   if (sp != NULL)
66     while (*sp != NULL)
67       {
68 	if (fprintf (stream, "%s%s", first ? "" : ",", *sp++) < 0)
69 	  {
70 	    ++errors;
71 	    break;
72 	  }
73 	first = false;
74       }
75   if (putc_unlocked ('\n', stream) == EOF)
76     ++errors;
77 
78   _IO_funlockfile (stream);
79 
80   return errors ? -1 : 0;
81 }
82