1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
/* pathalias -- by steve bellovin, as told to peter honeyman */
#ifndef lint
static char *sccsid = "@(#)domain.c 9.5 92/08/25";
static char *rcsid = "@(#)smail/pd/pathalias:RELEASE-3_2_0_102:domain.c,v 1.5 1998/02/15 23:13:29 woods Exp";
#endif /* lint */
#define NEED_SOCKETS /* only for smail-3 */
#include "def.h"
/* imports */
extern dom *newdom();
extern char *strsave();
extern int errno, Vflag;
/* exports */
/* privates */
static dom *good, *bad;
/*
* good and bad are passed by reference for move-to-front
*/
isadomain(domain)
char *domain;
{
if (ondomlist(&good, domain)) {
Vprintf(stderr, "%s on\n", domain);
return 1;
}
if (ondomlist(&bad, domain)) {
Vprintf(stderr, "%s off\n", domain);
return 0;
}
if (nslookup(domain)) {
adddom(&good, domain);
Vprintf(stderr, "%s add\n", domain);
return 1;
} else {
adddom(&bad, domain);
Vprintf(stderr, "%s del\n", domain);
return 0;
}
}
ondomlist(headp, domain)
dom **headp;
char *domain;
{ dom *d, *head = *headp;
for (d = head; d != 0; d = d->next) {
if (strcmp(d->name, domain) == 0) {
if (d != head)
movetofront(headp, d);
return 1;
}
}
return 0;
}
adddom(headp, domain)
dom **headp;
char *domain;
{ dom *d, *head = *headp;
d = newdom();
d->next = head;
d->name = strsave(domain);
if (d->next)
d->next->prev = d;
*headp = d;
}
movetofront(headp, d)
dom **headp, *d;
{ dom *head = *headp;
if (d->prev)
d->prev->next = d->next;
if (d->next)
d->next->prev = d->prev;
if (head)
head->prev = d;
d->next = head;
*headp = d;
}
#ifdef RESOLVER
nslookup(domain)
char *domain;
{ register HEADER *hp;
register int n;
char q[PACKETSZ], a[PACKETSZ]; /* query, answer */
char buf[PACKETSZ+1];
if ((n = strlen(domain)) >= PACKETSZ)
return 0;
strcpy(buf, domain);
if (buf[n-1] != '.') {
buf[n++] = '.';
buf[n] = 0;
}
/*
* LIES! DAMN LIES!
*
* The manual page resolver(3) says arg#7 is (struct rrec *) but the
* prototypes say (const char *), others say (const u_char *).
*
* Note though that res_mkquery() is not used by the rest of
* smail-3 if OBSOLETE_ERSOLVER is defined [XXX use res_search()].
*/
if ((n = res_mkquery(QUERY, buf, C_IN, T_ANY, (unsigned char *) NULL, 0,
(struct rrec *) NULL, (unsigned char *) q,
sizeof(q))) < 0)
die("impossible res_mkquery error");
errno = 0;
if ((n = res_send((unsigned char *) q, n, (unsigned char *) a, sizeof(a))) < 0)
die("res_send");
hp = (HEADER *) a;
if (hp->rcode == NOERROR)
return 1;
return 0;
}
#else /*!RESOLVER*/
/*ARGSUSED*/
nslookup(domain)
char *domain;
{
return 0; /* i guess !?! */
}
#endif /*RESOLVER*/
|