xref: /plan9/sys/src/cmd/ndb/mkdb.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <bio.h>
43e12c5d1SDavid du Colombier #include <ctype.h>
53e12c5d1SDavid du Colombier 
63e12c5d1SDavid du Colombier Biobuf in;
73e12c5d1SDavid du Colombier Biobuf out;
83e12c5d1SDavid du Colombier 
93e12c5d1SDavid du Colombier enum
103e12c5d1SDavid du Colombier {
113e12c5d1SDavid du Colombier 	Empty,
123e12c5d1SDavid du Colombier 	Sys,
133e12c5d1SDavid du Colombier 	Dk,
143e12c5d1SDavid du Colombier 	Ip,
153e12c5d1SDavid du Colombier 	Domain,
163e12c5d1SDavid du Colombier };
173e12c5d1SDavid du Colombier 
18bd389b36SDavid du Colombier int
iscomment(char * name)19bd389b36SDavid du Colombier iscomment(char *name)
20bd389b36SDavid du Colombier {
21bd389b36SDavid du Colombier 	return *name == '#';
22bd389b36SDavid du Colombier }
23bd389b36SDavid du Colombier 
243e12c5d1SDavid du Colombier /*
253e12c5d1SDavid du Colombier  *  is this a fully specified datakit name?
263e12c5d1SDavid du Colombier  */
273e12c5d1SDavid du Colombier int
isdk(char * name)283e12c5d1SDavid du Colombier isdk(char *name)
293e12c5d1SDavid du Colombier {
303e12c5d1SDavid du Colombier 	int slash;
313e12c5d1SDavid du Colombier 
323e12c5d1SDavid du Colombier 	slash = 0;
333e12c5d1SDavid du Colombier 	for(; *name; name++){
343e12c5d1SDavid du Colombier 		if(isalnum(*name))
353e12c5d1SDavid du Colombier 			continue;
363e12c5d1SDavid du Colombier 		if(*name == '/'){
373e12c5d1SDavid du Colombier 			slash = 1;
383e12c5d1SDavid du Colombier 			continue;
393e12c5d1SDavid du Colombier 		}
403e12c5d1SDavid du Colombier 		return 0;
413e12c5d1SDavid du Colombier 	}
423e12c5d1SDavid du Colombier 	return slash;
433e12c5d1SDavid du Colombier }
443e12c5d1SDavid du Colombier 
453e12c5d1SDavid du Colombier /*
463e12c5d1SDavid du Colombier  *  Is this an internet domain name?
473e12c5d1SDavid du Colombier  */
483e12c5d1SDavid du Colombier int
isdomain(char * name)493e12c5d1SDavid du Colombier isdomain(char *name)
503e12c5d1SDavid du Colombier {
513e12c5d1SDavid du Colombier 	int dot = 0;
523e12c5d1SDavid du Colombier 	int alpha = 0;
533e12c5d1SDavid du Colombier 
543e12c5d1SDavid du Colombier 	for(; *name; name++){
553e12c5d1SDavid du Colombier 		if(isalpha(*name) || *name == '-'){
563e12c5d1SDavid du Colombier 			alpha = 1;
573e12c5d1SDavid du Colombier 			continue;
583e12c5d1SDavid du Colombier 		}
593e12c5d1SDavid du Colombier 		if(*name == '.'){
603e12c5d1SDavid du Colombier 			dot = 1;
613e12c5d1SDavid du Colombier 			continue;
623e12c5d1SDavid du Colombier 		}
633e12c5d1SDavid du Colombier 		if(isdigit(*name))
643e12c5d1SDavid du Colombier 			continue;
653e12c5d1SDavid du Colombier 		return 0;
663e12c5d1SDavid du Colombier 	}
673e12c5d1SDavid du Colombier 	return dot && alpha;
683e12c5d1SDavid du Colombier }
693e12c5d1SDavid du Colombier 
703e12c5d1SDavid du Colombier /*
713e12c5d1SDavid du Colombier  *  is this an ip address?
723e12c5d1SDavid du Colombier  */
733e12c5d1SDavid du Colombier int
isip(char * name)743e12c5d1SDavid du Colombier isip(char *name)
753e12c5d1SDavid du Colombier {
763e12c5d1SDavid du Colombier 	int dot = 0;
773e12c5d1SDavid du Colombier 
783e12c5d1SDavid du Colombier 	for(; *name; name++){
793e12c5d1SDavid du Colombier 		if(*name == '.'){
803e12c5d1SDavid du Colombier 			dot = 1;
813e12c5d1SDavid du Colombier 			continue;
823e12c5d1SDavid du Colombier 		}
833e12c5d1SDavid du Colombier 		if(isdigit(*name))
843e12c5d1SDavid du Colombier 			continue;
853e12c5d1SDavid du Colombier 		return 0;
863e12c5d1SDavid du Colombier 	}
873e12c5d1SDavid du Colombier 	return dot;
883e12c5d1SDavid du Colombier }
893e12c5d1SDavid du Colombier 
90*7dd7cddfSDavid du Colombier char tup[64][64];
91*7dd7cddfSDavid du Colombier int ttype[64];
923e12c5d1SDavid du Colombier int ntup;
933e12c5d1SDavid du Colombier 
943e12c5d1SDavid du Colombier void
tprint(void)953e12c5d1SDavid du Colombier tprint(void)
963e12c5d1SDavid du Colombier {
973e12c5d1SDavid du Colombier 	int i, tab;
983e12c5d1SDavid du Colombier 	char *p;
993e12c5d1SDavid du Colombier 
1003e12c5d1SDavid du Colombier 	tab = 0;
1013e12c5d1SDavid du Colombier 	for(i = 0; i < ntup; i++){
1023e12c5d1SDavid du Colombier 		if(ttype[i] == Sys){
1033e12c5d1SDavid du Colombier 			Bprint(&out, "sys = %s\n", tup[i]);
1043e12c5d1SDavid du Colombier 			tab = 1;
1053e12c5d1SDavid du Colombier 			ttype[i] = Empty;
1063e12c5d1SDavid du Colombier 			break;
1073e12c5d1SDavid du Colombier 		}
1083e12c5d1SDavid du Colombier 	}
1093e12c5d1SDavid du Colombier 	for(i = 0; i < ntup; i++){
1103e12c5d1SDavid du Colombier 		if(ttype[i] == Empty)
1113e12c5d1SDavid du Colombier 			continue;
1123e12c5d1SDavid du Colombier 		if(tab)
1133e12c5d1SDavid du Colombier 			Bprint(&out, "\t");
1143e12c5d1SDavid du Colombier 		tab = 1;
1153e12c5d1SDavid du Colombier 
1163e12c5d1SDavid du Colombier 		switch(ttype[i]){
1173e12c5d1SDavid du Colombier 		case Domain:
1183e12c5d1SDavid du Colombier 			Bprint(&out, "dom=%s\n", tup[i]);
1193e12c5d1SDavid du Colombier 			break;
1203e12c5d1SDavid du Colombier 		case Ip:
1213e12c5d1SDavid du Colombier 			Bprint(&out, "ip=%s\n", tup[i]);
1223e12c5d1SDavid du Colombier 			break;
1233e12c5d1SDavid du Colombier 		case Dk:
1243e12c5d1SDavid du Colombier 			p = strrchr(tup[i], '/');
1253e12c5d1SDavid du Colombier 			if(p){
1263e12c5d1SDavid du Colombier 				p++;
1273e12c5d1SDavid du Colombier 				if((*p == 'C' || *p == 'R')
1283e12c5d1SDavid du Colombier 				&& strncmp(tup[i], "nj/astro/", p-tup[i]) == 0)
1293e12c5d1SDavid du Colombier 					Bprint(&out, "flavor=console ");
1303e12c5d1SDavid du Colombier 			}
1313e12c5d1SDavid du Colombier 			Bprint(&out, "dk=%s\n", tup[i]);
1323e12c5d1SDavid du Colombier 			break;
1333e12c5d1SDavid du Colombier 		case Sys:
1343e12c5d1SDavid du Colombier 			Bprint(&out, "sys=%s\n", tup[i]);
1353e12c5d1SDavid du Colombier 			break;
1363e12c5d1SDavid du Colombier 		}
1373e12c5d1SDavid du Colombier 	}
1383e12c5d1SDavid du Colombier }
1393e12c5d1SDavid du Colombier 
140219b2ee8SDavid du Colombier #define NFIELDS 64
141219b2ee8SDavid du Colombier 
1423e12c5d1SDavid du Colombier /*
1433e12c5d1SDavid du Colombier  *  make a database file from a merged uucp/inet database
1443e12c5d1SDavid du Colombier  */
1453e12c5d1SDavid du Colombier void
main(void)1463e12c5d1SDavid du Colombier main(void)
1473e12c5d1SDavid du Colombier {
1483e12c5d1SDavid du Colombier 	int n, i, j;
1493e12c5d1SDavid du Colombier 	char *l;
150219b2ee8SDavid du Colombier 	char *fields[NFIELDS];
151219b2ee8SDavid du Colombier 	int ftype[NFIELDS];
1523e12c5d1SDavid du Colombier 	int same, match;
1533e12c5d1SDavid du Colombier 
1543e12c5d1SDavid du Colombier 	Binit(&in, 0, OREAD);
1553e12c5d1SDavid du Colombier 	Binit(&out, 1, OWRITE);
1563e12c5d1SDavid du Colombier 	ntup = 0;
1573e12c5d1SDavid du Colombier 	while(l = Brdline(&in, '\n')){
1583e12c5d1SDavid du Colombier 		l[Blinelen(&in)-1] = 0;
159*7dd7cddfSDavid du Colombier 		n = getfields(l, fields, NFIELDS, 1, " \t");
1603e12c5d1SDavid du Colombier 		same = 0;
1613e12c5d1SDavid du Colombier 		for(i = 0; i < n; i++){
162bd389b36SDavid du Colombier 			if(iscomment(fields[i])){
163bd389b36SDavid du Colombier 				n = i;
164bd389b36SDavid du Colombier 				break;
165bd389b36SDavid du Colombier 			}
1663e12c5d1SDavid du Colombier 			if(isdomain(fields[i])){
1673e12c5d1SDavid du Colombier 				ftype[i] = Domain;
1683e12c5d1SDavid du Colombier 				for(j = 0; j < ntup; j++)
1693e12c5d1SDavid du Colombier 					if(ttype[j] == Domain && strcmp(fields[i], tup[j]) == 0){
1703e12c5d1SDavid du Colombier 						same = 1;
1713e12c5d1SDavid du Colombier 						ftype[i] = Empty;
1723e12c5d1SDavid du Colombier 						break;
1733e12c5d1SDavid du Colombier 					}
1743e12c5d1SDavid du Colombier 			} else if(isip(fields[i]))
1753e12c5d1SDavid du Colombier 				ftype[i] = Ip;
1763e12c5d1SDavid du Colombier 			else if(isdk(fields[i]))
1773e12c5d1SDavid du Colombier 				ftype[i] = Dk;
1783e12c5d1SDavid du Colombier 			else
1793e12c5d1SDavid du Colombier 				ftype[i] = Sys;
1803e12c5d1SDavid du Colombier 		}
1813e12c5d1SDavid du Colombier 		if(!same && ntup){
1823e12c5d1SDavid du Colombier 			tprint();
1833e12c5d1SDavid du Colombier 			ntup = 0;
1843e12c5d1SDavid du Colombier 		}
1853e12c5d1SDavid du Colombier 		for(i = 0; i < n; i++){
1863e12c5d1SDavid du Colombier 			match = 0;
1873e12c5d1SDavid du Colombier 			for(j = 0; j < ntup; j++){
1883e12c5d1SDavid du Colombier 				if(ftype[i] == ttype[j] && strcmp(fields[i], tup[j]) == 0){
1893e12c5d1SDavid du Colombier 					match = 1;
1903e12c5d1SDavid du Colombier 					break;
1913e12c5d1SDavid du Colombier 				}
1923e12c5d1SDavid du Colombier 			}
193*7dd7cddfSDavid du Colombier 			if(!match){
1943e12c5d1SDavid du Colombier 				ttype[ntup] = ftype[i];
1953e12c5d1SDavid du Colombier 				strcpy(tup[ntup], fields[i]);
1963e12c5d1SDavid du Colombier 				ntup++;
1973e12c5d1SDavid du Colombier 			}
1983e12c5d1SDavid du Colombier 		}
1993e12c5d1SDavid du Colombier 	}
2003e12c5d1SDavid du Colombier 	if(ntup)
2013e12c5d1SDavid du Colombier 		tprint();
2023e12c5d1SDavid du Colombier 	exits(0);
2033e12c5d1SDavid du Colombier }
204