diff options
author | davidn <davidn@FreeBSD.org> | 1999-02-23 07:15:11 +0000 |
---|---|---|
committer | davidn <davidn@FreeBSD.org> | 1999-02-23 07:15:11 +0000 |
commit | aea1f6bc3cb4963dbd48dcd9f051919520f70f2b (patch) | |
tree | b3bd7501edb165799eda61bf2ac5d8202c789a5d /usr.sbin/pw/pwupd.c | |
parent | f6416f79a6b9a2eb5c485e8af421d3d570a95d25 (diff) | |
download | FreeBSD-src-aea1f6bc3cb4963dbd48dcd9f051919520f70f2b.zip FreeBSD-src-aea1f6bc3cb4963dbd48dcd9f051919520f70f2b.tar.gz |
1) Do not blindly ignore file update errors which may occur due to concurrent
updating
2) Add -V <etcdir>, which allows maintaining user/group database in alternate
locations other than /etc.
Diffstat (limited to 'usr.sbin/pw/pwupd.c')
-rw-r--r-- | usr.sbin/pw/pwupd.c | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/usr.sbin/pw/pwupd.c b/usr.sbin/pw/pwupd.c index c42b1fb..8e5fb32 100644 --- a/usr.sbin/pw/pwupd.c +++ b/usr.sbin/pw/pwupd.c @@ -26,7 +26,7 @@ #ifndef lint static const char rcsid[] = - "$Id: pwupd.c,v 1.6 1997/10/10 06:23:41 charnier Exp $"; + "$Id: pwupd.c,v 1.7 1998/02/11 23:31:24 wosch Exp $"; #endif /* not lint */ #include <stdio.h> @@ -37,19 +37,46 @@ static const char rcsid[] = #include <errno.h> #include <sys/types.h> #include <sys/stat.h> +#include <sys/param.h> #include <sys/wait.h> #include "pwupd.h" #define HAVE_PWDB_C 1 -static int +static char pathpwd[] = _PATH_PWD; +static char * pwpath = pathpwd; + +int +setpwdir(const char * dir) +{ + if (dir == NULL) + return -1; + else { + char * d = malloc(strlen(dir)+1); + if (d == NULL) + return -1; + pwpath = strcpy(d, dir); + } + return 0; +} + +char * +getpwpath(char const * file) +{ + static char pathbuf[MAXPATHLEN]; + + snprintf(pathbuf, sizeof pathbuf, "%s/%s", pwpath, file); + return pathbuf; +} + +int pwdb(char *arg,...) { int i = 0; pid_t pid; va_list ap; - char *args[8]; + char *args[10]; args[i++] = _PATH_PWD_MKDB; va_start(ap, arg); @@ -57,7 +84,11 @@ pwdb(char *arg,...) args[i++] = arg; arg = va_arg(ap, char *); } - args[i++] = _PATH_MASTERPASSWD; + if (pwpath != pathpwd) { + args[i++] = "-d"; + args[i++] = pwpath; + } + args[i++] = getpwpath(_MASTERPASSWD); args[i] = NULL; if ((pid = fork()) == -1) /* Error (errno set) */ @@ -108,7 +139,7 @@ pw_update(struct passwd * pwd, char const * user, int mode) { int rc = 0; - endpwent(); + ENDPWENT(); /* * First, let's check the see if the database is alright @@ -130,14 +161,14 @@ pw_update(struct passwd * pwd, char const * user, int mode) *pwbuf = '\0'; else fmtpwentry(pwbuf, pwd, PWF_PASSWD); - if ((rc = fileupdate(_PATH_PASSWD, 0644, pwbuf, pfx, l, mode)) != 0) { + if ((rc = fileupdate(getpwpath(_PASSWD), 0644, pwbuf, pfx, l, mode)) != 0) { /* * Then the master.passwd file */ if (pwd != NULL) fmtpwentry(pwbuf, pwd, PWF_MASTER); - if ((rc = fileupdate(_PATH_MASTERPASSWD, 0644, pwbuf, pfx, l, mode)) != 0) + if ((rc = fileupdate(getpwpath(_MASTERPASSWD), 0644, pwbuf, pfx, l, mode)) != 0) rc = pwdb(NULL) == 0; } } |