Annotation of 42BSD/etc/vipw.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)vipw.c     4.2 (Berkeley) 9/7/83";
                      3: #endif
                      4: 
                      5: #include <sys/types.h>
                      6: #include <sys/stat.h>
                      7: #include <sys/file.h>
                      8: 
                      9: #include <stdio.h>
                     10: #include <errno.h>
                     11: #include <signal.h>
                     12: 
                     13: /*
                     14:  * Password file editor with locking.
                     15:  */
                     16: char   *temp = "/etc/ptmp";
                     17: char   *passwd = "/etc/passwd";
                     18: char   buf[BUFSIZ];
                     19: char   *getenv();
                     20: char   *index();
                     21: extern int errno;
                     22: 
                     23: main(argc, argv)
                     24:        char *argv[];
                     25: {
                     26:        int fd;
                     27:        FILE *ft, *fp;
                     28:        char *editor;
                     29: 
                     30:        signal(SIGINT, SIG_IGN);
                     31:        signal(SIGQUIT, SIG_IGN);
                     32:        signal(SIGHUP, SIG_IGN);
                     33:        setbuf(stderr, NULL);
                     34:        umask(0);
                     35:        fd = open(temp, O_WRONLY|O_CREAT|O_EXCL, 0644);
                     36:        if (fd < 0) {
                     37:                if (errno == EEXIST) {
                     38:                        fprintf(stderr, "vipw: password file busy\n");
                     39:                        exit(1);
                     40:                }
                     41:                fprintf(stderr, "vipw: "); perror(temp);
                     42:                exit(1);
                     43:        }
                     44:        ft = fdopen(fd, "w");
                     45:        if (ft == NULL) {
                     46:                fprintf(stderr, "vipw: "); perror(temp);
                     47:                goto bad;
                     48:        }
                     49:        fp = fopen(passwd, "r");
                     50:        if (fp == NULL) {
                     51:                fprintf(stderr, "vipw: "); perror(passwd);
                     52:                goto bad;
                     53:        }
                     54:        while (fgets(buf, sizeof (buf) - 1, fp) != NULL)
                     55:                fputs(buf, ft);
                     56:        fclose(ft); fclose(fp);
                     57:        editor = getenv("EDITOR");
                     58:        if (editor == 0)
                     59:                editor = "vi";
                     60:        sprintf(buf, "%s %s", editor, temp);
                     61:        if (system(buf) == 0) {
                     62:                struct stat sbuf;
                     63:                int ok;
                     64: 
                     65:                /* sanity checks */
                     66:                if (stat(temp, &sbuf) < 0) {
                     67:                        fprintf(stderr,
                     68:                            "vipw: can't stat temp file, %s unchanged\n",
                     69:                            passwd);
                     70:                        goto bad;
                     71:                }
                     72:                if (sbuf.st_size == 0) {
                     73:                        fprintf(stderr, "vipw: bad temp file, %s unchanged\n",
                     74:                            passwd);
                     75:                        goto bad;
                     76:                }
                     77:                ft = fopen(temp, "r");
                     78:                if (ft == NULL) {
                     79:                        fprintf(stderr,
                     80:                            "vipw: can't reopen temp file, %s unchanged\n",
                     81:                            passwd);
                     82:                        goto bad;
                     83:                }
                     84:                ok = 0;
                     85:                while (fgets(buf, sizeof (buf) - 1, ft) != NULL) {
                     86:                        register char *cp;
                     87: 
                     88:                        cp = index(buf, '\n');
                     89:                        if (cp == 0)
                     90:                                continue;
                     91:                        *cp = '\0';
                     92:                        cp = index(buf, ':');
                     93:                        if (cp == 0)
                     94:                                continue;
                     95:                        *cp = '\0';
                     96:                        if (strcmp(buf, "root"))
                     97:                                continue;
                     98:                        /* password */
                     99:                        cp = index(cp + 1, ':');
                    100:                        if (cp == 0)
                    101:                                break;
                    102:                        /* uid */
                    103:                        if (atoi(cp + 1) != 0)
                    104:                                break;
                    105:                        cp = index(cp + 1, ':');
                    106:                        if (cp == 0)
                    107:                                break;
                    108:                        /* gid */
                    109:                        cp = index(cp + 1, ':');
                    110:                        if (cp == 0)
                    111:                                break;
                    112:                        /* gecos */
                    113:                        cp = index(cp + 1, ':');
                    114:                        if (cp == 0)
                    115:                                break;
                    116:                        /* login directory */
                    117:                        if (strncmp(++cp, "/:"))
                    118:                                break;
                    119:                        cp += 2;
                    120:                        if (*cp && strcmp(cp, "/bin/sh") &&
                    121:                            strcmp(cp, "/bin/csh"))
                    122:                                break;
                    123:                        ok++;
                    124:                }
                    125:                fclose(ft);
                    126:                if (ok) {
                    127:                        if (rename(temp, passwd) < 0)
                    128:                                fprintf(stderr, "vipw: "), perror("rename");
                    129:                } else
                    130:                        fprintf(stderr,
                    131:                            "vipw: you mangled the temp file, %s unchanged\n",
                    132:                            passwd);
                    133:        }
                    134: bad:
                    135:        unlink(temp);
                    136: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.