grupd.c revision 20253
1283425Sdchagin/*-
2283425Sdchagin * Copyright (c) 1996 by David L. Nugent <davidn@blaze.net.au>.
3283425Sdchagin * All rights reserved.
4283425Sdchagin *
5283425Sdchagin * Redistribution and use in source and binary forms, with or without
6283425Sdchagin * modification, are permitted provided that the following conditions
7283425Sdchagin * are met:
8283425Sdchagin * 1. Redistributions of source code must retain the above copyright
9283425Sdchagin *    notice, this list of conditions and the following disclaimer as
10283425Sdchagin *    the first lines of this file unmodified.
11283425Sdchagin * 2. Redistributions in binary form must reproduce the above copyright
12283425Sdchagin *    notice, this list of conditions and the following disclaimer in the
13283425Sdchagin *    documentation and/or other materials provided with the distribution.
14283425Sdchagin * 3. All advertising materials mentioning features or use of this software
15283425Sdchagin *    must display the following acknowledgement:
16283425Sdchagin *	This product includes software developed by David L. Nugent.
17283425Sdchagin * 4. The name of the author may not be used to endorse or promote products
18283425Sdchagin *    derived from this software without specific prior written permission.
19283425Sdchagin *
20283425Sdchagin * THIS SOFTWARE IS PROVIDED BY THE DAVID L. NUGENT ``AS IS'' AND
21283425Sdchagin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22283425Sdchagin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23283425Sdchagin * ARE DISCLAIMED.  IN NO EVENT SHALL DAVID L. NUGENT BE LIABLE
24283425Sdchagin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25283425Sdchagin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26283425Sdchagin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27283425Sdchagin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28283425Sdchagin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29283425Sdchagin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30283425Sdchagin * SUCH DAMAGE.
31283425Sdchagin *
32283425Sdchagin *	$Id$
33283425Sdchagin */
34283425Sdchagin
35283425Sdchagin#include <stdio.h>
36283425Sdchagin#include <stdlib.h>
37283425Sdchagin#include <string.h>
38283425Sdchagin#include <unistd.h>
39283425Sdchagin#include <stdarg.h>
40283425Sdchagin#include <errno.h>
41283425Sdchagin#include <sys/types.h>
42283425Sdchagin#include <sys/stat.h>
43283425Sdchagin
44283425Sdchagin#include "pwupd.h"
45283425Sdchagin
46283425Sdchaginint
47283425Sdchaginfmtgrentry(char *buf, struct group * grp, int type)
48283425Sdchagin{
49283425Sdchagin	int             i, l;
50283425Sdchagin
51283425Sdchagin	if (type == PWF_STANDARD)
52283425Sdchagin		l = sprintf(buf, "%s:*:%ld:", grp->gr_name, (long) grp->gr_gid);
53283425Sdchagin	else
54283425Sdchagin		l = sprintf(buf, "%s:%s:%ld:", grp->gr_name, grp->gr_passwd, (long) grp->gr_gid);
55283425Sdchagin
56283425Sdchagin	/*
57283425Sdchagin	 * Now, list members
58283425Sdchagin	 */
59283425Sdchagin	for (i = 0; i < 200 && grp->gr_mem[i]; i++)
60283425Sdchagin		l += sprintf(buf + l, "%s%s", i ? "," : "", grp->gr_mem[i]);
61283425Sdchagin	buf[l++] = '\n';
62283425Sdchagin	buf[l] = '\0';
63283425Sdchagin	return l;
64283425Sdchagin}
65283425Sdchagin
66283425Sdchagin
67283425Sdchaginint
68283425Sdchaginfmtgrent(char *buf, struct group * grp)
69283425Sdchagin{
70283425Sdchagin	return fmtgrentry(buf, grp, PWF_STANDARD);
71283425Sdchagin}
72283425Sdchagin
73283425Sdchagin
74283425Sdchaginstatic int
75283425Sdchagingr_update(struct group * grp, char const * group, int mode)
76283425Sdchagin{
77283425Sdchagin	int             l;
78283425Sdchagin	char            pfx[32];
79283425Sdchagin	char            grbuf[MAXPWLINE];
80283425Sdchagin
81283425Sdchagin	endgrent();
82283425Sdchagin	l = sprintf(pfx, "%s:", group);
83283425Sdchagin
84283425Sdchagin	/*
85283425Sdchagin	 * Update the group file
86283425Sdchagin	 */
87283425Sdchagin	if (grp == NULL)
88283425Sdchagin		*grbuf = '\0';
89283425Sdchagin	else
90283425Sdchagin		fmtgrentry(grbuf, grp, PWF_PASSWD);
91283425Sdchagin	return fileupdate(_PATH_GROUP, 0644, grbuf, pfx, l, mode);
92283425Sdchagin}
93283425Sdchagin
94283425Sdchagin
95283425Sdchaginint
96283425Sdchaginaddgrent(struct group * grp)
97283425Sdchagin{
98283425Sdchagin	return gr_update(grp, grp->gr_name, UPD_CREATE);
99283425Sdchagin}
100283425Sdchagin
101283425Sdchaginint
102283425Sdchaginchggrent(char const * login, struct group * grp)
103283425Sdchagin{
104283425Sdchagin	return gr_update(grp, login, UPD_REPLACE);
105283425Sdchagin}
106283425Sdchagin
107283425Sdchaginint
108283425Sdchagindelgrent(struct group * grp)
109283425Sdchagin{
110283425Sdchagin	return gr_update(NULL, grp->gr_name, UPD_DELETE);
111283425Sdchagin}
112283425Sdchagin