mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
204 lines
2.8 KiB
C
204 lines
2.8 KiB
C
|
#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);
|
||
|
}
|