Add -d option to vipw(8) to allow selection of an alternative directory

for the password files.

PR:	2703
Submitted by:	jmg
This commit is contained in:
Sheldon Hearn 1999-06-26 07:16:42 +00:00
parent 6cb576792a
commit af2d5f9b31
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=48232
4 changed files with 57 additions and 19 deletions

View File

@ -36,7 +36,7 @@
static const char sccsid[] = "@(#)pw_util.c 8.3 (Berkeley) 4/2/94";
#endif
static const char rcsid[] =
"$Id: pw_util.c,v 1.12 1998/12/13 01:36:45 dillon Exp $";
"$Id: pw_util.c,v 1.13 1998/12/13 01:39:32 dillon Exp $";
#endif /* not lint */
/*
@ -66,6 +66,8 @@ static const char rcsid[] =
extern char *tempname;
static pid_t editpid = -1;
static int lockfd;
char *mppath = _PATH_PWD;
char *masterpasswd = _PATH_MASTERPASSWD;
void
pw_cont(sig)
@ -118,9 +120,9 @@ pw_lock()
for (;;) {
struct stat st;
lockfd = open(_PATH_MASTERPASSWD, O_RDONLY, 0);
lockfd = open(masterpasswd, O_RDONLY, 0);
if (lockfd < 0 || fcntl(lockfd, F_SETFD, 1) == -1)
err(1, "%s", _PATH_MASTERPASSWD);
err(1, "%s", masterpasswd);
if (flock(lockfd, LOCK_EX|LOCK_NB))
errx(1, "the password db file is busy");
@ -142,10 +144,13 @@ pw_lock()
int
pw_tmp()
{
static char path[MAXPATHLEN] = _PATH_MASTERPASSWD;
static char path[MAXPATHLEN];
int fd;
char *p;
strncpy(path, masterpasswd, MAXPATHLEN - 1);
path[MAXPATHLEN] = '\0';
if ((p = strrchr(path, '/')))
++p;
else
@ -168,11 +173,12 @@ char *username;
if (!(pid = fork())) {
if(!username) {
warnx("rebuilding the database...");
execl(_PATH_PWD_MKDB, "pwd_mkdb", "-p", tempname, NULL);
execl(_PATH_PWD_MKDB, "pwd_mkdb", "-p", "-d", mppath,
tempname, NULL);
} else {
warnx("updating the database...");
execl(_PATH_PWD_MKDB, "pwd_mkdb", "-p", "-u",
username, tempname, NULL);
execl(_PATH_PWD_MKDB, "pwd_mkdb", "-p", "-d", mppath,
"-u", username, tempname, NULL);
}
pw_error(_PATH_PWD_MKDB, 1, 1);
}
@ -250,7 +256,7 @@ pw_error(name, err, eval)
warnx("NIS information unchanged");
else
#endif /* YP */
warnx("%s: unchanged", _PATH_MASTERPASSWD);
warnx("%s: unchanged", masterpasswd);
(void)unlink(tempname);
exit(eval);
}

View File

