From aea1f6bc3cb4963dbd48dcd9f051919520f70f2b Mon Sep 17 00:00:00 2001 From: davidn Date: Tue, 23 Feb 1999 07:15:11 +0000 Subject: 1) Do not blindly ignore file update errors which may occur due to concurrent updating 2) Add -V , which allows maintaining user/group database in alternate locations other than /etc. --- usr.sbin/pw/grupd.c | 47 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) (limited to 'usr.sbin/pw/grupd.c') diff --git a/usr.sbin/pw/grupd.c b/usr.sbin/pw/grupd.c index feff430..e36c192 100644 --- a/usr.sbin/pw/grupd.c +++ b/usr.sbin/pw/grupd.c @@ -26,7 +26,7 @@ #ifndef lint static const char rcsid[] = - "$Id$"; + "$Id: grupd.c,v 1.5 1997/10/10 06:23:32 charnier Exp $"; #endif /* not lint */ #include @@ -36,9 +36,46 @@ static const char rcsid[] = #include #include #include +#include #include "pwupd.h" +static char * grpath = _PATH_PWD; + +int +setgrdir(const char * dir) +{ + if (dir == NULL) + return -1; + else { + char * d = malloc(strlen(dir)+1); + if (d == NULL) + return -1; + grpath = strcpy(d, dir); + } + return 0; +} + +char * +getgrpath(const char * file) +{ + static char pathbuf[MAXPATHLEN]; + + snprintf(pathbuf, sizeof pathbuf, "%s/%s", grpath, file); + return pathbuf; +} + +int +grdb(char *arg,...) +{ + /* + * This is a stub for now, but maybe eventually be functional + * if ever an indexed version of /etc/groups is implemented. + */ + arg=arg; + return 0; +} + int fmtgrentry(char **buf, int * buflen, struct group * grp, int type) { @@ -96,7 +133,7 @@ gr_update(struct group * grp, char const * group, int mode) int grbuflen = 0; char *grbuf = NULL; - endgrent(); + ENDGRENT(); l = snprintf(pfx, sizeof pfx, "%s:", group); /* @@ -104,8 +141,10 @@ gr_update(struct group * grp, char const * group, int mode) */ if (grp != NULL && fmtgrentry(&grbuf, &grbuflen, grp, PWF_PASSWD) == -1) l = -1; - else - l = fileupdate(_PATH_GROUP, 0644, grbuf, pfx, l, mode); + else { + if ((l = fileupdate(getgrpath(_GROUP), 0644, grbuf, pfx, l, mode)) != 0) + l = grdb(NULL) == 0; + } if (grbuf != NULL) free(grbuf); return l; -- cgit v1.1