Annotation of 43BSDTahoe/usr.lib/sendmail/aux/newaliases.c, revision 1.1

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

unix.superglobalmegacorp.com

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