Annotation of 43BSDReno/usr.sbin/sendmail/aux/newaliases.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1983 Eric P. Allman
                      3:  * Copyright (c) 1988 Regents of the University of California.
                      4:  * All rights reserved.
                      5:  *
                      6:  * Redistribution and use in source and binary forms are permitted provided
                      7:  * that: (1) source distributions retain this entire copyright notice and
                      8:  * comment, and (2) distributions including binaries display the following
                      9:  * acknowledgement:  ``This product includes software developed by the
                     10:  * University of California, Berkeley and its contributors'' in the
                     11:  * documentation or other materials provided with the distribution and in
                     12:  * all advertising materials mentioning features or use of this software.
                     13:  * Neither the name of the University nor the names of its contributors may
                     14:  * be used to endorse or promote products derived from this software without
                     15:  * specific prior written permission.
                     16:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
                     17:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
                     18:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     19:  */
                     20: 
                     21: #ifndef lint
                     22: char copyright[] =
                     23: "@(#) Copyright (c) 1988 Regents of the University of California.\n\
                     24:  All rights reserved.\n";
                     25: #endif /* not lint */
                     26: 
                     27: #ifndef lint
                     28: static char sccsid[] = "@(#)newaliases.c       5.4 (Berkeley) 6/1/90";
                     29: #endif /* not lint */
                     30: 
                     31: # include <stdio.h>
                     32: # include <ctype.h>
                     33: # include "sendmail.h"
                     34: # include "pathnames.h"
                     35: 
                     36: static char SccsId[] = "@(#)newaliases.c       5.4     6/1/90";
                     37: 
                     38: typedef struct { char *dptr; int dsize; } datum;
                     39: char *aliases = ALIASFILE;
                     40: char dirbuf[100];
                     41: char pagbuf[100];
                     42: int LineNo;
                     43: char *To;
                     44: int ExitStat;
                     45: int Errors;
                     46: HDR *Header;
                     47: struct mailer *Mailer[MAXMAILERS+1];
                     48: int NextMailer = 0;
                     49: # ifdef DEBUG
                     50: int Debug;
                     51: # endif DEBUG
                     52: 
                     53: main(argc, argv)
                     54:        int argc;
                     55:        char *argv[];
                     56: {
                     57:        int f;
                     58:        char line[BUFSIZ];
                     59:        register char *p;
                     60:        char *p2;
                     61:        char *rhs;
                     62:        int naliases, bytes, longest;
                     63:        datum key, content;
                     64:        bool skipping;
                     65:        ADDRESS al, bl;
                     66:        extern char *prescan();
                     67:        extern ADDRESS *parse();
                     68:        bool contin;
                     69:        char *cffile = _PATH_SENDMAILCF;
                     70: 
                     71: # ifdef DEBUG
                     72:        if (argc > 1 && strcmp(argv[1], "-T") == 0)
                     73:        {
                     74:                Debug = 100;
                     75:                argc--;
                     76:                argv++;
                     77:        }
                     78: # endif DEBUG
                     79:        if (argc > 1)
                     80:                aliases = argv[1];
                     81:        if (argc > 2)
                     82:                cffile = argv[2];
                     83:        readcf(cffile);
                     84: 
                     85:        (void) strcpy(dirbuf, aliases);
                     86:        (void) strcat(dirbuf, ".dir");
                     87:        (void) strcpy(pagbuf, aliases);
                     88:        (void) strcat(pagbuf, ".pag");
                     89:        f = creat(dirbuf, 0666);
                     90:        if (f < 0) {
                     91:                perror(dirbuf);
                     92:                exit(1);
                     93:        }
                     94:        (void) close(f);
                     95:        f = creat(pagbuf, 0666);
                     96:        if (f < 0) {
                     97:                perror(pagbuf);
                     98:                exit(1);
                     99:        }
                    100:        (void) close(f);
                    101:        if (dbminit(aliases) < 0)
                    102:                exit(1);
                    103:        if (freopen(aliases, "r", stdin) == 0) {
                    104:                perror(aliases);
                    105:                exit(1);
                    106:        }
                    107: 
                    108:        /* read and interpret lines */
                    109:        LineNo = 0;
                    110:        naliases = 0;
                    111:        bytes = 0;
                    112:        longest = 0;
                    113:        skipping = FALSE;
                    114:        while (fgets(line, sizeof (line), stdin) != NULL)
                    115:        {
                    116:                LineNo++;
                    117:                switch (line[0])
                    118:                {
                    119:                  case '#':
                    120:                  case '\n':
                    121:                  case '\0':
                    122:                        skipping = FALSE;
                    123:                        continue;
                    124: 
                    125:                  case ' ':
                    126:                  case '\t':
                    127:                        if (!skipping)
                    128:                                usrerr("Non-continuation line starts with space");
                    129:                        skipping = TRUE;
                    130:                        continue;
                    131:                }
                    132:                skipping = FALSE;
                    133: 
                    134:                /* process the LHS */
                    135:                for (p = line; *p != '\0' && *p != ':' && *p != '\n'; p++)
                    136:                        continue;
                    137:                if (*p == '\0' || *p == '\n')
                    138:                {
                    139:                 syntaxerr:
                    140:                        usrerr("missing colon");
                    141:                        continue;
                    142:                }
                    143:                *p++ = '\0';
                    144:                if (parse(line, &al, 1) == NULL)
                    145:                {
                    146:                        *--p = ':';
                    147:                        goto syntaxerr;
                    148:                }
                    149:                rhs = p;
                    150:                contin = FALSE;
                    151:                for (;;)
                    152:                {
                    153:                        register char c;
                    154: 
                    155:                        /* do parsing & compression of addresses */
                    156:                        c = *p;
                    157:                        while (c != '\0')
                    158:                        {
                    159:                                p2 = p;
                    160:                                while (*p != '\n' && *p != ',' && *p != '\0')
                    161:                                        p++;
                    162:                                c = *p;
                    163:                                *p++ = '\0';
                    164:                                if (*p2 == '\0')
                    165:                                {
                    166:                                        p[-1] = c;
                    167:                                        continue;
                    168:                                }
                    169:                                parse(p2, &bl, -1);
                    170:                                contin = (c == ',');
                    171:                                p[-1] = c;
                    172:                                while (isspace(*p))
                    173:                                        p++;
                    174:                        }
                    175: 
                    176:                        /* see if there should be a continuation line */
                    177:                        if (!contin)
                    178:                                break;
                    179: 
                    180:                        /* read continuation line */
                    181:                        p--;
                    182:                        if (fgets(p, sizeof line - (p - line), stdin) == NULL)
                    183:                                break;
                    184:                        LineNo++;
                    185: 
                    186:                        if (!isspace(*p))
                    187:                                usrerr("continuation line missing");
                    188:                }
                    189:                if (al.q_mailer != MN_LOCAL)
                    190:                {
                    191:                        usrerr("cannot alias non-local names");
                    192:                        continue;
                    193:                }
                    194:                naliases++;
                    195:                key.dsize = strlen(al.q_user) + 1;
                    196:                key.dptr = al.q_user;
                    197:                content.dsize = strlen(rhs) + 1;
                    198:                if (content.dsize > longest)
                    199:                        longest = content.dsize;
                    200:                content.dptr = rhs;
                    201:                bytes += key.dsize + content.dsize;
                    202:                if (store(key, content), 0)
                    203:                /* if (f = store(key, content)) */
                    204:                        usrerr("Dbm internal error return %d from store\n", f);
                    205:        }
                    206:        fprintf(stderr, "%d aliases, %d bytes, longest %d bytes, %d errors\n",
                    207:            naliases, bytes, longest, Errors);
                    208: 
                    209:        exit(ExitStat);
                    210: }
                    211: 
                    212: usrerr(fmt, a, b, c, d, e)
                    213:        char *fmt;
                    214: {
                    215:        Errors++;
                    216:        fprintf(stderr, "line %d: ", LineNo);
                    217:        fprintf(stderr, fmt, a, b, c, d, e);
                    218:        fprintf(stderr, "\n");
                    219:        return (-1);
                    220: }
                    221: 
                    222: syserr(fmt, a, b, c, d, e)
                    223:        char *fmt;
                    224: {
                    225:        return (usrerr(fmt, a, b, c, d, e));
                    226: }

unix.superglobalmegacorp.com

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