#!/bin/rc
rfork e
ipquery=(ndb/ipquery -f /lib/ndb/whois)
query=(ndb/query -f /lib/ndb/whois)
fn split{
ifs=. x=`{echo -n $*} echo $x
}
fn permute{
while(! ~ $#* 0){
echo $*|sed 's/ /./g'
shift
}
}
fn firstm{
m = ()
switch($1){
case *@*
m=`{echo $1|sed s/.*@//}
case [0-9]*.[0-9]*.[0-9]*.[0-9]* *:*
m=`{$ipquery ip $1 dom|sed 's/^dom=//
s/ .*//g'}
if(~ $m unallocated*){
echo $m ip block $1>[1=2]
m=()
}
case *
for(i in `{permute `{split $1}})
if(~ $#m 0)
m=`{$query tld $i dom}
}
if(~ $#m 0){
echo unknown whois server for $1>[1=2]
exit unknown
}
echo $m
}
fn mtoperson{
p=`{$query dom $1 person | sed 's/\$person/'$person'/'}
if(~ $#p 0)
p=$person
echo $p
}
fn mtoboiler{
# echo $query -m dom $1 boiler
ifs='' {f=`{$query -m dom $1 boiler}}
# whatis f
if(! ~ $#f 0)
eval fn boiler '{' sed ''''^$f^'''' '}'
if not{
ifs='' {f=`{$query -m dom $1 boilerp}}
# whatis f
if(! ~ $#f 0)
eval fn boiler '{' $f '}'
}
if(~ $#f 0)
fn boiler { cat }
}
fn mtocharset{
f=`{$query dom $1 tcs}
fn tcsfn { cat }
if(! ~ $#f 0)
eval fn tcsfn '{' tcs -f $f '}'
}
fn deboiler{
if(! ~ $flagn 1)
mtoboiler $1
mtocharset $1
shift
if(! ~ $flagn 1)
tcsfn <$1 | boiler | sed 's:[ ]+$::g' | uniq
if not
tcsfn <$1
}
file=/tmp/iwhois$pid # file=/tmp/iwhois
fn sigexit {
rm -f $file $file^.old
}
flagfmt='n,v'
if(! ifs=() eval `{aux/getflags $*} || ! ~ $#* 1){
echo 'usage: iwhois [-nv] domain'>[1=2]
exit usage
}
m0=0
machine=`{firstm $1}
if(! ~ $status '')
exit unknown
person=`{echo $1|sed s/@.*//}
while(~ 1 1){
if(~ $flagv 1)
echo echo `{mtoperson $machine} '|' telnet -nr tcp!$machine!whois
mtoperson $machine | telnet -nr tcp!$machine!whois > $file >[2=]
x=`{ sed -n '
s/.*Whois Server: (.*)/\1/p
s;.*ReferralServer: whois://([a-z_0-9.]+)(:[0-9]+)?;\1;p
/^No match/p
' $file }
switch($x){
case 'No match'*
echo $x
exit nomatch
case '' $m0
# if the current lookup fails, check parent's output
if(! test -s $file){
if(! test -s $file^.old)
exit unknown
echo referral failed: $m0 reports:
if(~ $#m0 0)
exit referral
deboiler $m0 $file^.old
}
if not
deboiler $machine $file
exit ''
case *' '*
echo $0: buggery: $x >[1=2]
exit botch
}
m0=$machine
machine=$x
mv $file $file^.old
}
|