blob: 05c9d0043ccac7da209714661f23d5cf2446e805 [file] [log] [blame]
#include <u.h>
#include <libc.h>
#include <bio.h>
#include <ndb.h>
#include <ip.h>
#include <thread.h>
#include "dns.h"
Area *owned;
Area *delegated;
/*
* true if a name is in our area
*/
Area*
inmyarea(char *name)
{
int len;
Area *s, *d;
len = strlen(name);
for(s = owned; s; s = s->next){
if(s->len > len)
continue;
if(cistrcmp(s->soarr->owner->name, name + len - s->len) == 0)
if(len == s->len || name[len - s->len - 1] == '.')
break;
}
if(s == 0)
return 0;
for(d = delegated; d; d = d->next){
if(d->len > len)
continue;
if(cistrcmp(d->soarr->owner->name, name + len - d->len) == 0)
if(len == d->len || name[len - d->len - 1] == '.')
return 0;
}
return s;
}
/*
* our area is the part of the domain tree that
* we serve
*/
void
addarea(DN *dp, RR *rp, Ndbtuple *t)
{
Area **l, *s;
if(t->val[0])
l = &delegated;
else
l = &owned;
/*
* The area contains a copy of the soa rr that created it.
* The owner of the the soa rr should stick around as long
* as the area does.
*/
s = emalloc(sizeof(*s));
s->len = strlen(dp->name);
rrcopy(rp, &s->soarr);
s->soarr->owner = dp;
s->soarr->db = 1;
s->soarr->ttl = Hour;
s->neednotify = 1;
s->needrefresh = 0;
syslog(0, logfile, "new area %s", dp->name);
s->next = *l;
*l = s;
}
void
freearea(Area **l)
{
Area *s;
while(s = *l){
*l = s->next;
rrfree(s->soarr);
free(s);
}
}
/*
* refresh all areas that need it
* this entails running a command 'zonerefreshprogram'. This could
* copy over databases from elsewhere or just do a zone transfer.
*/
void
refresh_areas(Area *s)
{
Waitmsg *w;
char *argv[3];
argv[0] = zonerefreshprogram;
argv[1] = "XXX";
argv[2] = nil;
for(; s != nil; s = s->next){
if(!s->needrefresh)
continue;
if(zonerefreshprogram == nil){
s->needrefresh = 0;
continue;
}
argv[1] = s->soarr->owner->name;
w = runproc(argv[0], argv, 0);
free(w);
}
}