Blame


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