Annotation of 43BSD/contrib/mh/support/pop/popwrd.c, revision 1.1

1.1     ! root        1: /* popwrd.c - set password for a POP subscriber */
        !             2: 
        !             3: #include "../h/strings.h"
        !             4: #include "../zotnet/bboards.h"
        !             5: #include <errno.h>
        !             6: #include <pwd.h>
        !             7: #include <signal.h>
        !             8: #include <stdio.h>
        !             9: #include <sys/types.h>
        !            10: #include <sys/file.h>
        !            11: 
        !            12: 
        !            13: static char  temp[] = "ptmp";
        !            14: static char  home[BUFSIZ];
        !            15: 
        !            16: extern int errno;
        !            17: 
        !            18: char   *crypt (), *getpass (), *tail ();
        !            19: 
        !            20: #define        compar(s,t)     (strcmp (s, t) ? s : "")
        !            21: 
        !            22: /*  */
        !            23: 
        !            24: /* ARGSUSED */
        !            25: 
        !            26: main (argc, argv)
        !            27: int    argc;
        !            28: char  **argv;
        !            29: {
        !            30:     int     i,
        !            31:             fd,
        !            32:             flags,
        !            33:             insist;
        !            34:     long    salt;
        !            35:     char    c,
        !            36:            *cp,
        !            37:             buffer[BUFSIZ],
        !            38:             saltc[2],
        !            39:           **ap;
        !            40:     struct bboard  *bb,
        !            41:                    *bp;
        !            42:     struct passwd  *pw;
        !            43:     FILE * fp;
        !            44: 
        !            45:     if ((pw = getpwnam (POPUID)) == NULL) {
        !            46:        fprintf (stderr, "no entry for ~%s.\n", POPUID);
        !            47:        exit (1);
        !            48:     }
        !            49:     if (chdir (strcpy (home, pw -> pw_dir)) < 0) {
        !            50:        fprintf (stderr, "no home directory for ~%s.\n", POPUID);
        !            51:        exit (1);
        !            52:     }
        !            53:     if (!setpwinfo (pw, POPDB, 0)) {
        !            54:        fprintf (stderr, "setbbinfo(%s, %s, 0) failed -- %s.\n",
        !            55:                pw -> pw_name, POPDB, getbberr ());
        !            56:        exit (1);
        !            57:     }
        !            58: 
        !            59:     if (argc != 2) {
        !            60:        fprintf (stderr, "usage: %s pop-subscriber\n", *argv);
        !            61:        exit (1);
        !            62:     }
        !            63:     if ((bb = getbbnam (argv[1])) == NULL
        !            64:            && (bb = getbbaka (argv[1])) == NULL) {
        !            65:        fprintf (stderr, "Permission denied.\n");
        !            66:        exit (1);
        !            67:     }
        !            68: 
        !            69:     if (!ldrbb (bb) && getuid () && !ldrchk (bb))
        !            70:        exit (1);
        !            71: 
        !            72:     if ((bp = getbbcpy (bb)) == NULL) {
        !            73:        fprintf (stderr, "getbbcpy loses.\n");
        !            74:        exit (1);
        !            75:     }
        !            76: 
        !            77:     (void) endbbent ();
        !            78: 
        !            79: #ifdef lint
        !            80:     flags = 0;
        !            81: #endif lint
        !            82:     for (insist = 0; insist < 2; insist++) {
        !            83:        if (insist)
        !            84:            printf ("Please use %s.\n",
        !            85:                    flags == 1 ? "at least one non-numeric character"
        !            86:                    : "a longer password");
        !            87: 
        !            88:        if ((i = strlen (strcpy (buffer, getpass ("New password:")))) == 0) {
        !            89:            fprintf (stderr, "Password unchanged.\n");
        !            90:            exit (1);
        !            91:        }
        !            92: 
        !            93:        flags = 0;
        !            94:        for (cp = buffer; c = *cp++;)
        !            95:            if (c >= 'a' && c <= 'z')
        !            96:                flags |= 2;
        !            97:            else
        !            98:                if (c >= 'A' && c <= 'Z')
        !            99:                    flags |= 4;
        !           100:                else
        !           101:                    if (c >= '0' && c <= '9')
        !           102:                        flags |= 1;
        !           103:                    else
        !           104:                        flags |= 8;
        !           105: 
        !           106:        if ((flags >= 7 && i >= 4)
        !           107:                || ((flags == 2 || flags == 4) && i >= 6)
        !           108:                || ((flags == 3 || flags == 5 || flags == 6) && i >= 5))
        !           109:            break;
        !           110:     }
        !           111: 
        !           112:     if (strcmp (buffer, getpass ("Retype new password:"))) {
        !           113:        fprintf (stderr, "Mismatch - password unchanged.\n");
        !           114:        exit (1);
        !           115:     }
        !           116: 
        !           117:     (void) time (&salt);
        !           118:     salt ^= 9 * getpid ();
        !           119:     saltc[0] = salt & 077;
        !           120:     saltc[1] = (salt >> 6) & 077;
        !           121:     for (i = 0; i < 2; i++) {
        !           122:        c = saltc[i] + '.';
        !           123:        if (c > '9')
        !           124:            c += 7;
        !           125:        if (c > 'Z')
        !           126:            c += 6;
        !           127:        saltc[i] = c;
        !           128:     }
        !           129:     cp = crypt (buffer, saltc);
        !           130: 
        !           131:     (void) signal (SIGHUP, SIG_IGN);
        !           132:     (void) signal (SIGINT, SIG_IGN);
        !           133:     (void) signal (SIGQUIT, SIG_IGN);
        !           134: 
        !           135:     (void) umask (0);
        !           136:     if ((fd = open (temp, O_WRONLY | O_CREAT | O_EXCL, 0644)) < 0) {
        !           137:        switch (errno) {
        !           138:            case EEXIST: 
        !           139:                fprintf (stderr, "POP file busy - try again later.\n");
        !           140:                break;
        !           141: 
        !           142:            default: 
        !           143:                perror (temp);
        !           144:                break;
        !           145:        }
        !           146:        exit (1);
        !           147:     }
        !           148: 
        !           149:     (void) signal (SIGTSTP, SIG_IGN);
        !           150:     if ((fp = fdopen (fd, "w")) == NULL) {
        !           151:        fprintf (stderr, "fdopen loses.\n");
        !           152:        (void) unlink (temp);
        !           153:        exit (1);
        !           154:     }
        !           155: 
        !           156:     (void) setbbent (SB_STAY | SB_FAST);
        !           157:     while (bb = getbbent ()) {
        !           158:        if (strcmp (bb -> bb_name, bp -> bb_name) == 0)
        !           159:            bb -> bb_passwd = cp;
        !           160:        fprintf (fp, "%s:", bb -> bb_name);
        !           161:        if (ap = bb -> bb_aka)
        !           162:            for (; *ap; ap++)
        !           163:                fprintf (fp, "%s%s", ap != bb -> bb_aka ? "," : "", *ap);
        !           164:        fprintf (fp, ":%s:%s:", tail (bb -> bb_file), bb -> bb_passwd);
        !           165:        if ((ap = bb -> bb_leader) != NULL
        !           166:                && (strcmp (*ap, POPUID) != 0 || ap[1] != NULL))
        !           167:            for (; *ap; ap++)
        !           168:                fprintf (fp, "%s%s", ap != bb -> bb_leader ? "," : "", *ap);
        !           169:        fprintf (fp, ":%s:%s:%s:",
        !           170:                compar (bb -> bb_addr, bb -> bb_name),
        !           171:                compar (bb -> bb_request, POPUID),
        !           172:                bb -> bb_relay);
        !           173:        if (ap = bb -> bb_dist)
        !           174:            for (; *ap; ap++)
        !           175:                fprintf (fp, "%s%s", ap != bb -> bb_dist ? "," : "", *ap);
        !           176:        fprintf (fp, ":%o\n", bb -> bb_flags);
        !           177:     }
        !           178:     (void) endbbent ();
        !           179: 
        !           180:     if (rename (temp, POPDB) < 0) {
        !           181:        perror ("rename");
        !           182:        (void) unlink (temp);
        !           183:        exit (1);
        !           184:     }
        !           185:     (void) fclose (fp);
        !           186: 
        !           187:     exit (0);
        !           188: }
        !           189: 
        !           190: /*  */
        !           191: 
        !           192: char   *tail (s)
        !           193: char   *s;
        !           194: {
        !           195:     int     i;
        !           196:     char   *cp;
        !           197: 
        !           198:     if (strncmp (s, home, i = strlen (home)) == 0
        !           199:            && *(cp = s + i) == '/'
        !           200:            && *++cp)
        !           201:        return cp;
        !           202: 
        !           203:     return s;
        !           204: }

unix.superglobalmegacorp.com

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