home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * DOMAIN.C
- *
- * $Header: Beta:src/uucp/src/sendmail/RCS/domain.c,v 1.1 90/02/02 12:14:59 dillon Exp Locker: dillon $
- *
- * (C) Copyright 1989-1990 by Matthew Dillon, All Rights Reserved.
- *
- * Changings for AmigaUUCP Plus Copyright (C) 1990 Ingo Feulner
- *
- */
-
- #include "defs.h"
-
- #define SYSTEM 1
- #define DOMAIN 2
-
- Prototype DomainLookUp(char *, int, char *, int);
- Prototype CompareDomain(char **, short, char **, short);
-
- extern void *xmalloc(unsigned int);
- extern void *__regargs strclean(char *);
-
- int DomainLookUp(char *name, int len, char *ab, int flag)
- {
- char *dary[16];
- char *tmp = xmalloc(len + 1);
- char *tbase = tmp;
- short b, i;
- short di;
- FILE *fi;
- short level = 0; /* best domain level found so far */
- static char buf[256];
-
-
- if(flag == SYSTEM) /* search for one single system entry in uulib:domain */
- {
- char *system;
- short a;
-
- if((fi = fopen(MakeConfigPath(UULIB, "Domain"), "r")) != NULL)
- {
- while((fgets(buf, sizeof(buf), fi)) != NULL)
- {
- if(buf[0] == ' ' || buf[0] == 9 || buf[0] == '\n' || buf[0] == '#')
- continue;
-
- system = xmalloc(strlen(buf) + 1);
- for(a = 0; buf[a] != ' ' && buf[a] != '\t' && buf[a] != '\0'; a++)
- system[a] = buf[a];
- system[a] = '\0';
-
- if((strcmp(system, name)) == 0)
- {
- strcpy(ab, strclean(&buf[strlen(system)]));
- level = 1;
- }
-
- }
- fclose(fi);
- }
- return(level > 0);
- }
-
-
- for (b = i = di = 0; i < len; ++i)
- {
- if (name[i] == '.')
- {
- if (di == sizeof(dary)/sizeof(dary[0]) - 1)
- {
- ulog(-1, "DomainLookup, too many domains! %s", name);
- break;
- }
- strncpy(tmp, name + b, i - b);
- tmp[i - b] = 0;
- dary[di] = tmp;
- tmp += i - b + 1;
- b = i + 1;
- ++di;
- }
- }
- strncpy(tmp, name + b, i - b);
- tmp[i - b] = 0;
- dary[di++] = tmp;
-
- #ifdef NOTDEF
- {
- short i;
- for (i = 0; i < di; ++i)
- printf("XX '%s'\n", dary[i]);
- }
- #endif
-
- if (level == 0 && (fi = fopen(MakeConfigPath(UULIB, "Domain"), "r")))
- {
- while (fgets(buf, sizeof(buf), fi))
- {
- short l2;
- short di2 = 0;
- char *dary2[16];
-
- for (b = i = 0; buf[i] && buf[i] != ' ' && buf[i] != 9; ++i)
- {
- if (buf[i] == '.')
- {
- if (di2 == sizeof(dary2)/sizeof(dary2[0]) - 1)
- {
- ulog(-1, "%s, entry has too many subdomains: %s", MakeConfigPath(UULIB, "Domain"), buf);
- break;
- }
- dary2[di2++] = buf + b;
- buf[i] = 0;
- b = i + 1;
- }
- }
- buf[i] = 0;
- dary2[di2++] = buf + b;
-
- buf[i] = 0; /* get domain name/wildcard */
-
- l2 = CompareDomain(dary, di, dary2, di2);
-
- #ifdef NOTDEF
- {
- short i;
- printf("\nres %d\n", l2);
- for (i = 0; i < di; ++i)
- printf("#1 %s\n", dary[i]);
- for (i = 0; i < di2; ++i)
- printf("#2 %s\n", dary2[i]);
- }
- #endif
-
- if (l2 > level) { /* better domain then what we have */
- sscanf(buf + i + 1, "%s", ab);
- level = l2;
- }
- }
- fclose(fi);
- }
-
- free(tbase);
- return(level > 0);
- }
-
- /*
- * Compares a broken up address with a domain entry (buf).
- */
-
- int CompareDomain(char **da1, short di1, char **da2, short di2)
- {
- short i, j;
- short level = 0;
-
- for (i = di1 - 1, j = di2 - 1; i >= 0 && j >= 0; --i, --j)
- {
- if (da2[j][0] == '*')
- {
- ++level;
- if (i && j == 0) /* so loop does not terminate */
- ++j;
- continue;
- }
- if (strcmpi(da1[i], da2[j]) == 0)
- level += 2;
- else
- {
- if (j + 1 < di2 && da2[j+1][0] == '*')
- {
- ++level;
- ++j;
- }
- else
- return(0);
- }
- }
- if (j >= 0) /* didn't exhaust domain entry */
- return(0);
- return((int)level);
- }
-