+ (void)sprintf(buf, "%s %s", editor, temp);
+ if (system(buf)) {
+ perror("vipw: system");
+ goto bad;
+ }
+
+ if (!freopen(temp, "r", stdin)) {
+ fprintf(stderr, "vipw: can't reopen temp file; %s unchanged.\n", passwd);
+ goto bad;
+ }
+ if (fstat(fileno(stdin), &s2)) {
+ fprintf(stderr, "vipw: can't stat temp file; %s unchanged.\n", passwd);
+ goto bad;
+ }
+ if (s1.st_mtime == s2.st_mtime) {
+ fprintf(stderr, "vipw: %s unchanged.\n", passwd);
+ goto bad;
+ }
+ if (!s2.st_size) {
+ fprintf(stderr, "vipw: bad temp file; %s unchanged.\n", passwd);
+ goto bad;
+ }
+ if (check()) {
+ static char *temp_pag = "/etc/ptmp.pag",
+ *temp_dir = "/etc/ptmp.dir",
+ *passwd_pag = "/etc/passwd.pag",
+ *passwd_dir = "/etc/passwd.dir";
+
+ if (makedb(temp) < 0)
+ fputs("vipw: mkpasswd failed.\n", stderr);
+ else if (rename(temp_pag, passwd_pag) < 0) {
+ fprintf(stderr, "vipw: ");
+ perror(temp_pag);
+ }
+ else if (rename(temp_dir, passwd_dir) < 0) {
+ fprintf(stderr, "vipw: ");
+ perror(temp_dir);
+ }
+ else if (rename(temp, passwd) < 0) {
+ fprintf(stderr, "vipw: ");
+ perror("rename");
+ }
+ else
+ exit(0);
+ (void)unlink(temp_pag);
+ (void)unlink(temp_dir);
+ }
+bad: (void)unlink(temp);
+ exit(1);
+}
+
+#define CHN ((char *)NULL)
+static
+check()
+{
+ register char *cp, *sh;
+ register long id;
+ register int root;
+ long atol();
+ char *token(), *getusershell();
+
+ for (root = 0; gets(buf); root = 0) {
+ if (!*buf) {
+ fputs("vipw: empty line.\n", stderr);
+ continue;
+ }
+ if (!(cp = token(buf)) || !*cp) /* login */
+ goto bad;
+ if (!strcmp(cp, "root"))
+ root = 1;
+ (void)token(CHN); /* passwd */
+ if (!(cp = token(CHN)) || !*cp) /* uid */