home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / uucp / auucp+-1.02 / fuucp_plus_src.lzh / sendmail / domain.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-11-21  |  3.8 KB  |  182 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.  *  Changings for AmigaUUCP Plus Copyright (C) 1990 Ingo Feulner
  10.  *
  11.  */
  12.  
  13. #include "defs.h"
  14.  
  15. #define SYSTEM 1
  16. #define DOMAIN 2
  17.  
  18. Prototype DomainLookUp(char *, int, char *, int);
  19. Prototype CompareDomain(char **, short, char **, short);
  20.  
  21. extern void *xmalloc(unsigned int);
  22. extern void *__regargs strclean(char *);
  23.  
  24. int DomainLookUp(char *name, int len, char *ab, int flag)
  25. {
  26.     char *dary[16];
  27.     char *tmp = xmalloc(len + 1);
  28.     char *tbase = tmp;
  29.     short b, i;
  30.     short di;
  31.     FILE *fi;
  32.     short level = 0;        /*    best domain level found so far */
  33.     static char buf[256];
  34.  
  35.  
  36.     if(flag == SYSTEM) /* search for one single system entry in uulib:domain */
  37.     {
  38.       char *system;
  39.       short a;
  40.  
  41.       if((fi = fopen(MakeConfigPath(UULIB, "Domain"), "r")) != NULL)
  42.       {
  43.         while((fgets(buf, sizeof(buf), fi)) != NULL)
  44.         {
  45.       if(buf[0] == ' ' || buf[0] == 9 || buf[0] == '\n' || buf[0] == '#')
  46.         continue;
  47.  
  48.           system = xmalloc(strlen(buf) + 1);
  49.           for(a = 0; buf[a] != ' ' && buf[a] != '\t' && buf[a] != '\0'; a++)
  50.             system[a] = buf[a];
  51.           system[a] = '\0';
  52.  
  53.           if((strcmp(system, name)) == 0)
  54.           {
  55.             strcpy(ab, strclean(&buf[strlen(system)]));
  56.             level = 1;
  57.           }
  58.           
  59.         }
  60.         fclose(fi);
  61.       }
  62.       return(level > 0);
  63.     }
  64.         
  65.  
  66.     for (b = i = di = 0; i < len; ++i)
  67.     {
  68.     if (name[i] == '.')
  69.         {
  70.         if (di == sizeof(dary)/sizeof(dary[0]) - 1)
  71.             {
  72.         ulog(-1, "DomainLookup, too many domains! %s", name);
  73.         break;
  74.         }
  75.         strncpy(tmp, name + b, i - b);
  76.         tmp[i - b] = 0;
  77.         dary[di] = tmp;
  78.         tmp += i - b + 1;
  79.         b = i + 1;
  80.         ++di;
  81.     }
  82.     }
  83.     strncpy(tmp, name + b, i - b);
  84.     tmp[i - b] = 0;
  85.     dary[di++] = tmp;
  86.  
  87. #ifdef NOTDEF
  88.     {
  89.     short i;
  90.     for (i = 0; i < di; ++i)
  91.         printf("XX '%s'\n", dary[i]);
  92.     }
  93. #endif
  94.  
  95.     if (level == 0 && (fi = fopen(MakeConfigPath(UULIB, "Domain"), "r")))
  96.     {
  97.     while (fgets(buf, sizeof(buf), fi))
  98.         {
  99.         short l2;
  100.         short di2 = 0;
  101.         char *dary2[16];
  102.  
  103.         for (b = i = 0; buf[i] && buf[i] != ' ' && buf[i] != 9; ++i)
  104.             {
  105.         if (buf[i] == '.')
  106.                 {
  107.             if (di2 == sizeof(dary2)/sizeof(dary2[0]) - 1)
  108.                     {
  109.             ulog(-1, "%s, entry has too many subdomains: %s", MakeConfigPath(UULIB, "Domain"), buf);
  110.             break;
  111.             }
  112.             dary2[di2++] = buf + b;
  113.             buf[i] = 0;
  114.             b = i + 1;
  115.         }
  116.         }
  117.         buf[i] = 0;
  118.         dary2[di2++] = buf + b;
  119.  
  120.         buf[i] = 0;     /*  get domain name/wildcard        */
  121.  
  122.         l2 = CompareDomain(dary, di, dary2, di2);
  123.  
  124. #ifdef NOTDEF
  125.         {
  126.         short i;
  127.         printf("\nres %d\n", l2);
  128.         for (i = 0; i < di; ++i)
  129.             printf("#1 %s\n", dary[i]);
  130.         for (i = 0; i < di2; ++i)
  131.             printf("#2 %s\n", dary2[i]);
  132.         }
  133. #endif
  134.  
  135.         if (l2 > level) {   /*  better domain then what we have     */
  136.         sscanf(buf + i + 1, "%s", ab);
  137.         level = l2;
  138.         }
  139.     }
  140.     fclose(fi);
  141.     }
  142.  
  143.     free(tbase);
  144.     return(level > 0);
  145. }
  146.  
  147. /*
  148.  *  Compares a broken up address with a domain entry (buf).
  149.  */
  150.  
  151. int CompareDomain(char **da1, short di1, char **da2, short di2)
  152. {
  153.     short i, j;
  154.     short level = 0;
  155.  
  156.     for (i = di1 - 1, j = di2 - 1; i >= 0 && j >= 0; --i, --j)
  157.     {
  158.     if (da2[j][0] == '*')
  159.         {
  160.         ++level;
  161.         if (i && j == 0)    /*  so loop does not terminate  */
  162.         ++j;
  163.         continue;
  164.     }
  165.     if (strcmpi(da1[i], da2[j]) == 0)
  166.         level += 2;
  167.     else
  168.         {
  169.         if (j + 1 < di2 && da2[j+1][0] == '*')
  170.             {
  171.         ++level;
  172.         ++j;
  173.         }
  174.             else
  175.         return(0);
  176.     }
  177.     }
  178.     if (j >= 0)         /*  didn't exhaust domain entry */
  179.     return(0);
  180.     return((int)level);
  181. }
  182.