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
iscomment(char * name)19 iscomment(char *name)
20 {
21 return *name == '#';
22 }
23
24 /*
25 * is this a fully specified datakit name?
26 */
27 int
isdk(char * name)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
isdomain(char * name)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
isip(char * name)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
tprint(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
main(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 }
204