xref: /plan9/sys/src/cmd/ndb/mkdb.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
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