main() { register int pfd, tfd; struct stat begin, end; pw_init(); pfd = pw_lock(); tfd = pw_tmp(); copyfile(pfd, tfd); (void)close(tfd); for (;;) { if (stat(tempname, &begin)) pw_error(tempname, 1, 1); pw_edit(0); if (stat(tempname, &end)) pw_error(tempname, 1, 1); if (begin.st_mtime == end.st_mtime) { (void)fprintf(stderr, "vipw: no changes made\n"); pw_error((char *)NULL, 0, 0); } if (pw_mkdb()) break; pw_prompt(); } exit(0); }
struct passwd * edit(const char *tfn, struct passwd *pw) { struct passwd *npw; char *line; size_t len; if (display(tfn, pw) == -1) return (NULL); for (;;) { switch (pw_edit(1)) { case -1: return (NULL); case 0: return (pw_dup(pw)); default: break; } if ((npw = verify(tfn, pw)) != NULL) return (npw); free(npw); printf("re-edit the password file? "); fflush(stdout); if ((line = fgetln(stdin, &len)) == NULL) { warn("fgetln()"); return (NULL); } if (len > 0 && (*line == 'N' || *line == 'n')) return (NULL); } }
void edit(char *tempname, struct passwd *pw) { struct stat begin, end; for (;;) { if (stat(tempname, &begin)) (*Pw_error)(tempname, 1, 1); pw_edit(1, tempname); if (stat(tempname, &end)) (*Pw_error)(tempname, 1, 1); if (begin.st_mtime == end.st_mtime) { warnx("no changes made"); (*Pw_error)(NULL, 0, 0); } if (verify(tempname, pw)) break; #ifdef YP if (use_yp) yppw_prompt(); else #endif pw_prompt(); } }
static void edit_file(int is_shadow) { struct stat begin, end; pw_init(); pw_lock(); if (stat(tmp_file, &begin)) pw_error(tmp_file, 1, 1); pw_edit(0); if (stat(tmp_file, &end)) pw_error(tmp_file, 1, 1); if (begin.st_mtime == end.st_mtime) { (void)fprintf(stderr, _("%s: no changes made\n"), progname); pw_error((char *)NULL, 0, 0); } if (!is_shadow) chmod(tmp_file, 0644); #if 0 /* if shadow file, then mode is 0600 now */ else chmod(tmp_file, 0400); #endif pw_unlock(); }
static void edit_file(int is_shadow) { struct stat begin, end; int passwd_file, ch_ret; FILE *tmp_fd; pw_init(); /* acquire exclusive lock */ if (lckpwdf() < 0) err(EXIT_FAILURE, _("cannot get lock")); passwd_file = open(orig_file, O_RDONLY, 0); if (passwd_file < 0) err(EXIT_FAILURE, _("cannot open %s"), orig_file); tmp_fd = pw_tmpfile(passwd_file); if (fstat(fileno(tmp_fd), &begin)) pw_error(tmp_file, 1, 1); pw_edit(); if (fstat(fileno(tmp_fd), &end)) pw_error(tmp_file, 1, 1); /* Some editors, such as Vim with 'writebackup' mode enabled, * use "atomic save" in which the old file is deleted and a new * one with the same name created in its place. */ if (end.st_nlink == 0) { if (close_stream(tmp_fd) != 0) err(EXIT_FAILURE, _("write error")); tmp_fd = fopen(tmp_file, "r"); if (!tmp_file) err(EXIT_FAILURE, _("cannot open %s"), tmp_file); if (fstat(fileno(tmp_fd), &end)) pw_error(tmp_file, 1, 1); } if (begin.st_mtime == end.st_mtime) { warnx(_("no changes made")); pw_error((char *)NULL, 0, 0); } /* pw_tmpfile() will create the file with mode 600 */ if (!is_shadow) ch_ret = fchmod(fileno(tmp_fd), 0644); else ch_ret = fchmod(fileno(tmp_fd), 0400); if (ch_ret < 0) err(EXIT_FAILURE, "%s: %s", _("cannot chmod file"), orig_file); if (close_stream(tmp_fd) != 0) err(EXIT_FAILURE, _("write error")); pw_write(); close(passwd_file); ulckpwdf(); }
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()"); } close(tfd); /* Force umask for partial writes made in the edit phase */ 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); }