/* * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ #include <u.h>#include <libc.h>#include <bio.h>#include <ctype.h> Biobuf in;Biobuf out; enum{ Empty, Sys, Dk, Ip, Domain,}; intiscomment(char *name){ return *name == '#';} /* * is this a fully specified datakit name? */intisdk(char *name){ int slash; slash = 0; for(; *name; name++){ if(isalnum(*name)) continue; if(*name == '/'){ slash = 1; continue; } return 0; } return slash;} /* * Is this an internet domain name? */intisdomain(char *name){ int dot = 0; int alpha = 0; for(; *name; name++){ if(isalpha(*name) || *name == '-'){ alpha = 1; continue; } if(*name == '.'){ dot = 1; continue; } if(isdigit(*name)) continue; return 0; } return dot && alpha;} /* * is this an ip address? */intisip(char *name){ int dot = 0; for(; *name; name++){ if(*name == '.'){ dot = 1; continue; } if(isdigit(*name)) continue; return 0; } return dot;} char tup[64][64];int ttype[64];int ntup; voidtprint(void){ int i, tab; char *p; tab = 0; for(i = 0; i < ntup; i++){ if(ttype[i] == Sys){ Bprint(&out, "sys = %s\n", tup[i]); tab = 1; ttype[i] = Empty; break; } } for(i = 0; i < ntup; i++){ if(ttype[i] == Empty) continue; if(tab) Bprint(&out, "\t"); tab = 1; switch(ttype[i]){ case Domain: Bprint(&out, "dom=%s\n", tup[i]); break; case Ip: Bprint(&out, "ip=%s\n", tup[i]); break; case Dk: p = strrchr(tup[i], '/'); if(p){ p++; if((*p == 'C' || *p == 'R') && strncmp(tup[i], "nj/astro/", p-tup[i]) == 0) Bprint(&out, "flavor=console "); } Bprint(&out, "dk=%s\n", tup[i]); break; case Sys: Bprint(&out, "sys=%s\n", tup[i]); break; } }} #define NFIELDS 64 /* * make a database file from a merged uucp/inet database */voidmain(void){ int n, i, j; char *l; char *fields[NFIELDS]; int ftype[NFIELDS]; int same, match; Binit(&in, 0, OREAD); Binit(&out, 1, OWRITE); ntup = 0; while(l = Brdline(&in, '\n')){ l[Blinelen(&in)-1] = 0; n = getfields(l, fields, NFIELDS, 1, " \t"); same = 0; for(i = 0; i < n; i++){ if(iscomment(fields[i])){ n = i; break; } if(isdomain(fields[i])){ ftype[i] = Domain; for(j = 0; j < ntup; j++) if(ttype[j] == Domain && strcmp(fields[i], tup[j]) == 0){ same = 1; ftype[i] = Empty; break; } } else if(isip(fields[i])) ftype[i] = Ip; else if(isdk(fields[i])) ftype[i] = Dk; else ftype[i] = Sys; } if(!same && ntup){ tprint(); ntup = 0; } for(i = 0; i < n; i++){ match = 0; for(j = 0; j < ntup; j++){ if(ftype[i] == ttype[j] && strcmp(fields[i], tup[j]) == 0){ match = 1; break; } } if(!match){ ttype[ntup] = ftype[i]; strcpy(tup[ntup], fields[i]); ntup++; } } } if(ntup) tprint(); exits(0);}
/*
* This file is part of the UCB release of Plan 9. It is subject to the license
* terms in the LICENSE file found in the top-level directory of this
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
* part of the UCB release of Plan 9, including this file, may be copied,
* modified, propagated, or distributed except according to the terms contained
* in the LICENSE file.
*/
#include <u.h>
#include <libc.h>
#include <bio.h>
#include <ctype.h>
Biobuf in;
Biobuf out;
enum
{
Empty,
Sys,
Dk,
Ip,
Domain,
};
int
iscomment(char *name)
{
return *name == '#';
}
/*
* is this a fully specified datakit name?
*/
int
isdk(char *name)
{
int slash;
slash = 0;
for(; *name; name++){
if(isalnum(*name))
continue;
if(*name == '/'){
slash = 1;
continue;
}
return 0;
}
return slash;
}
/*
* Is this an internet domain name?
*/
int
isdomain(char *name)
{
int dot = 0;
int alpha = 0;
for(; *name; name++){
if(isalpha(*name) || *name == '-'){
alpha = 1;
continue;
}
if(*name == '.'){
dot = 1;
continue;
}
if(isdigit(*name))
continue;
return 0;
}
return dot && alpha;
}
/*
* is this an ip address?
*/
int
isip(char *name)
{
int dot = 0;
for(; *name; name++){
if(*name == '.'){
dot = 1;
continue;
}
if(isdigit(*name))
continue;
return 0;
}
return dot;
}
char tup[64][64];
int ttype[64];
int ntup;
void
tprint(void)
{
int i, tab;
char *p;
tab = 0;
for(i = 0; i < ntup; i++){
if(ttype[i] == Sys){
Bprint(&out, "sys = %s\n", tup[i]);
tab = 1;
ttype[i] = Empty;
break;
}
}
for(i = 0; i < ntup; i++){
if(ttype[i] == Empty)
continue;
if(tab)
Bprint(&out, "\t");
tab = 1;
switch(ttype[i]){
case Domain:
Bprint(&out, "dom=%s\n", tup[i]);
break;
case Ip:
Bprint(&out, "ip=%s\n", tup[i]);
break;
case Dk:
p = strrchr(tup[i], '/');
if(p){
p++;
if((*p == 'C' || *p == 'R')
&& strncmp(tup[i], "nj/astro/", p-tup[i]) == 0)
Bprint(&out, "flavor=console ");
}
Bprint(&out, "dk=%s\n", tup[i]);
break;
case Sys:
Bprint(&out, "sys=%s\n", tup[i]);
break;
}
}
}
#define NFIELDS 64
/*
* make a database file from a merged uucp/inet database
*/
void
main(void)
{
int n, i, j;
char *l;
char *fields[NFIELDS];
int ftype[NFIELDS];
int same, match;
Binit(&in, 0, OREAD);
Binit(&out, 1, OWRITE);
ntup = 0;
while(l = Brdline(&in, '\n')){
l[Blinelen(&in)-1] = 0;
n = getfields(l, fields, NFIELDS, 1, " \t");
same = 0;
for(i = 0; i < n; i++){
if(iscomment(fields[i])){
n = i;
break;
}
if(isdomain(fields[i])){
ftype[i] = Domain;
for(j = 0; j < ntup; j++)
if(ttype[j] == Domain && strcmp(fields[i], tup[j]) == 0){
same = 1;
ftype[i] = Empty;
break;
}
} else if(isip(fields[i]))
ftype[i] = Ip;
else if(isdk(fields[i]))
ftype[i] = Dk;
else
ftype[i] = Sys;
}
if(!same && ntup){
tprint();
ntup = 0;
}
for(i = 0; i < n; i++){
match = 0;
for(j = 0; j < ntup; j++){
if(ftype[i] == ttype[j] && strcmp(fields[i], tup[j]) == 0){
match = 1;
break;
}
}
if(!match){
ttype[ntup] = ftype[i];
strcpy(tup[ntup], fields[i]);
ntup++;
}
}
}
if(ntup)
tprint();
exits(0);
}