Annotation of 40BSD/cmd/delivermail/newaliases.c, revision 1.1.1.1

1.1       root        1: # include <stdio.h>
                      2: # include <ctype.h>
                      3: # include "dlvrmail.h"
                      4: 
                      5: static char SccsId[] = "@(#)newaliases.c       1.2     10/18/80";
                      6: 
                      7: typedef struct { char *dptr; int dsize; } datum;
                      8: char *aliases = ALIASFILE;
                      9: char dirbuf[100];
                     10: char pagbuf[100];
                     11: int LineNo;
                     12: char *To;
                     13: int ExitStat;
                     14: int Errors;
                     15: # ifdef DEBUG
                     16: bool Debug;
                     17: # endif DEBUG
                     18: 
                     19: main(argc, argv)
                     20:        int argc;
                     21:        char *argv[];
                     22: {
                     23:        int f;
                     24:        char line[BUFSIZ];
                     25:        char line2[MAXLINE];
                     26:        register char *p;
                     27:        char *cp, *p2;
                     28:        char *rhs;
                     29:        int naliases, bytes, longest;
                     30:        datum key, content;
                     31:        bool skipping;
                     32:        addrq al, bl;
                     33:        extern char *prescan();
                     34:        extern addrq *parse();
                     35:        bool contin;
                     36: 
                     37: # ifdef DEBUG
                     38:        if (argc > 1 && strcmp(argv[1], "-T") == 0)
                     39:        {
                     40:                Debug++;
                     41:                argc--;
                     42:                argv++;
                     43:        }
                     44: # endif DEBUG
                     45:        if (argc > 1)
                     46:                aliases = argv[1];
                     47: 
                     48:        strcpy(dirbuf, aliases);
                     49:        strcat(dirbuf, ".dir");
                     50:        strcpy(pagbuf, aliases);
                     51:        strcat(pagbuf, ".pag");
                     52:        f = creat(dirbuf, 0666);
                     53:        if (f < 0) {
                     54:                perror(dirbuf);
                     55:                exit(1);
                     56:        }
                     57:        close(f);
                     58:        f = creat(pagbuf, 0666);
                     59:        if (f < 0) {
                     60:                perror(pagbuf);
                     61:                exit(1);
                     62:        }
                     63:        close(f);
                     64:        if (dbminit(aliases) < 0)
                     65:                exit(1);
                     66:        if (freopen(aliases, "r", stdin) == 0) {
                     67:                perror(aliases);
                     68:                exit(1);
                     69:        }
                     70: 
                     71:        /* read and interpret lines */
                     72:        LineNo = 0;
                     73:        naliases = 0;
                     74:        bytes = 0;
                     75:        longest = 0;
                     76:        skipping = FALSE;
                     77:        while (fgets(line, sizeof (line), stdin) != NULL)
                     78:        {
                     79:                LineNo++;
                     80:                switch (line[0])
                     81:                {
                     82:                  case '#':
                     83:                  case '\n':
                     84:                  case '\0':
                     85:                        skipping = FALSE;
                     86:                        continue;
                     87: 
                     88:                  case ' ':
                     89:                  case '\t':
                     90:                        if (!skipping)
                     91:                                usrerr("Non-continuation line starts with space");
                     92:                        skipping = TRUE;
                     93:                        continue;
                     94:                }
                     95:                skipping = FALSE;
                     96: 
                     97:                /* process the LHS */
                     98:                for (p = line; *p != '\0' && *p != ':' && *p != '\n'; p++)
                     99:                        continue;
                    100:                if (*p == '\0' || *p == '\n')
                    101:                {
                    102:                 syntaxerr:
                    103:                        usrerr("missing colon");
                    104:                        continue;
                    105:                }
                    106:                *p++ = '\0';
                    107:                if (parse(line, &al, 1) == NULL)
                    108:                {
                    109:                        *--p = ':';
                    110:                        goto syntaxerr;
                    111:                }
                    112:                rhs = cp = p;
                    113:                contin = FALSE;
                    114:                for (;;)
                    115:                {
                    116:                        register char c;
                    117: 
                    118:                        /* do parsing & compression of addresses */
                    119:                        c = *p;
                    120:                        while (c != '\0')
                    121:                        {
                    122:                                p2 = p;
                    123:                                while (*p != '\n' && *p != ',' && *p != '\0')
                    124:                                        p++;
                    125:                                c = *p;
                    126:                                *p++ = '\0';
                    127:                                if (prescan(p2, cp, &line[sizeof line - 1], ',') == NULL)
                    128:                                        continue;
                    129:                                contin = FALSE;
                    130:                                if (parse(cp, &bl, -1) != NULL)
                    131:                                        cp += strlen(cp);
                    132:                                if (c == ',')
                    133:                                {
                    134:                                        *cp++ = ',';
                    135:                                        contin = TRUE;
                    136:                                }
                    137:                        }
                    138: 
                    139:                        /* see if there should be a continuation line */
                    140:                        if (!contin)
                    141:                                break;
                    142: 
                    143:                        /* read continuation line */
                    144:                        if (fgets(line2, sizeof (line2), stdin) == NULL)
                    145:                                break;
                    146:                        LineNo++;
                    147: 
                    148:                        if (!isspace(line2[0]))
                    149:                                usrerr("continuation line missing");
                    150: 
                    151:                        p = line2;
                    152:                }
                    153:                if (al.q_mailer != &Mailer[0])
                    154:                {
                    155:                        usrerr("cannot alias non-local names");
                    156:                        continue;
                    157:                }
                    158:                naliases++;
                    159:                key.dsize = strlen(al.q_user) + 1;
                    160:                key.dptr = al.q_user;
                    161:                content.dsize = strlen(rhs) + 1;
                    162:                if (content.dsize > longest)
                    163:                        longest = content.dsize;
                    164:                content.dptr = rhs;
                    165:                bytes += key.dsize + content.dsize;
                    166:                if (store(key, content), 0)
                    167:                /* if (f = store(key, content)) */
                    168:                        usrerr("Dbm internal error return %d from store\n", f);
                    169:        }
                    170:        fprintf(stderr, "%d aliases, %d bytes, longest %d bytes, %d errors\n",
                    171:            naliases, bytes, longest, Errors);
                    172: 
                    173:        exit(ExitStat);
                    174: }
                    175: 
                    176: usrerr(fmt, a, b, c, d, e)
                    177:        char *fmt;
                    178: {
                    179:        Errors++;
                    180:        fprintf(stderr, "line %d: ", LineNo);
                    181:        fprintf(stderr, fmt, a, b, c, d, e);
                    182:        fprintf(stderr, "\n");
                    183:        return (-1);
                    184: }
                    185: 
                    186: syserr(fmt, a, b, c, d, e)
                    187:        char *fmt;
                    188: {
                    189:        return (usrerr(fmt, a, b, c, d, e));
                    190: }

unix.superglobalmegacorp.com

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