cd48eb2c721ad895b5fba1dd4d4aeb65c32efcca
[platform/upstream/glibc.git] / gshadow / putsgent.c
1 /* Copyright (C) 2009-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 <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
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 }