home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / fish / telecom / uucp_442 / src / sendmail / domain.c < prev    next >
C/C++ Source or Header  |  1990-12-26  |  5KB  |  216 lines

  1.  
  2. /*
  3.  *  DOMAIN.C
  4.  *
  5.  *  $Header: Beta:src/uucp/src/sendmail/RCS/domain.c,v 1.1 90/02/02 12:14:59 dillon Exp Locker: dillon $
  6.  *
  7.  *  (C) Copyright 1989-1990 by Matthew Dillon,  All Rights Reserved.
  8.  *
  9.  *  Given the first machine in a path scan the domain list and
  10.  *  return the type, class, and address of the resource entry.
  11.  *
  12.  *  AUTOMATIC HACKS:    scans L.sys file and automatically deals
  13.  *            with machine[.UUCP] domain, returning
  14.  *            Type=MD Class=UU Addr=machine.UUCP
  15.  */
  16.  
  17. #include "defs.h"
  18.  
  19. Prototype DomainLookup(char *, int, char *, char *, char *);
  20. Prototype CompareDomain(char **, short, char **, short);
  21.  
  22. extern char *DefaultNode;
  23. extern char *NodeName;
  24.  
  25. int
  26. DomainLookup(name, len, tb, cb, ab)
  27. char *name;
  28. int len;
  29. char *tb;
  30. char *cb;
  31. char *ab;
  32. {
  33.     char *dary[16];
  34.     char *tmp = malloc(len + 1);
  35.     char *tbase = tmp;
  36.     short b, i;
  37.     short di;
  38.     FILE *fi;
  39.     short level;        /*    best domain level found so far */
  40.     static char buf[256];
  41.  
  42.     for (b = i = di = 0; i < len && name[i] != '!'; ++i) {
  43.     if (name[i] == '.') {
  44.         if (di == sizeof(dary)/sizeof(dary[0]) - 1) {
  45.         ulog(-1, "DomainLookup, too many domains! %s", name);
  46.         break;
  47.         }
  48.         strncpy(tmp, name + b, i - b);
  49.         tmp[i - b] = 0;
  50.         dary[di] = tmp;
  51.         tmp += i - b + 1;
  52.         b = i + 1;
  53.         ++di;
  54.     }
  55.     }
  56.     strncpy(tmp, name + b, i - b);
  57.     tmp[i - b] = 0;
  58.     dary[di++] = tmp;
  59.  
  60. #ifdef NOTDEF
  61.     {
  62.     short i;
  63.     for (i = 0; i < di; ++i)
  64.         printf("XX '%s'\n", dary[i]);
  65.     }
  66. #endif
  67.  
  68.     /*
  69.      *    Check local mail.  If local mail return a dummy UUCP domain
  70.      *    for ourself.  This will cause the mail to be queued for
  71.      *    immediate execution.  Sendmail may not run UUXQT as this can
  72.      *    cause mail loops.  Since the user has not been run through
  73.      *    aliases we cannot simply post it locally, but must go through
  74.      *    another mail run.
  75.      */
  76.  
  77.     level = 0;
  78.  
  79.     if (strcmpi(dary[0], NodeName) == 0) {
  80.     strcpy(tb, "MD");
  81.     strcpy(cb, "UU");
  82.     strcpy(ab, NodeName);
  83.     strcat(ab, ".uucp");
  84.     level = 1;
  85.     }
  86.  
  87.     if (level == 0 && (fi = fopen(MakeConfigPath(UULIB, "Domain"), "r"))) {
  88.     while (fgets(buf, sizeof(buf), fi)) {
  89.         short l2;
  90.         short di2 = 0;
  91.         char *dary2[16];
  92.  
  93.         if (buf[0] == ' ' || buf[0] == 9 || buf[0] == '\n' || buf[0] == '#')
  94.         continue;
  95.         for (b = i = 0; buf[i] && buf[i] != ' ' && buf[i] != 9; ++i) {
  96.         if (buf[i] == '.') {
  97.             if (di2 == sizeof(dary2)/sizeof(dary2[0]) - 1) {
  98.             ulog(-1, "%s, entry has too many subdomains: %s", MakeConfigPath(UULIB, "Domain"), buf);
  99.             break;
  100.             }
  101.             dary2[di2++] = buf + b;
  102.             buf[i] = 0;
  103.             b = i + 1;
  104.         }
  105.         }
  106.         buf[i] = 0;
  107.         dary2[di2++] = buf + b;
  108.  
  109.         buf[i] = 0;     /*  get domain name/wildcard        */
  110.  
  111.         l2 = CompareDomain(dary, di, dary2, di2);
  112.  
  113. #ifdef NOTDEF
  114.         {
  115.         short i;
  116.         printf("\nres %d\n", l2);
  117.         for (i = 0; i < di; ++i)
  118.             printf("#1 %s\n", dary[i]);
  119.         for (i = 0; i < di2; ++i)
  120.             printf("#2 %s\n", dary2[i]);
  121.         }
  122. #endif
  123.  
  124.         if (l2 > level) {   /*  better domain then what we have     */
  125.         sscanf(buf + i + 1, "%s %s %s", tb, cb, ab);
  126.         level = l2;
  127.         }
  128.     }
  129.     fclose(fi);
  130.     }
  131.  
  132.     /*
  133.      *    Couldn't find the appropriate domain entry, check L.sys
  134.      *    OR domain entry is a forwarder, check L.sys
  135.      */
  136.  
  137.     if (strcmp(tb, "MF") == 0 || level == 0) {
  138.     if (fi = fopen(MakeConfigPath(UULIB, "L.sys"), "r")) {
  139.         while (fgets(buf, sizeof(buf), fi)) {
  140.         if (buf[0] == ' ' || buf[0] == 9 || buf[0] == '#' || buf[0] == '\n')
  141.             continue;
  142.         for (i = 0; buf[i] && buf[i] != ' ' && buf[i] != 9; ++i);
  143.         buf[i] = 0;
  144.         if (strcmpi(dary[0], buf) == 0) {
  145.             strcpy(tb, "MD");
  146.             strcpy(cb, "UU");
  147.             strcpy(ab, buf);
  148.             strcat(ab, ".uucp");
  149.             level = 1;
  150.             break;
  151.         }
  152.         }
  153.         fclose(fi);
  154.     }
  155.     }
  156.  
  157.     /*
  158.      *    Couldn't find nothing, use DefaultNode
  159.      */
  160.  
  161.     if (level == 0) {
  162.     ulog(-1, "Warning, unable to interpret addr %s, using DefaultNode", name);
  163.     if (DefaultNode == NULL) {
  164.         ulog(-1, "Error, DefaultNode must exist if no Domain file");
  165.         printf("ERROR, no entry in Domain, L.sys, and\n");
  166.         printf("no DefaultNode config entry for %s\n", name);
  167.         puts("cannot send mail");
  168.         free(tbase);
  169.         return(0);
  170.     }
  171.     strcpy(tb, "MF");
  172.     strcpy(cb, "UU");
  173.     strcpy(ab, DefaultNode);
  174.     level = 1;
  175.     }
  176.     free(tbase);
  177.     return(level > 0);
  178. }
  179.  
  180. /*
  181.  *  Compares a broken up address with a domain entry (buf).
  182.  */
  183.  
  184. int
  185. CompareDomain(da1, di1, da2, di2)
  186. char **da1;
  187. short di1;
  188. char **da2;
  189. short di2;
  190. {
  191.     short i, j;
  192.     short level = 0;
  193.  
  194.     for (i = di1 - 1, j = di2 - 1; i >= 0 && j >= 0; --i, --j) {
  195.     if (da2[j][0] == '*') {
  196.         ++level;
  197.         if (i && j == 0)    /*  so loop does not terminate  */
  198.         ++j;
  199.         continue;
  200.     }
  201.     if (strcmpi(da1[i], da2[j]) == 0)
  202.         level += 2;
  203.     else {
  204.         if (j + 1 < di2 && da2[j+1][0] == '*') {
  205.         ++level;
  206.         ++j;
  207.         } else
  208.         return(0);
  209.     }
  210.     }
  211.     if (j >= 0)         /*  didn't exhaust domain entry */
  212.     return(0);
  213.     return((int)level);
  214. }
  215.  
  216.