Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <ndb.h>
5 #include <ip.h>
6 #include <thread.h>
7 #include "dns.h"
9 Area *owned;
10 Area *delegated;
12 /*
13 * true if a name is in our area
14 */
15 Area*
16 inmyarea(char *name)
17 {
18 int len;
19 Area *s, *d;
21 len = strlen(name);
22 for(s = owned; s; s = s->next){
23 if(s->len > len)
24 continue;
25 if(cistrcmp(s->soarr->owner->name, name + len - s->len) == 0)
26 if(len == s->len || name[len - s->len - 1] == '.')
27 break;
28 }
29 if(s == 0)
30 return 0;
32 for(d = delegated; d; d = d->next){
33 if(d->len > len)
34 continue;
35 if(cistrcmp(d->soarr->owner->name, name + len - d->len) == 0)
36 if(len == d->len || name[len - d->len - 1] == '.')
37 return 0;
38 }
40 return s;
41 }
43 /*
44 * our area is the part of the domain tree that
45 * we serve
46 */
47 void
48 addarea(DN *dp, RR *rp, Ndbtuple *t)
49 {
50 Area **l, *s;
52 if(t->val[0])
53 l = &delegated;
54 else
55 l = &owned;
57 /*
58 * The area contains a copy of the soa rr that created it.
59 * The owner of the the soa rr should stick around as long
60 * as the area does.
61 */
62 s = emalloc(sizeof(*s));
63 s->len = strlen(dp->name);
64 rrcopy(rp, &s->soarr);
65 s->soarr->owner = dp;
66 s->soarr->db = 1;
67 s->soarr->ttl = Hour;
68 s->neednotify = 1;
69 s->needrefresh = 0;
71 syslog(0, logfile, "new area %s", dp->name);
73 s->next = *l;
74 *l = s;
75 }
77 void
78 freearea(Area **l)
79 {
80 Area *s;
82 while(s = *l){
83 *l = s->next;
84 rrfree(s->soarr);
85 free(s);
86 }
87 }
89 /*
90 * refresh all areas that need it
91 * this entails running a command 'zonerefreshprogram'. This could
92 * copy over databases from elsewhere or just do a zone transfer.
93 */
94 void
95 refresh_areas(Area *s)
96 {
97 Waitmsg *w;
98 char *argv[3];
100 argv[0] = zonerefreshprogram;
101 argv[1] = "XXX";
102 argv[2] = nil;
104 for(; s != nil; s = s->next){
105 if(!s->needrefresh)
106 continue;
108 if(zonerefreshprogram == nil){
109 s->needrefresh = 0;
110 continue;
113 argv[1] = s->soarr->owner->name;
114 w = runproc(argv[0], argv, 0);
115 free(w);