]> git.ipfire.org Git - thirdparty/glibc.git/blame - pwd/putpwent.c
Update copyright dates with scripts/update-copyrights
[thirdparty/glibc.git] / pwd / putpwent.c
CommitLineData
2b778ceb 1/* Copyright (C) 1991-2021 Free Software Foundation, Inc.
c84142e8 2 This file is part of the GNU C Library.
28f540f4 3
c84142e8 4 The GNU C Library is free software; you can redistribute it and/or
41bdb6e2
AJ
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.
28f540f4 8
c84142e8
UD
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
41bdb6e2 12 Lesser General Public License for more details.
28f540f4 13
41bdb6e2 14 You should have received a copy of the GNU Lesser General Public
59ba27a6 15 License along with the GNU C Library; if not, see
5a82c748 16 <https://www.gnu.org/licenses/>. */
28f540f4 17
28f540f4
RM
18#include <errno.h>
19#include <stdio.h>
20#include <pwd.h>
01bd6251 21#include <stdlib.h>
676599b3 22#include <nss.h>
28f540f4 23
537e7234 24#define _S(x) x ?: ""
28f540f4 25
676599b3
FW
26/* Write an entry to the given stream. This must know the format of
27 the password file. If the input contains invalid characters,
28 return EINVAL, or replace them with spaces (if they are contained
29 in the GECOS field). */
28f540f4 30int
676599b3 31putpwent (const struct passwd *p, FILE *stream)
28f540f4 32{
676599b3
FW
33 if (p == NULL || stream == NULL
34 || p->pw_name == NULL || !__nss_valid_field (p->pw_name)
35 || !__nss_valid_field (p->pw_passwd)
36 || !__nss_valid_field (p->pw_dir)
37 || !__nss_valid_field (p->pw_shell))
28f540f4 38 {
c4029823 39 __set_errno (EINVAL);
28f540f4
RM
40 return -1;
41 }
42
676599b3
FW
43 int ret;
44 char *gecos_alloc;
45 const char *gecos = __nss_rewrite_field (p->pw_gecos, &gecos_alloc);
46
47 if (gecos == NULL)
48 return -1;
49
537e7234 50 if (p->pw_name[0] == '+' || p->pw_name[0] == '-')
676599b3
FW
51 ret = fprintf (stream, "%s:%s:::%s:%s:%s\n",
52 p->pw_name, _S (p->pw_passwd),
53 gecos, _S (p->pw_dir), _S (p->pw_shell));
537e7234 54 else
676599b3
FW
55 ret = fprintf (stream, "%s:%s:%lu:%lu:%s:%s:%s\n",
56 p->pw_name, _S (p->pw_passwd),
57 (unsigned long int) p->pw_uid,
58 (unsigned long int) p->pw_gid,
59 gecos, _S (p->pw_dir), _S (p->pw_shell));
60
61 free (gecos_alloc);
62 if (ret >= 0)
63 ret = 0;
64 return ret;
28f540f4 65}