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