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