|
|
1.1 ! root 1: # include <stdio.h> ! 2: # include <ctype.h> ! 3: # include <pwd.h> ! 4: # include "dlvrmail.h" ! 5: ! 6: static char SccsId[] = "@(#)alias.c 1.8 10/28/80"; ! 7: ! 8: /* ! 9: ** ALIAS -- Compute aliases. ! 10: ** ! 11: ** Scans the file ALIASFILE for a set of aliases. ! 12: ** If found, it arranges to deliver to them by inserting the ! 13: ** new names onto the SendQ queue. Uses libdbm database if -DDBM. ! 14: ** ! 15: ** Parameters: ! 16: ** none ! 17: ** ! 18: ** Returns: ! 19: ** none ! 20: ** ! 21: ** Side Effects: ! 22: ** Aliases found on SendQ are removed and put onto ! 23: ** AliasQ; replacements are added to SendQ. This is ! 24: ** done until no such replacement occurs. ! 25: ** ! 26: ** Defined Constants: ! 27: ** MAXRCRSN -- the maximum recursion depth. ! 28: ** ! 29: ** Called By: ! 30: ** main ! 31: ** ! 32: ** Files: ! 33: ** ALIASFILE -- the mail aliases. The format is ! 34: ** a series of lines of the form: ! 35: ** alias:name1,name2,name3,... ! 36: ** where 'alias' expands to all of ! 37: ** 'name[i]'. Continuations begin with ! 38: ** space or tab. ! 39: ** ALIASFILE.pag, ALIASFILE.dir: libdbm version ! 40: ** of alias file. Keys are aliases, datums ! 41: ** (data?) are name1,name2, ... ! 42: ** ! 43: ** Notes: ! 44: ** If NoAlias (the "-n" flag) is set, no aliasing is ! 45: ** done. ! 46: ** ! 47: ** Deficiencies: ! 48: ** It should complain about names that are aliased to ! 49: ** nothing. ! 50: ** It is unsophisticated about line overflows. ! 51: */ ! 52: ! 53: ! 54: # define MAXRCRSN 10 ! 55: ! 56: #ifdef DBM ! 57: typedef struct {char *dptr; int dsize;} datum; ! 58: datum lhs, rhs; ! 59: extern datum fetch(); ! 60: #endif DBM ! 61: ! 62: alias() ! 63: { ! 64: register addrq *q; ! 65: addrq *q2; ! 66: FILE *af; ! 67: char line[MAXLINE+1]; ! 68: register char *p; ! 69: extern int errno; ! 70: bool didalias; ! 71: bool gotmatch; ! 72: auto addrq al; ! 73: extern bool sameaddr(); ! 74: extern addrq *parse(); ! 75: ! 76: if (NoAlias) ! 77: return; ! 78: # ifdef DEBUG ! 79: if (Debug) ! 80: printf("--- alias ---\n"); ! 81: # endif ! 82: ! 83: /* open alias file if not already open */ ! 84: #ifndef DBM ! 85: # ifdef DEBUG ! 86: if (Debug && (af = fopen("mailaliases", "r")) != NULL) ! 87: printf(" [using local alias file]\n"); ! 88: else ! 89: # endif ! 90: if ((af = fopen(ALIASFILE, "r")) == NULL) ! 91: { ! 92: # ifdef DEBUG ! 93: if (Debug) ! 94: printf("Can't open %s\n", ALIASFILE); ! 95: # endif ! 96: errno = 0; ! 97: return; ! 98: } ! 99: #else DBM ! 100: dbminit(ALIASFILE); ! 101: #endif DBM ! 102: ! 103: #ifndef DBM ! 104: /* ! 105: ** Scan alias file. ! 106: ** If we find any user that any line matches any user, we ! 107: ** will send to the line rather than to the user. ! 108: ** ! 109: ** We pass through the file several times. Didalias tells ! 110: ** us if we took some alias on this pass through the file; ! 111: ** when it goes false at the top of the loop we don't have ! 112: ** to scan any more. Gotmatch tells the same thing, but ! 113: ** on a line-by-line basis; it is used for processing ! 114: ** continuation lines. ! 115: */ ! 116: ! 117: do ! 118: { ! 119: didalias = FALSE; ! 120: gotmatch = FALSE; ! 121: rewind(af); ! 122: while (fgets(line, sizeof line, af) != NULL) ! 123: { ! 124: /* comments begin with `#' */ ! 125: if (line[0] == '#') ! 126: continue; ! 127: ! 128: /* check for continuation lines */ ! 129: if (isspace(line[0])) ! 130: { ! 131: if (gotmatch) ! 132: { ! 133: sendto(line, 1); ! 134: } ! 135: continue; ! 136: } ! 137: gotmatch = FALSE; ! 138: ! 139: /* ! 140: ** Check to see if this pseudonym exists in SendQ. ! 141: ** Turn the alias into canonical form. ! 142: ** Then scan SendQ until you do (or do not) ! 143: ** find that address. ! 144: */ ! 145: ! 146: /* Get a canonical form for the alias. */ ! 147: for (p = line; *p != '\0' && *p != ':' && *p != '\n'; p++) ! 148: continue; ! 149: if (*p == '\0' || *p == '\n') ! 150: { ! 151: syntaxerr: ! 152: syserr("Bad alias line `%s'", line); ! 153: continue; ! 154: } ! 155: *p++ = '\0'; ! 156: if (parse(line, &al, -1) == NULL) ! 157: { ! 158: *--p = ':'; ! 159: goto syntaxerr; ! 160: } ! 161: ! 162: /* Scan SendQ for that canonical form. */ ! 163: for (q = &SendQ; (q = nxtinq(q)) != NULL; ) ! 164: { ! 165: if (sameaddr(&al, q, TRUE)) ! 166: break; ! 167: } ! 168: if (q != NULL) ! 169: { ! 170: /* ! 171: ** Match on Alias. ! 172: ** Deliver to the target list. ! 173: ** Remove the alias from the send queue ! 174: ** and put it on the Alias queue. ! 175: */ ! 176: ! 177: # ifdef DEBUG ! 178: if (Debug) ! 179: printf("%s (%s, %s) aliased to %s (%s,%s,%s)\n", ! 180: q->q_paddr, q->q_host, q->q_user, ! 181: p, al.q_paddr, al.q_host, al.q_user); ! 182: # endif ! 183: tkoffq(q, &SendQ); ! 184: putonq(q, &AliasQ); ! 185: didalias++; ! 186: gotmatch++; ! 187: sendto(p, 1); ! 188: } ! 189: } ! 190: } while (didalias); ! 191: fclose(af); ! 192: #else DBM ! 193: /* ! 194: ** Scan SendQ ! 195: ** We only have to do this once, since anything we alias ! 196: ** two is being put at the end of the queue we are ! 197: ** scanning. ! 198: */ ! 199: ! 200: for (q2 = nxtinq(&SendQ); (q = q2) != NULL; ) ! 201: { ! 202: /* save ptr to next address */ ! 203: q2 = nxtinq(q); ! 204: ! 205: /* only alias local users */ ! 206: if (q->q_mailer != &Mailer[0]) ! 207: continue; ! 208: ! 209: /* create a key for fetch */ ! 210: lhs.dptr = q->q_user; ! 211: lhs.dsize = strlen(q->q_user) + 1; ! 212: rhs = fetch(lhs); ! 213: ! 214: /* find this alias? */ ! 215: p = rhs.dptr; ! 216: if (p == NULL) ! 217: continue; ! 218: ! 219: /* ! 220: ** Match on Alias. ! 221: ** Deliver to the target list. ! 222: ** Remove the alias from the send queue ! 223: ** and put it on the Alias queue. ! 224: */ ! 225: ! 226: # ifdef DEBUG ! 227: if (Debug) ! 228: printf("%s (%s, %s) aliased to %s\n", ! 229: q->q_paddr, q->q_host, q->q_user, p); ! 230: # endif ! 231: tkoffq(q, &SendQ); ! 232: putonq(q, &AliasQ); ! 233: sendto(p, 1); ! 234: ! 235: /* if our last entry had an alias, process them */ ! 236: if (q2 == NULL) ! 237: q2 = nxtinq(&SendQ); ! 238: } ! 239: #endif DBM ! 240: } ! 241: /* ! 242: ** FORWARD -- Try to forward mail ! 243: ** ! 244: ** This is similar but not identical to aliasing. ! 245: ** ! 246: ** Currently it is undefined, until the protocol for userinfo ! 247: ** databases is finalized. ! 248: ** ! 249: ** Parameters: ! 250: ** user -- the name of the user who's mail we ! 251: ** would like to forward to. ! 252: ** ! 253: ** Returns: ! 254: ** TRUE -- we have forwarded it somewhere. ! 255: ** FALSE -- not forwarded; go ahead & deliver. ! 256: ** ! 257: ** Side Effects: ! 258: ** New names are added to SendQ. ! 259: ** ! 260: ** Called By: ! 261: ** recipient ! 262: */ ! 263: ! 264: bool ! 265: forward(user) ! 266: addrq *user; ! 267: { ! 268: return (FALSE); ! 269: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.