@ -36,7 +36,7 @@
static const char sccsid[] = "@(#)pw_util.c 8.3 (Berkeley) 4/2/94";
#endif
static const char rcsid[] =
"$Id: pw_util.c,v 1.12 1998/12/13 01:36:45 dillon Exp $";
"$Id: pw_util.c,v 1.13 1998/12/13 01:39:32 dillon Exp $";
#endif /* not lint */
/*
@ -66,6 +66,8 @@ static const char rcsid[] =
extern char *tempname;
static pid_t editpid = -1;
static int lockfd;
char *mppath = _PATH_PWD;
char *masterpasswd = _PATH_MASTERPASSWD;
void
pw_cont(sig)
@ -118,9 +120,9 @@ pw_lock()
for (;;) {
struct stat st;
lockfd = open(_PATH_MASTERPASSWD, O_RDONLY, 0);
lockfd = open(masterpasswd, O_RDONLY, 0);
if (lockfd < 0 || fcntl(lockfd, F_SETFD, 1) == -1)
err(1, "%s", _PATH_MASTERPASSWD);
err(1, "%s", masterpasswd);
if (flock(lockfd, LOCK_EX|LOCK_NB))
errx(1, "the password db file is busy");
@ -142,10 +144,13 @@ pw_lock()
int
pw_tmp()
{
static char path[MAXPATHLEN] = _PATH_MASTERPASSWD;
static char path[MAXPATHLEN];
int fd;
char *p;
strncpy(path, masterpasswd, MAXPATHLEN - 1);
path[MAXPATHLEN] = '\0';
if ((p = strrchr(path, '/')))
++p;
else
@ -168,11 +173,12 @@ char *username;
if (!(pid = fork())) {
if(!username) {
warnx("rebuilding the database...");
execl(_PATH_PWD_MKDB, "pwd_mkdb", "-p", tempname, NULL);
execl(_PATH_PWD_MKDB, "pwd_mkdb", "-p", "-d", mppath,
tempname, NULL);
} else {
warnx("updating the database...");
execl(_PATH_PWD_MKDB, "pwd_mkdb", "-p", "-u",
username, tempname, NULL);
execl(_PATH_PWD_MKDB, "pwd_mkdb", "-p", "-d", mppath,
"-u", username, tempname, NULL);
}
pw_error(_PATH_PWD_MKDB, 1, 1);
}
@ -250,7 +256,7 @@ pw_error(name, err, eval)
warnx("NIS information unchanged");
else
#endif /* YP */
warnx("%s: unchanged", _PATH_MASTERPASSWD);
warnx("%s: unchanged", masterpasswd);
(void)unlink(tempname);
exit(eval);
}

View File

@ -39,6 +39,7 @@
.Nd edit the password file
.Sh SYNOPSIS
.Nm vipw
.Op Fl d Ar directory
.Sh DESCRIPTION
.Nm Vipw
edits the password file after setting the appropriate locks,
@ -51,6 +52,16 @@ to try again later. The default editor for
is
.Xr vi 1 .
.Pp
When run without options,
.Nm vipw
will work with the password files in
.Pa /etc .
The
.Fl d
option may be used to specify an alternative
.Ar directory
to work with.
.Pp
.Nm Vipw
performs a number of consistency checks on the password entries,
and will not allow a password file with a

View File

@ -42,7 +42,7 @@ static const char copyright[] =
static char sccsid[] = "@(#)vipw.c 8.3 (Berkeley) 4/2/94";
#endif
static const char rcsid[] =
"$Id$";
"$Id: vipw.c,v 1.5 1997/10/27 07:53:22 charnier Exp $";
#endif /* not lint */
#include <sys/types.h>
@ -57,6 +57,8 @@ static const char rcsid[] =
#include "pw_util.h"
extern char *mppath;
extern char *masterpasswd;
char *tempname;
void copyfile __P((int, int));
@ -71,8 +73,21 @@ main(argc, argv)
struct stat begin, end;
int ch;
while ((ch = getopt(argc, argv, "")) != -1)
while ((ch = getopt(argc, argv, "d:")) != -1)
switch (ch) {
case 'd':
if ((masterpasswd = malloc(strlen(optarg) +
strlen(_MASTERPASSWD) + 2)) == NULL)
err(1, NULL);
strcpy(masterpasswd, optarg);
if (masterpasswd[strlen(masterpasswd) - 1] != '/')
masterpasswd[strlen(masterpasswd)] = '/';
strcat(masterpasswd, _MASTERPASSWD);
if ((mppath = strdup(optarg)) == NULL)
err(1, NULL);
if (mppath[strlen(mppath) - 1] == '/')
mppath[strlen(mppath) - 1] = '\0';
break;
case '?':
default:
usage();
@ -126,6 +141,6 @@ static void
usage()
{
(void)fprintf(stderr, "usage: vipw\n");
(void)fprintf(stderr, "usage: vipw [ -d directory ]\n");
exit(1);
}