#include #include #include #include "route.h" /* checks to see if some site exists or can be faked out... */ indb(site,dest) char *site, *dest; { } known(site, path) char *site, *path; { register char *p = site; register st; if (indb(site,path)) return 1; while (p=strchr(p, '.')) { if (indb(p, path)) { if (path[0]) return 1; *p = 0; st = indb(site, path); *p = '.'; return st; } ++p; } return 0; } mailto(address) char *address; { char to[200], residue[200], path[200]; switch (getnext(address, to, residue)) { case ADDR_BAD: reject(); break; case ADDR_DOMAIN: if (known(to, path)) forward(path, residue); else if (domserver(path)) forward(path, address); else reject(); break; case ADDR_BANG: forward(to, residue); break; default: if (localmail(address) == 0) reject(); break; } } getnext(address, to, residue) char *address, *to, *residue; { register char *p; register char *q; char temp[80]; if (p=strrchr(address, '@')) { /* domain addressing - mail directly to rhs, do not pass go, do * not collect $200 */ strncpy(residue, address, (int)(p-address)); residue[(int)(p-address)] = 0; strcpy(to, 1+p); return ADDR_DOMAIN; } else if (p=strchr(address, '!')) { /* bangpath - attempt to find quickest way into the path */ q = strrchr(address, '!'); while (p >= address) { for (p=q-1; p>=address && *p != '!'; --p) ; strncpy(temp, 1+p, (int)(q-(1+p))); temp[(int)(q-(1+p))] = 0; if (known(temp, to)) { strcpy(residue, q+1); return ADDR_BANG; } q = p; } return ADDR_BAD; } return ADDR_LOCAL; } reject() { printf("reject\n"); } forward(site, residue) char *site, *residue; { if (strcmp(site, localname) == 0) mailto(residue); else uucpmail(site); } localmail(who) char *who; { printf("localmail %s\n", who); /* write message into local users mailbox */ return 0; } domserver(path_to_it) char *path_to_it; { printf("domserver\n"); return 0; } indb(place, path) char *place, *path; { printf("indb %s\n", place); if (strcmp(place, localname) == 0) { strcpy(path, localname); return 1; } return 0; } uucpmail(site) char *site; { printf("uucpmail %s\n", site); /* set up spoolfile for uucp mail; set flag so mail close routine will * add the sendfile commands to the workfile for the site in question */ }