pw_copy(pfd, tfd, pw);   if (pw_mkdb() < 0) pw_error((char *)NULL, 0, 1);
if (pw_mkdb() < 0) pw_error((char *)NULL, 0, 1); }
main(argc, argv)	int argc;	char **argv;{	enum { NEWSH, LOADENTRY, EDITENTRY } op;	struct passwd *pw, lpw;	int ch, pfd, tfd, dfd;	char *arg, tempname[] = "/etc/pw.XXXXXX";#ifdef	YP	use_yp = _yp_check(NULL);#endif	op = EDITENTRY;	while ((ch = getopt(argc, argv, "a:s:ly")) != -1)		switch(ch) {		case 'a':			op = LOADENTRY;			arg = optarg;			break;		case 's':			op = NEWSH;			arg = optarg;			break;#ifdef	YP		case 'l':			use_yp = 0;			break;		case 'y':			if (!use_yp) {				warnx("YP not in use.");				usage();			}			force_yp = 1;			break;#endif		case '?':		default:			usage();		}	argc -= optind;	argv += optind;#ifdef	YP	if (op == LOADENTRY && use_yp)		errx(1, "cannot load entry using NIS.\n\tUse the -l flag to load local.");#endif	uid = getuid();	if (op == EDITENTRY || op == NEWSH)		switch(argc) {		case 0:			pw = getpwuid(uid);#ifdef	YP			if (pw && !force_yp)				use_yp = 0;			else if (use_yp)				pw = ypgetpwuid(uid);#endif	/* YP */			if (!pw)				errx(1, "unknown user: uid %u\n", uid);			break;		case 1:			pw = getpwnam(*argv);#ifdef	YP			if (pw && !force_yp)				use_yp = 0;			else if (use_yp)				pw = ypgetpwnam(*argv);#endif	/* YP */			if (!pw)				errx(1, "unknown user: %s", *argv);			if (uid && uid != pw->pw_uid)				baduser();			break;		default:			usage();		}	if (op == NEWSH) {		/* protect p_shell -- it thinks NULL is /bin/sh */		if (!arg[0])			usage();		if (p_shell(arg, pw, (ENTRY *)NULL))			pw_error((char *)NULL, 0, 1);	}	if (op == LOADENTRY) {		if (uid)			baduser();		pw = &lpw;		if (!pw_scan(arg, pw, (int *)NULL))			exit(1);	}	/* Get the passwd lock file and open the passwd file for reading. */	pw_init();	tfd = pw_lock(0);	if (tfd < 0) {		if (errno == EEXIST)			errx(1, "the passwd file is busy.");		else			err(1, "can't open passwd temp file");	}	pfd = open(_PATH_MASTERPASSWD, O_RDONLY, 0);	if (pfd < 0)		pw_error(_PATH_MASTERPASSWD, 1, 1);	/* Edit the user passwd information if requested. */	if (op == EDITENTRY) {		dfd = mkstemp(tempname);		if (dfd < 0)			pw_error(tempname, 1, 1);		display(tempname, dfd, pw);		edit(tempname, pw);		(void)unlink(tempname);	}#ifdef	YP	if (use_yp) {		if (pw_yp(pw, uid)) {			pw_error((char *)NULL, 0, 1);			exit(1);		} else {			pw_abort();			exit(0);		}	} else#endif	/* YP */	/* Copy the passwd file to the lock file, updating pw. */	pw_copy(pfd, tfd, pw);	/* Now finish the passwd file update. */	if (pw_mkdb() < 0)		pw_error((char *)NULL, 0, 1);	exit(0);}