- sprintf(buf, "%s %s", editor, temp);
- if (system(buf) == 0) {
- struct stat sbuf;
- int ok;
-
- /* sanity checks */
- if (stat(temp, &sbuf) < 0) {
- fprintf(stderr,
- "vipw: can't stat temp file, %s unchanged\n",
- passwd);
- goto bad;
+ (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;