]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/ndb/mkdb.c
ndb/dns: double Maxretries for long cname redirection chains
[plan9front.git] / sys / src / cmd / ndb / mkdb.c
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <ctype.h>
5
6 Biobuf in;
7 Biobuf out;
8
9 enum
10 {
11         Empty,
12         Sys,
13         Dk,
14         Ip,
15         Domain,
16 };
17
18 int
19 iscomment(char *name)
20 {
21         return *name == '#';
22 }
23
24 /*
25  *  is this a fully specified datakit name?
26  */
27 int
28 isdk(char *name)
29 {
30         int slash;
31
32         slash = 0;
33         for(; *name; name++){
34                 if(isalnum(*name))
35                         continue;
36                 if(*name == '/'){
37                         slash = 1;
38                         continue;
39                 }
40                 return 0;
41         }
42         return slash;
43 }
44
45 /*
46  *  Is this an internet domain name?
47  */
48 int
49 isdomain(char *name)
50 {
51         int dot = 0;
52         int alpha = 0;
53
54         for(; *name; name++){
55                 if(isalpha(*name) || *name == '-'){
56                         alpha = 1;
57                         continue;
58                 }
59                 if(*name == '.'){
60                         dot = 1;
61                         continue;
62                 }
63                 if(isdigit(*name))
64                         continue;
65                 return 0;
66         }
67         return dot && alpha;
68 }
69
70 /*
71  *  is this an ip address?
72  */
73 int
74 isip(char *name)
75 {
76         int dot = 0;
77
78         for(; *name; name++){
79                 if(*name == '.'){
80                         dot = 1;
81                         continue;
82                 }
83                 if(isdigit(*name))
84                         continue;
85                 return 0;
86         }
87         return dot;
88 }
89
90 char tup[64][64];
91 int ttype[64];
92 int ntup;
93
94 void
95 tprint(void)
96 {
97         int i, tab;
98         char *p;
99
100         tab = 0;
101         for(i = 0; i < ntup; i++){
102                 if(ttype[i] == Sys){
103                         Bprint(&out, "sys = %s\n", tup[i]);
104                         tab = 1;
105                         ttype[i] = Empty;
106                         break;
107                 }
108         }
109         for(i = 0; i < ntup; i++){
110                 if(ttype[i] == Empty)
111                         continue;
112                 if(tab)
113                         Bprint(&out, "\t");
114                 tab = 1;
115
116                 switch(ttype[i]){
117                 case Domain:
118                         Bprint(&out, "dom=%s\n", tup[i]);
119                         break;
120                 case Ip:
121                         Bprint(&out, "ip=%s\n", tup[i]);
122                         break;
123                 case Dk:
124                         p = strrchr(tup[i], '/');
125                         if(p){
126                                 p++;
127                                 if((*p == 'C' || *p == 'R')
128                                 && strncmp(tup[i], "nj/astro/", p-tup[i]) == 0)
129                                         Bprint(&out, "flavor=console ");
130                         }
131                         Bprint(&out, "dk=%s\n", tup[i]);
132                         break;
133                 case Sys:
134                         Bprint(&out, "sys=%s\n", tup[i]);
135                         break;
136                 }
137         }
138 }
139
140 #define NFIELDS 64
141
142 /*
143  *  make a database file from a merged uucp/inet database
144  */
145 void
146 main(void)
147 {
148         int n, i, j;
149         char *l;
150         char *fields[NFIELDS];
151         int ftype[NFIELDS];
152         int same, match;
153
154         Binit(&in, 0, OREAD);
155         Binit(&out, 1, OWRITE);
156         ntup = 0;
157         while(l = Brdline(&in, '\n')){
158                 l[Blinelen(&in)-1] = 0;
159                 n = getfields(l, fields, NFIELDS, 1, " \t");
160                 same = 0;
161                 for(i = 0; i < n; i++){
162                         if(iscomment(fields[i])){
163                                 n = i;
164                                 break;
165                         }
166                         if(isdomain(fields[i])){
167                                 ftype[i] = Domain;
168                                 for(j = 0; j < ntup; j++)
169                                         if(ttype[j] == Domain && strcmp(fields[i], tup[j]) == 0){
170                                                 same = 1;
171                                                 ftype[i] = Empty;
172                                                 break;
173                                         }
174                         } else if(isip(fields[i]))
175                                 ftype[i] = Ip;
176                         else if(isdk(fields[i]))
177                                 ftype[i] = Dk;
178                         else
179                                 ftype[i] = Sys;
180                 }
181                 if(!same && ntup){
182                         tprint();
183                         ntup = 0;
184                 }
185                 for(i = 0; i < n; i++){
186                         match = 0;
187                         for(j = 0; j < ntup; j++){
188                                 if(ftype[i] == ttype[j] && strcmp(fields[i], tup[j]) == 0){
189                                         match = 1;
190                                         break;
191                                 }
192                         }
193                         if(!match){
194                                 ttype[ntup] = ftype[i];
195                                 strcpy(tup[ntup], fields[i]);
196                                 ntup++;
197                         }
198                 }
199         }
200         if(ntup)
201                 tprint();
202         exits(0);
203 }