Blob


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