Blame


1 d957951b 2005-02-11 devnull #include <u.h>
2 d957951b 2005-02-11 devnull #include <libc.h>
3 d957951b 2005-02-11 devnull #include <bio.h>
4 d957951b 2005-02-11 devnull #include <ndb.h>
5 d957951b 2005-02-11 devnull #include <ip.h>
6 d957951b 2005-02-11 devnull
7 d957951b 2005-02-11 devnull typedef struct x
8 d957951b 2005-02-11 devnull {
9 d957951b 2005-02-11 devnull Ndbtuple *t;
10 d957951b 2005-02-11 devnull Ndbtuple *it;
11 d957951b 2005-02-11 devnull Ndbtuple *nt;
12 d957951b 2005-02-11 devnull } X;
13 d957951b 2005-02-11 devnull
14 d957951b 2005-02-11 devnull X x[4096];
15 d957951b 2005-02-11 devnull int nx;
16 d957951b 2005-02-11 devnull char *domname = "research.att.com";
17 d957951b 2005-02-11 devnull int domnamlen;
18 d957951b 2005-02-11 devnull
19 d957951b 2005-02-11 devnull char*
20 d957951b 2005-02-11 devnull upper(char *x)
21 d957951b 2005-02-11 devnull {
22 d957951b 2005-02-11 devnull char *p;
23 d957951b 2005-02-11 devnull int c;
24 d957951b 2005-02-11 devnull
25 d957951b 2005-02-11 devnull for(p = x; c = *p; p++)
26 d957951b 2005-02-11 devnull *p = toupper(c);
27 d957951b 2005-02-11 devnull return x;
28 d957951b 2005-02-11 devnull }
29 d957951b 2005-02-11 devnull
30 d957951b 2005-02-11 devnull void
31 d957951b 2005-02-11 devnull printArecord(int fd, X *p)
32 d957951b 2005-02-11 devnull {
33 d957951b 2005-02-11 devnull Ndbtuple *nt;
34 d957951b 2005-02-11 devnull char *c;
35 d957951b 2005-02-11 devnull char *dom = 0;
36 d957951b 2005-02-11 devnull char *curdom = 0;
37 d957951b 2005-02-11 devnull int i, cdlen = 0;
38 d957951b 2005-02-11 devnull int mxweight = 0;
39 d957951b 2005-02-11 devnull
40 d957951b 2005-02-11 devnull if(p->nt) {
41 d957951b 2005-02-11 devnull return;
42 d957951b 2005-02-11 devnull }
43 d957951b 2005-02-11 devnull for(nt=p->t; nt; nt = nt->entry) {
44 d957951b 2005-02-11 devnull /* we are only going to handle things in the specified domain */
45 d957951b 2005-02-11 devnull c = strchr(nt->val, '.');
46 d957951b 2005-02-11 devnull if (c==0 || strcmp(++c, domname)!=0)
47 d957951b 2005-02-11 devnull continue;
48 d957951b 2005-02-11 devnull i = c - nt->val - 1;
49 d957951b 2005-02-11 devnull if(strcmp(nt->attr, "dom") == 0) {
50 d957951b 2005-02-11 devnull curdom = nt->val;
51 d957951b 2005-02-11 devnull cdlen = i;
52 d957951b 2005-02-11 devnull if (dom == 0) {
53 d957951b 2005-02-11 devnull dom = curdom;
54 d957951b 2005-02-11 devnull fprint(fd, "%-.*s%.*s IN A %s\n", i, nt->val, 15-i, " ", p->it->val);
55 d957951b 2005-02-11 devnull } else
56 d957951b 2005-02-11 devnull fprint(fd, "%-.*s%.*s IN CNAME %s.\n", i, nt->val, 15-i, " ", dom);
57 d957951b 2005-02-11 devnull } else if(strcmp(nt->attr, "mx") == 0) {
58 d957951b 2005-02-11 devnull if (curdom != 0)
59 d957951b 2005-02-11 devnull fprint(fd, "%-.*s%.*s MX %d %s.\n", cdlen, curdom, 15-cdlen, " ", mxweight++, nt->val);
60 d957951b 2005-02-11 devnull }
61 d957951b 2005-02-11 devnull }
62 d957951b 2005-02-11 devnull }
63 d957951b 2005-02-11 devnull
64 d957951b 2005-02-11 devnull void
65 d957951b 2005-02-11 devnull printentry(int fd, X *p)
66 d957951b 2005-02-11 devnull {
67 d957951b 2005-02-11 devnull Ndbtuple *nt;
68 d957951b 2005-02-11 devnull
69 d957951b 2005-02-11 devnull if(p->nt)
70 d957951b 2005-02-11 devnull return;
71 d957951b 2005-02-11 devnull fprint(fd, "%s ", p->it->val);
72 d957951b 2005-02-11 devnull for(nt = p->t; nt; nt = nt->entry)
73 d957951b 2005-02-11 devnull if(strcmp(nt->attr, "dom") == 0)
74 d957951b 2005-02-11 devnull fprint(fd, " %s", nt->val);
75 d957951b 2005-02-11 devnull for(nt = p->t; nt; nt = nt->entry)
76 d957951b 2005-02-11 devnull if(strcmp(nt->attr, "sys") == 0)
77 d957951b 2005-02-11 devnull fprint(fd, " %s", nt->val);
78 d957951b 2005-02-11 devnull fprint(fd, "\n");
79 d957951b 2005-02-11 devnull }
80 d957951b 2005-02-11 devnull
81 d957951b 2005-02-11 devnull void
82 d957951b 2005-02-11 devnull printsys(int fd, X *p)
83 d957951b 2005-02-11 devnull {
84 d957951b 2005-02-11 devnull Ndbtuple *nt;
85 d957951b 2005-02-11 devnull
86 d957951b 2005-02-11 devnull for(nt = p->t; nt; nt = nt->entry)
87 d957951b 2005-02-11 devnull if(strcmp(nt->attr, "dom") == 0)
88 d957951b 2005-02-11 devnull fprint(fd, "%s\n", nt->val);
89 d957951b 2005-02-11 devnull }
90 d957951b 2005-02-11 devnull
91 d957951b 2005-02-11 devnull void
92 d957951b 2005-02-11 devnull printtxt(int fd, X *p)
93 d957951b 2005-02-11 devnull {
94 d957951b 2005-02-11 devnull int i;
95 d957951b 2005-02-11 devnull Ndbtuple *nt;
96 d957951b 2005-02-11 devnull
97 d957951b 2005-02-11 devnull if(p->nt){
98 d957951b 2005-02-11 devnull for(;;){
99 d957951b 2005-02-11 devnull i = strlen(p->it->val);
100 d957951b 2005-02-11 devnull if(strcmp(p->it->val+i-2, ".0") == 0)
101 d957951b 2005-02-11 devnull p->it->val[i-2] = 0;
102 d957951b 2005-02-11 devnull else
103 d957951b 2005-02-11 devnull break;
104 d957951b 2005-02-11 devnull }
105 d957951b 2005-02-11 devnull fprint(fd, "\nNET : %s : %s\n", p->it->val, upper(p->nt->val));
106 d957951b 2005-02-11 devnull return;
107 d957951b 2005-02-11 devnull }
108 d957951b 2005-02-11 devnull fprint(fd, "HOST : %s :", p->it->val);
109 d957951b 2005-02-11 devnull i = 0;
110 d957951b 2005-02-11 devnull for(nt = p->t; nt; nt = nt->entry)
111 d957951b 2005-02-11 devnull if(strcmp(nt->attr, "dom") == 0){
112 d957951b 2005-02-11 devnull if(i++ == 0)
113 d957951b 2005-02-11 devnull fprint(fd, " %s", upper(nt->val));
114 d957951b 2005-02-11 devnull else
115 d957951b 2005-02-11 devnull fprint(fd, ", %s", upper(nt->val));
116 d957951b 2005-02-11 devnull }
117 d957951b 2005-02-11 devnull fprint(fd, "\n");
118 d957951b 2005-02-11 devnull }
119 d957951b 2005-02-11 devnull
120 d957951b 2005-02-11 devnull void
121 d957951b 2005-02-11 devnull parse(char *file)
122 d957951b 2005-02-11 devnull {
123 d957951b 2005-02-11 devnull int i;
124 d957951b 2005-02-11 devnull Ndb *db;
125 d957951b 2005-02-11 devnull Ndbtuple *t, *nt, *tt, *ipnett;
126 d957951b 2005-02-11 devnull char *p;
127 d957951b 2005-02-11 devnull
128 d957951b 2005-02-11 devnull db = ndbopen(file);
129 d957951b 2005-02-11 devnull if(db == 0)
130 d957951b 2005-02-11 devnull exits("no database");
131 d957951b 2005-02-11 devnull while(t = ndbparse(db)){
132 d957951b 2005-02-11 devnull for(nt = t; nt; nt = nt->entry){
133 d957951b 2005-02-11 devnull if(strcmp(nt->attr, "ip") == 0)
134 d957951b 2005-02-11 devnull break;
135 d957951b 2005-02-11 devnull if(strcmp(nt->attr, "flavor") == 0
136 d957951b 2005-02-11 devnull && strcmp(nt->val, "console") == 0)
137 d957951b 2005-02-11 devnull return;
138 d957951b 2005-02-11 devnull }
139 d957951b 2005-02-11 devnull if(nt == 0){
140 d957951b 2005-02-11 devnull ndbfree(t);
141 d957951b 2005-02-11 devnull continue;
142 d957951b 2005-02-11 devnull }
143 d957951b 2005-02-11 devnull
144 d957951b 2005-02-11 devnull /* dump anything not on our nets */
145 d957951b 2005-02-11 devnull ipnett = 0;
146 d957951b 2005-02-11 devnull for(tt = t; tt; tt = tt->entry){
147 d957951b 2005-02-11 devnull if(strcmp(tt->attr, "ipnet") == 0){
148 d957951b 2005-02-11 devnull ipnett = tt;
149 d957951b 2005-02-11 devnull break;
150 d957951b 2005-02-11 devnull }
151 d957951b 2005-02-11 devnull if(strcmp(tt->attr, "dom") == 0){
152 d957951b 2005-02-11 devnull i = strlen(tt->val);
153 d957951b 2005-02-11 devnull p = tt->val+i-domnamlen;
154 d957951b 2005-02-11 devnull if(p >= tt->val && strcmp(p, domname) == 0)
155 d957951b 2005-02-11 devnull break;
156 d957951b 2005-02-11 devnull }
157 d957951b 2005-02-11 devnull }
158 d957951b 2005-02-11 devnull if(tt == 0){
159 d957951b 2005-02-11 devnull ndbfree(t);
160 d957951b 2005-02-11 devnull continue;
161 d957951b 2005-02-11 devnull }
162 d957951b 2005-02-11 devnull
163 d957951b 2005-02-11 devnull for(; nt; nt = nt->entry){
164 d957951b 2005-02-11 devnull if(strcmp(nt->attr, "ip") != 0)
165 d957951b 2005-02-11 devnull continue;
166 d957951b 2005-02-11 devnull x[nx].it = nt;
167 d957951b 2005-02-11 devnull x[nx].nt = ipnett;
168 d957951b 2005-02-11 devnull x[nx++].t = t;
169 d957951b 2005-02-11 devnull }
170 d957951b 2005-02-11 devnull }
171 d957951b 2005-02-11 devnull }
172 d957951b 2005-02-11 devnull
173 d957951b 2005-02-11 devnull void
174 d957951b 2005-02-11 devnull main(int argc, char *argv[])
175 d957951b 2005-02-11 devnull {
176 d957951b 2005-02-11 devnull int i, fd;
177 d957951b 2005-02-11 devnull char fn[128];
178 d957951b 2005-02-11 devnull
179 d957951b 2005-02-11 devnull if (argc>1)
180 d957951b 2005-02-11 devnull domname = argv[1];
181 d957951b 2005-02-11 devnull domnamlen = strlen(domname);
182 d957951b 2005-02-11 devnull if(argc > 2){
183 d957951b 2005-02-11 devnull for(i = 2; i < argc; i++)
184 d957951b 2005-02-11 devnull parse(argv[i]);
185 d957951b 2005-02-11 devnull } else {
186 d957951b 2005-02-11 devnull parse(unsharp("#9/ndb/local"));
187 d957951b 2005-02-11 devnull parse(unsharp("#9/ndb/friends"));
188 d957951b 2005-02-11 devnull }
189 226d80b8 2006-04-01 devnull
190 cbeb0b26 2006-04-01 devnull /* sprint(fn, "/lib/ndb/hosts.%-.21s", domname); */
191 cbeb0b26 2006-04-01 devnull /* fd = create(fn, OWRITE, 0664); */
192 cbeb0b26 2006-04-01 devnull /* if(fd < 0){ */
193 cbeb0b26 2006-04-01 devnull /* fprint(2, "can't create %s: %r\n", fn); */
194 cbeb0b26 2006-04-01 devnull /* exits("boom"); */
195 cbeb0b26 2006-04-01 devnull /* } */
196 cbeb0b26 2006-04-01 devnull /* for(i = 0; i < nx; i++) */
197 cbeb0b26 2006-04-01 devnull /* printentry(fd, &x[i]); */
198 cbeb0b26 2006-04-01 devnull /* close(fd); */
199 d957951b 2005-02-11 devnull
200 cbeb0b26 2006-04-01 devnull
201 d957951b 2005-02-11 devnull sprint(fn, "/lib/ndb/db.%-.24s", domname);
202 d957951b 2005-02-11 devnull fd = create(fn, OWRITE, 0664);
203 d957951b 2005-02-11 devnull if(fd < 0){
204 d957951b 2005-02-11 devnull fprint(2, "can't create %s: %r\n", fn);
205 d957951b 2005-02-11 devnull exits("boom");
206 d957951b 2005-02-11 devnull }
207 d957951b 2005-02-11 devnull fprint(fd, "; This file is generated automatically, do not edit!\n");
208 d957951b 2005-02-11 devnull for(i = 0; i < nx; i++)
209 d957951b 2005-02-11 devnull printArecord(fd, &x[i]);
210 d957951b 2005-02-11 devnull close(fd);
211 d957951b 2005-02-11 devnull
212 d957951b 2005-02-11 devnull sprint(fn, "/lib/ndb/equiv.%-.21s", domname);
213 d957951b 2005-02-11 devnull fd = create(fn, OWRITE, 0664);
214 d957951b 2005-02-11 devnull if(fd < 0){
215 d957951b 2005-02-11 devnull fprint(2, "can't create %s: %r\n", fn);
216 d957951b 2005-02-11 devnull exits("boom");
217 d957951b 2005-02-11 devnull }
218 d957951b 2005-02-11 devnull for(i = 0; i < nx; i++)
219 d957951b 2005-02-11 devnull printsys(fd, &x[i]);
220 d957951b 2005-02-11 devnull close(fd);
221 d957951b 2005-02-11 devnull
222 d957951b 2005-02-11 devnull sprint(fn, "/lib/ndb/txt.%-.23s", domname);
223 d957951b 2005-02-11 devnull fd = create(fn, OWRITE, 0664);
224 d957951b 2005-02-11 devnull if(fd < 0){
225 d957951b 2005-02-11 devnull fprint(2, "can't create %s: %r\n", fn);
226 d957951b 2005-02-11 devnull exits("boom");
227 d957951b 2005-02-11 devnull }
228 d957951b 2005-02-11 devnull for(i = 0; i < nx; i++)
229 d957951b 2005-02-11 devnull printtxt(fd, &x[i]);
230 d957951b 2005-02-11 devnull close(fd);
231 d957951b 2005-02-11 devnull
232 d957951b 2005-02-11 devnull exits(0);
233 d957951b 2005-02-11 devnull }