Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
}