diff options
Diffstat (limited to 'usr.sbin/vipw/vipw.c')
| -rw-r--r-- | usr.sbin/vipw/vipw.c | 125 | 
1 files changed, 125 insertions, 0 deletions
| diff --git a/usr.sbin/vipw/vipw.c b/usr.sbin/vipw/vipw.c new file mode 100644 index 000000000000..7e5e760bf3c5 --- /dev/null +++ b/usr.sbin/vipw/vipw.c @@ -0,0 +1,125 @@ +/*- + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 1987, 1993, 1994 + *	The Regents of the University of California.  All rights reserved. + * Copyright (c) 2002 Networks Associates Technology, Inc. + * All rights reserved. + * + * Portions of this software were developed for the FreeBSD Project by + * ThinkSec AS and NAI Labs, the Security Research Division of Network + * Associates, Inc.  under DARPA/SPAWAR contract N66001-01-C-8035 + * ("CBOSS"), as part of the DARPA CHATS research program. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/types.h> +#include <sys/stat.h> + +#include <err.h> +#include <pwd.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include <libutil.h>		/* must be after pwd.h */ + +static void	usage(void); + +int +main(int argc, char *argv[]) +{ +	const char *passwd_dir = NULL; +	int ch, pfd, tfd; +	char *line; +	size_t len; + +	while ((ch = getopt(argc, argv, "d:")) != -1) +		switch (ch) { +		case 'd': +			passwd_dir = optarg; +			break; +		case '?': +		default: +			usage(); +		} + +	argc -= optind; +	argv += optind; + +	if (argc != 0) +		usage(); + +	if (pw_init(passwd_dir, NULL) == -1) +		err(1, "pw_init()"); +	if ((pfd = pw_lock()) == -1) { +		pw_fini(); +		err(1, "pw_lock()"); +	} +	if ((tfd = pw_tmp(pfd)) == -1) { +		pw_fini(); +		err(1, "pw_tmp()"); +	} +	(void)close(tfd); +	/* Force umask for partial writes made in the edit phase */ +	(void)umask(077); + +	for (;;) { +		switch (pw_edit(0)) { +		case -1: +			pw_fini(); +			err(1, "pw_edit()"); +		case 0: +			pw_fini(); +			errx(0, "no changes made"); +		default: +			break; +		} +		if (pw_mkdb(NULL) == 0) { +			pw_fini(); +			errx(0, "password list updated"); +		} +		printf("re-edit the password file? "); +		fflush(stdout); +		if ((line = fgetln(stdin, &len)) == NULL) { +			pw_fini(); +			err(1, "fgetln()"); +		} +		if (len > 0 && (*line == 'N' || *line == 'n')) +			break; +	} +	pw_fini(); +	exit(0); +} + +static void +usage(void) +{ + +	(void)fprintf(stderr, "usage: vipw [-d directory]\n"); +	exit(1); +} | 
