Imported Debian version 4.4.1

This commit is contained in:
Marco d'Itri 1999-11-15 00:59:07 +01:00
parent bc68e8c4a6
commit 6d3af40a95
16 changed files with 446 additions and 126 deletions

View File

@ -1,24 +1,38 @@
prefix=/usr/local
OPTS=-O2 OPTS=-O2
# Solaris
#LDFLAGS=-lnsl -lsocket
all: whois #pos all: whois #pos
whois: whois.c whois.h config.h data.h ip_del.h tld_serv.h whois: whois.c whois.h config.h data.h as_del.h ip_del.h tld_serv.h
$(CC) $(OPTS) whois.c -o whois $(CC) $(OPTS) whois.c -o whois $(LDFLAGS)
mkpasswd: mkpasswd:
$(CC) $(OPTS) mkpasswd.c -o mkpasswd -lcrypt $(CC) $(OPTS) mkpasswd.c -o mkpasswd -lcrypt
as_del.h: as_del_list make_as_del.pl
perl make_as_del.pl < as_del_list > as_del.h
ip_del.h: ip_del_list make_ip_del.pl ip_del.h: ip_del_list make_ip_del.pl
./make_ip_del.pl < ip_del_list > ip_del.h perl make_ip_del.pl < ip_del_list > ip_del.h
tld_serv.h: tld_serv_list make_tld_serv.pl tld_serv.h: tld_serv_list make_tld_serv.pl
./make_tld_serv.pl < tld_serv_list > tld_serv.h perl make_tld_serv.pl < tld_serv_list > tld_serv.h
install: whois
install --strip -m 0755 whois $(BASEDIR)$(prefix)/bin/
install --strip -m 0644 whois.1 $(BASEDIR)$(prefix)/man/man1/
cd po && $(MAKE) $@
distclean: clean distclean: clean
rm -f po/whois.pot rm -f po/whois.pot
clean: clean:
rm -f tld_serv.h ip_del.h whois mkpasswd rm -f as_del.h ip_del.h tld_serv.h whois mkpasswd
rm -f po/*.mo rm -f po/*.mo
test: test:

4
README
View File

@ -24,8 +24,10 @@ Other information sources:
- RIPE-187 and RIPE-189 (from ftp://ftp.ripe.net/ripe/docs/ or - RIPE-187 and RIPE-189 (from ftp://ftp.ripe.net/ripe/docs/ or
http://www.ripe.net/docs/) http://www.ripe.net/docs/)
- Greg Woods' awhois script (from ftp.weird.com) - Greg Woods' awhois script (from ftp.weird.com)
- the www.geektools.org CGI proxy
- home of the 6bone client: http://www.ip.qwest.net/~david/software/ - home of the 6bone client: http://www.ip.qwest.net/~david/software/
- http://www.apnic.net/db/RIRs.html and
http://www.apnic.net/maps/tld-list.html
Marco d'Itri Marco d'Itri
<md@linux.it> <md@linux.it>

2
TODO
View File

@ -3,3 +3,5 @@ Still to sort:
Is MNT-* a standard of some registry? Is MNT-* a standard of some registry?
What about rwhois?

15
as_del_list Normal file
View File

@ -0,0 +1,15 @@
1877 1901 ripe
2043 2043 ripe
2047 2047 ripe
2107 2136 ripe
2585 2614 ripe
2773 2822 ripe
2830 2879 ripe
3154 3353 ripe
4608 4863 apnic
5377 5631 ripe
6656 6911 ripe
7467 7722 apnic
8192 9215 ripe
9261 10239 apnic
12288 13311 ripe

View File

@ -6,6 +6,9 @@
/* Suppress lame Internic disclaimer */ /* Suppress lame Internic disclaimer */
#define HIDE_DISCL #define HIDE_DISCL
/* program version */ /* Program version */
#define VERSION "4.3" #define VERSION "4.4.1"
/* String sent to RIPE servers - ONLY FIVE CHARACTERS! */
#define IDSTRING "Md4.4"

50
data.h
View File

@ -1,18 +1,37 @@
const char *ripeflags="acFLmMrRS"; /*
const char *ripeflagsp="gisTtv"; * RIPE-like servers.
* All of them do not understand -V2.0Md with the exception of RA and RIPN.
* 6bone-like servers will accept the flag with a warning (the flag must
* match /^V [a-zA-Z]{1,4}\d+[\d\.]{0,5}$/).
*/
const char *ripe_servers[] = { const char *ripe_servers[] = {
/* will accept the new syntax (-V wp3.0) */
"whois.ripe.net", "whois.ripe.net",
"whois.ra.net",
"whois.apnic.net", "whois.apnic.net",
"whois.mci.net", "whois.6bone.net", /* 3.0.0b1 */
"whois.isi.edu", "whois.aunic.net",
"whois.connect.com.au", /* 3.0.0b1 */
"whois.nic.fr",
"whois.nic.net.sg",
"whois.metu.edu.tr",
/* end of servers accepting new syntax */
"whois.nic.it", "whois.nic.it",
"whois.6bone.net",
"whois.ans.net", "whois.ans.net",
"whois.ra.net",
"whois.ripn.net",
NULL NULL
}; };
#if 0
const char *rwhois_servers[] = {
"whois.isi.edu", /* V-1.0B9.2 */
"rwhois.rcp.net.pe", /* V-1.5.3 */
"ns.twnic.net", /* V-1.0B9 */
"dragon.seed.net.tw", /* V-1.0B9.2 */
NULL
};
#endif
const char *gtlds[] = { const char *gtlds[] = {
".com", ".com",
".net", ".net",
@ -29,9 +48,9 @@ const char *arin_nets[] = {
}; };
struct ip_del { struct ip_del {
unsigned long int net; unsigned long net;
unsigned long int mask; unsigned long mask;
const char *serv; const char *serv;
}; };
struct ip_del ip_assign[] = { struct ip_del ip_assign[] = {
@ -39,6 +58,17 @@ struct ip_del ip_assign[] = {
{ 0, 0, NULL } { 0, 0, NULL }
}; };
struct as_del {
unsigned short first;
unsigned short last;
const char *serv;
};
struct as_del as_assign[] = {
#include "as_del.h"
{ 0, 0, NULL }
};
const char *tld_serv[] = { const char *tld_serv[] = {
#include "tld_serv.h" #include "tld_serv.h"
NULL, NULL NULL, NULL

29
debian/changelog vendored
View File

@ -1,3 +1,32 @@
whois (4.4.1) unstable; urgency=low
* A space is added after "AS" when querying ARIN.
* Converted some strcmp to strcasecmp.
-- Marco d'Itri <md@linux.it> Mon, 15 Nov 1999 00:59:07 +0100
whois (4.4.0) unstable; urgency=low
* Now the program automatically select the right server for AS queries.
* Added RIPE delegations of netblocks in the B class space.
* Extensive survey of all known whois servers and update of tld_serv_list.
* Now the flag -VMd4.4 is sent to RIPE-like servers.
* Written a test program for checking if all servers work.
-- Marco d'Itri <md@linux.it> Tue, 9 Nov 1999 22:53:35 +0100
whois (4.3.3) unstable; urgency=low
* Fixed man page (closes: #49195).
-- Marco d'Itri <md@linux.it> Sun, 7 Nov 1999 14:07:59 +0100
whois (4.3.2) unstable; urgency=low
* Fixed version reporting code. Now the string is "-VMd2.0".
-- Marco d'Itri <md@linux.it> Tue, 2 Nov 1999 19:50:33 +0100
whois (4.3.1) unstable; urgency=low whois (4.3.1) unstable; urgency=low
* CRSNIC code parsed the wrong field (closes: #48590). * CRSNIC code parsed the wrong field (closes: #48590).

View File

@ -3,38 +3,65 @@
61.0.0.0/8 apnic 61.0.0.0/8 apnic
62.0.0.0/8 ripe 62.0.0.0/8 ripe
0.0.0.0/2 arin # all other A classes are managed by ARIN 0.0.0.0/2 arin # all other A classes are managed by ARIN
## The B class space is a mess :-( ## The B class space is a mess :-( - something could be still missing
#? 139. 20-29 139.20.0.0/14 ripe
145.224.0.0/12 ripe 139.24.0.0/14 ripe
139.28.0.0/15 ripe
141.0.0.0/10 ripe 141.0.0.0/10 ripe
141.64.0.0/11 ripe # unsure 141.64.0.0/12 ripe
149.192.0.0/10 ripe # unsure 141.80.0.0/14 ripe
#? 149. 202-251 141.84.0.0/15 ripe
145.224.0.0/12 ripe
145.240.0.0/13 ripe
145.248.0.0/14 ripe
145.252.0.0/15 ripe
145.254.0.0/16 ripe
149.202.0.0/15 ripe
149.204.0.0/16 ripe
149.206.0.0/15 ripe
149.208.0.0/12 ripe
149.224.0.0/12 ripe
149.240.0.0/13 ripe
149.248.0.0/14 ripe
150.254.0.0/16 ripe 150.254.0.0/16 ripe
151.0.0.0/8 ripe 151.13.0.0/16 ripe
151.14.0.0/15 ripe
151.16.0.0/12 ripe
151.32.0.0/11 ripe
151.64.0.0/12 ripe
151.80.0.0/15 ripe
151.3.0.0/16 ripe
151.4.0.0/15 ripe
151.82.0.0/16 ripe
151.91.0.0/16 ripe
151.92.0.0/15 ripe
151.95.0.0/16 ripe
160.216.0.0/14 ripe 160.216.0.0/14 ripe
160.220.0.0/8 ripe 160.220.0.0/16 ripe
163.128.0.0/12 ripe 160.44.0.0/14 ripe
160.48.0.0/12 ripe
163.156.0.0/14 ripe
163.160.0.0/12 ripe
164.0.0.0/11 ripe
164.32.0.0/13 ripe
164.40.0.0/16 ripe 164.40.0.0/16 ripe
164.0.0.0/6 ripe 164.128.0.0/12 ripe
169.208.0.0/12 apnic 169.208.0.0/12 apnic
171.16.0.0/12 ripe 171.16.0.0/12 ripe
171.32.0.0/15 ripe
## The C class space is cleanly delegated and the data here should be complete ## The C class space is cleanly delegated and the data here should be complete
192.71.0.0/16 ripe 192.71.0.0/16 ripe
192.72.1.1/24 arin
192.72.1.2/24 arin
192.72.1.253/24 arin
192.72.1.254/24 arin
192.72.0.0/16 whois.seed.net.tw # NETBLK-SEED-NETS 192.72.0.0/16 whois.seed.net.tw # NETBLK-SEED-NETS
192.106.144.0/20 ripe 192.106.144.0/20 ripe
192.106.196.0/23 ripe
192.162.0.0/16 ripe 192.162.0.0/16 ripe
192.164.0.0/14 ripe 192.164.0.0/14 ripe
192.0.0.0/8 arin # the swamp 192.0.0.0/8 arin # the swamp
193.0.0.0/8 ripe 193.0.0.0/8 ripe
194.0.0.0/7 ripe 194.0.0.0/7 ripe
198.17.117.0/24 ripe
196.0.0.0/6 arin 196.0.0.0/6 arin
200.0.0.0/7 arin 200.0.0.0/7 arin
203.0.0.0/10 aunic
202.0.0.0/7 apnic 202.0.0.0/7 apnic
204.0.0.0/6 arin 204.0.0.0/6 arin
208.0.0.0/7 arin 208.0.0.0/7 arin

20
make_as_del.pl Executable file
View File

@ -0,0 +1,20 @@
#!/usr/bin/perl -w
use strict;
while (<>) {
chomp;
s/^\s*(.*)\s*$/$1/;
s/\s*#.*$//;
next if /^$/;
die "format error: $_" unless (/^([\d\.]+)\s+([\d\.]+)\s+([\w\.]+)$/);
my $f=$1; my $l=$2; my $s=$3;
print "{ ${f}, ${l}, \"";
if ($s =~ /\./) {
print "$s";
} else {
print "whois.$s.net";
}
print "\" },\n";
}

View File

@ -7,7 +7,7 @@ while (<>) {
s/^\s*(.*)\s*$/$1/; s/^\s*(.*)\s*$/$1/;
s/\s*#.*$//; s/\s*#.*$//;
next if /^$/; next if /^$/;
die "format error: $_" unless (/^([\w\d\.-]+)\s+([\w\d\.-]+)$/); die "format error: $_" unless (/^([\w\d\.-]+)\s+([\w\d\.:-]+)$/);
print " \"$1\",\t\"$2\",\n"; print " \"$1\",\t\"$2\",\n";
} }

View File

@ -4,8 +4,8 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: whois 3.0\n" "Project-Id-Version: whois 4.4.0\n"
"POT-Creation-Date: 1999-10-26 12:19+0200\n" "POT-Creation-Date: 1999-11-09 22:15+0100\n"
"PO-Revision-Date: 1999-10-26 12:19+02:00\n" "PO-Revision-Date: 1999-10-26 12:19+02:00\n"
"Last-Translator: Marco d'Itri <md@linux.it>\n" "Last-Translator: Marco d'Itri <md@linux.it>\n"
"Language-Team: Italian <it@li.org>\n" "Language-Team: Italian <it@li.org>\n"
@ -13,11 +13,11 @@ msgstr ""
"Content-Type: text/plain; charset=iso-8859-1\n" "Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: ../whois.c:95 #: ../whois.c:93
msgid "Connecting to whois.crsnic.net.\n" msgid "Connecting to whois.crsnic.net.\n"
msgstr "Mi sto connettendo a whois.crsnic.net.\n" msgstr "Mi sto connettendo a whois.crsnic.net.\n"
#: ../whois.c:103 #: ../whois.c:97
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -25,20 +25,20 @@ msgid ""
"\n" "\n"
msgstr "" msgstr ""
"\n" "\n"
"Trovato un riferimento CRSNIC a %s.\n" "Trovato un riferimento di CRSNIC a %s.\n"
"\n" "\n"
#: ../whois.c:113 #: ../whois.c:105
#, c-format #, c-format
msgid "Using default server %s.\n" msgid "Using default server %s.\n"
msgstr "Uso il server predefinito %s.\n" msgstr "Uso il server predefinito %s.\n"
#: ../whois.c:115 #: ../whois.c:107
#, c-format #, c-format
msgid "Using server %s.\n" msgid "Using server %s.\n"
msgstr "Uso il server %s.\n" msgstr "Uso il server %s.\n"
#: ../whois.c:120 #: ../whois.c:112
#, c-format #, c-format
msgid "" msgid ""
"Query string: \"%s\"\n" "Query string: \"%s\"\n"
@ -47,7 +47,7 @@ msgstr ""
"Richiesta: \"%s\"\n" "Richiesta: \"%s\"\n"
"\n" "\n"
#: ../whois.c:156 #: ../whois.c:153
msgid "" msgid ""
"I don't know where this IP has been delegated.\n" "I don't know where this IP has been delegated.\n"
"I'll try ARIN and hope for the best...\n" "I'll try ARIN and hope for the best...\n"
@ -55,20 +55,28 @@ msgstr ""
"Non so a chi è stato delegato questo IP.\n" "Non so a chi è stato delegato questo IP.\n"
"Proverò con ARIN sperando per il meglio...\n" "Proverò con ARIN sperando per il meglio...\n"
#: ../whois.c:173 #: ../whois.c:170
msgid "I guess it's a netblock name but I don't know where to look it up.\n" msgid "I guess it's a netblock name but I don't know where to look it up.\n"
msgstr "Credo che sia il nome di un netblock ma non so dove cercarlo.\n" msgstr "Credo che sia il nome di un netblock ma non so dove cercarlo.\n"
#: ../whois.c:180 #: ../whois.c:177
msgid "I guess it's a domain but I don't know where to look it up.\n" msgid "I guess it's a domain but I don't know where to look it up.\n"
msgstr "Credo che sia un dominio ma non so dove cercarlo.\n" msgstr "Credo che sia un dominio ma non so dove cercarlo.\n"
#: ../whois.c:239 #: ../whois.c:188
msgid "Unknown AS number. Please upgrade this program."
msgstr ""
#: ../whois.c:211
msgid "Warning: RIPE flags ignored for a traditional server."
msgstr ""
#: ../whois.c:254
#, c-format #, c-format
msgid "Detected referral to %s on %s.\n" msgid "Detected referral to %s on %s.\n"
msgstr "Trovato un riferimento a %s su %s.\n" msgstr "Trovato un riferimento a %s su %s.\n"
#: ../whois.c:252 #: ../whois.c:267
msgid "" msgid ""
"Catastrophic error: INTERNIC changed the disclaimer text.\n" "Catastrophic error: INTERNIC changed the disclaimer text.\n"
"Please upgrade this program.\n" "Please upgrade this program.\n"
@ -76,22 +84,22 @@ msgstr ""
"Errore catastrofico: INTERNIC ha cambiato il testo di avvertenze.\n" "Errore catastrofico: INTERNIC ha cambiato il testo di avvertenze.\n"
"Aggiorna questo programma.\n" "Aggiorna questo programma.\n"
#: ../whois.c:313 #: ../whois.c:335
#, c-format #, c-format
msgid "Host %s not found." msgid "Host %s not found."
msgstr "Host %s non trovato." msgstr "Host %s non trovato."
#: ../whois.c:322 #: ../whois.c:344
#, c-format #, c-format
msgid "%s/tcp: unknown service" msgid "%s/tcp: unknown service"
msgstr "%s/tcp: servizio sconosciuto" msgstr "%s/tcp: servizio sconosciuto"
#: ../whois.c:339 #: ../whois.c:361
#, c-format #, c-format
msgid "Interrupted by signal %d..." msgid "Interrupted by signal %d..."
msgstr "Interrotto dal segnale %d..." msgstr "Interrotto dal segnale %d..."
#: ../whois.c:379 #: ../whois.c:403
msgid "" msgid ""
"Usage: whois [OPTION]... OBJECT...\n" "Usage: whois [OPTION]... OBJECT...\n"
"\n" "\n"

108
test-whois.pl Executable file
View File

@ -0,0 +1,108 @@
#!/usr/bin/perl -w
use IO::Socket;
use strict;
my %check=(
'whois.io' => 'whois.io',
'whois.nic.cx' => 'nic.cx',
'whois.nic.gi' => 'nic.gi',
'whois.nic.ly' => 'nic.ly',
'whois.nic.pw' => 'nic.pw',
'whois.nic.so' => 'nic.so',
'whois.nic.st' => 'nic.st',
'whois.uprr.pr' => 'uprr.pr',
'whois.nplus.gf' => 'nplus.gf',
'rwhois.reacciun.ve' => 'reacciun.ve',
'whois.adamsnames.tc' => 'adamsnames.vg',
'whois.idnic.net.id' => 'idnic.net.id',
'whois.ncst.ernet.in' => 'ncst.ernet.in',
);
my @ripetest=('-V wC2.0', '-V2.0Md', '-VMd4.4');
my %ripeserv=qw(
whois.ripe.net dfn.de
whois.aunic.net connect.com.au
whois.connect.com.au connect.com.au
whois.ra.net AS1
whois.apnic.net 24.192.0.0
whois.nic.it nic.it
whois.ans.net AS1
whois.ripn.net demos.su
whois.nic.fr nic.fr
whois.nic.net.sg nic.net.sg
whois.metu.edu.tr metu.edu.tr
);
open(LIST, 'tld_serv_list');
while (<LIST>) {
chomp;
next if /^#/;
my ($tld, $serv, $junk)=split;
next unless ($tld =~/\.[a-z]{2}$/); # skip non-cctld
# I'm sure these won't move without notifying...
next if ($serv =~ /(?:isi\.edu|internic.net)/);
if ($serv eq 'whois.ripe.net') {
$tld =~ s/^\.//;
print ">>>>>>>>>Querying $serv ($tld) for $tld<<<<<<<<<<\n";
print whois("-i domain $tld", $serv); # untested
print "\n";
next;
}
my $q;
if ($serv =~ /$tld$/) {
$q = $serv; $q =~ s/.*\.([-a-z0-9]+?\...)$/$1/; # we know a real domain
} else {
$q = "nic$tld"; # make a random domain and try anyway
}
$tld =~ s/^\.//;
print ">>>>>>>>>Querying $serv ($tld) for $q<<<<<<<<<<\n";
print whois($q, $serv);
print "\n";
}
close LIST;
print "#" x 78 . "\n";
foreach (keys %check) {
print ">>>>>>>>>Querying $_ for $check{$_}<<<<<<<<<<\n";
print whois($check{$_}, $_);
print "\n";
}
exit 0;
print "#" x 78 . "\n";
foreach my $s (keys %ripeserv) {
foreach (@ripetest) {
my $q = "$_ $ripeserv{$s}";
print ">>>>>>>>>Querying $s for $q<<<<<<<<<<\n";
print whois($q, $s);
print "\n";
}
}
exit 0;
sub whois {
my ($query, $serv, $port) = @_;
my (@result, $remote);
eval {
local $^W=0;
$remote = IO::Socket::INET->new(
Timeout => 15, PeerAddr => $serv, PeerPort => $port || 43
);
};
if (defined $remote and ($@ eq '')) {
print $remote "$query\r\n";
@result = <$remote>;
close $remote;
} elsif ($@ ne '') {
@result = ("FATAL: $@");
} else {
# FIXME should disconnect from rwhois servers or the connection will hang
# until the timeout of the server
@result = ("$!\n");
}
return @result;
}

View File

@ -1,3 +1,6 @@
# Servers in lines with a trailing hash mark have been tested and found
# not working at the time of my survey (19991109).
# Servers with the comment "wrong" have been tested as well but are wrong.
.gb.com whois.nomination.net .gb.com whois.nomination.net
.gb.net whois.nomination.net .gb.net whois.nomination.net
.uk.net whois.nomination.net .uk.net whois.nomination.net
@ -11,18 +14,21 @@
.mil whois.nic.mil .mil whois.nic.mil
.ac whois.nic.ac .ac whois.nic.ac
.ad whois.ripe.net .ad whois.ripe.net
.al whois.ripe.net .af whois.nic.tm
#.al whois.ripe.net #wrong
.am whois.amnic.net .am whois.amnic.net
.as whois.nic.as .as whois.nic.as
.at whois.univie.ac.at # CNAME whois.ripe.net .at whois.univie.ac.at # CNAME whois.ripe.net
.net.au whois.connect.com.au #.net.au whois.connect.com.au # obsolete?
.au whois.aunic.net .au whois.aunic.net
.az whois.ripe.net #.az whois.ripe.net #wrong
.ba whois.ripe.net .ba whois.ripe.net
.be whois.ripe.net .be whois.ripe.net
.bg whois.ripe.net .bg whois.ripe.net
#.bm rwhois.ibl.bm:4321
.br whois.nic.br .br whois.nic.br
.by whois.ripe.net .bt whois.nic.tm
#.by whois.ripe.net #wrong
.ca whois.cdnnet.ca .ca whois.cdnnet.ca
.cc whois.nic.cc .cc whois.nic.cc
.ch whois.nic.ch .ch whois.nic.ch
@ -30,33 +36,37 @@
.ac.cn whois.cnc.ac.cn .ac.cn whois.cnc.ac.cn
.cn whois.cnnic.net.cn .cn whois.cnnic.net.cn
.uk.co whois.uk.co .uk.co whois.uk.co
.co whois.ripe.net #.co whois.ripe.net #wrong
#.cx whois.nic.cx #
.cy whois.ripe.net .cy whois.ripe.net
.cz whois.ripe.net .cz whois.ripe.net
.de whois.ripe.net .de whois.ripe.net
.dk whois.ripe.net .dk whois.ripe.net
.dz whois.ripe.net #.dz whois.ripe.net #wrong
.ee whois.ripe.net #.ee whois.ripe.net #wrong
.eg whois.ripe.net #.eg whois.ripe.net #wrong
.es whois.ripe.net .es whois.ripe.net
.fi whois.ripe.net #.fi whois.ripe.net #wrong
.fo whois.ripe.net .fo whois.ripe.net
.fr whois.nic.fr .fr whois.nic.fr
.ga whois.ripe.net #.ga whois.ripe.net #wrong
.gb whois.ripe.net #.gb whois.ripe.net #wrong
.ge whois.ripe.net #.ge whois.ripe.net #wrong
#.gf whois.nplus.gf #
#.gi whois.nic.gi #
.gl whois.ripe.net .gl whois.ripe.net
.gm whois.ripe.net .gm whois.ripe.net
.gr whois.ripe.net .gr whois.ripe.net
.gs whois.adamsnames.tc .gs whois.adamsnames.tc
.hk whois.apnic.net .hk whois.hknic.net.hk
.hm whois.nic.hm .hm whois.nic.hm
.hr whois.ripe.net .hr whois.ripe.net
.hu whois.ripe.net .hu whois.ripe.net
.id whois.idnic.net.id .id whois.idnic.net.id # broken
.ie whois.ripe.net .ie whois.ripe.net
.il whois.ripe.net .il whois.ripe.net
.in whois.ncst.ernet.in .in whois.ncst.ernet.in # empty?
#.io whois.io #
.is whois.ripe.net .is whois.ripe.net
.it whois.nic.it .it whois.nic.it
.jo whois.ripe.net .jo whois.ripe.net
@ -68,13 +78,14 @@
.lt whois.ripe.net .lt whois.ripe.net
.lu whois.ripe.net .lu whois.ripe.net
.lv whois.ripe.net .lv whois.ripe.net
.ma whois.ripe.net #.ly whois.nic.ly #
#.ma whois.ripe.net #wrong
.mc whois.ripe.net .mc whois.ripe.net
.md whois.ripe.net .md whois.ripe.net
.mk whois.ripe.net #.mk whois.ripe.net #wrong
.mm whois.nic.mm #.mm whois.nic.mm #
.ms whois.adamsnames.tc .ms whois.adamsnames.tc
.mt whois.ripe.net #.mt whois.ripe.net #wrong
.mx whois.nic.mx .mx whois.nic.mx
.ng pgebrehiwot.iat.cnr.it .ng pgebrehiwot.iat.cnr.it
.nl www.domain-registry.nl .nl www.domain-registry.nl
@ -83,17 +94,21 @@
.nz tardis.patho.gen.nz .nz tardis.patho.gen.nz
.pe whois.rcp.net.pe .pe whois.rcp.net.pe
.pl whois.ripe.net .pl whois.ripe.net
#.pr whois.uprr.pr #
.pk whois.pknic.net.pk .pk whois.pknic.net.pk
.pt whois.dns.pt #.pt whois.dns.pt # disabled - use http://www.dns.pt/info/
.ro whois.nic.ro .pw whois.nic.pw
.ro whois.ripe.net
.ru whois.ripn.net .ru whois.ripn.net
.se whois.nic-se.se .se whois.nic-se.se
.sg whois.nic.net.sg .sg whois.nic.net.sg
.sh whois.nic.sh .sh whois.nic.sh
.si whois.ripe.net #.si whois.ripe.net #wrong
.sk whois.ripe.net .sk whois.ripe.net
.sm whois.ripe.net .sm whois.ripe.net
.su whois.ripe.net #.so whois.nic.so #
.st whois.nic.st
.su whois.ripn.net
.tc whois.adamsnames.tc .tc whois.adamsnames.tc
.tf whois.adamsnames.tc .tf whois.adamsnames.tc
.th whois.thnic.net .th whois.thnic.net
@ -108,12 +123,18 @@
.uk whois.nic.uk .uk whois.nic.uk
.us whois.isi.edu .us whois.isi.edu
.va whois.ripe.net .va whois.ripe.net
#.ve rwhois.reacciun.ve:4321
.vg whois.adamsnames.tc
.yu whois.ripe.net .yu whois.ripe.net
.za whois.frd.ac.za .za whois.frd.ac.za
-arin whois.arin.net
-ripe whois.ripe.net
-ap whois.apnic.net
-dom whois.internic.net -dom whois.internic.net
-org whois.internic.net -org whois.internic.net
-hst whois.internic.net -hst whois.internic.net
-arin whois.arin.net
-ripe whois.ripe.net
-ap whois.apnic.net
-au whois.aunic.net
-6bone whois.6bone.net -6bone whois.6bone.net
-ripn whois.ripn.net
-sgnic whois.nic.net.sg
-metu whois.metu.edu.tr

18
whois.1
View File

@ -1,4 +1,4 @@
.TH WHOIS 1 "8 October 1999" "Marco d'Itri" "Debian GNU/Linux" .TH WHOIS 1 "15 November 1999" "Marco d'Itri" "Debian GNU/Linux"
.SH NAME .SH NAME
whois \- client for the whois directory service whois \- client for the whois directory service
.SH SYNOPSIS .SH SYNOPSIS
@ -65,6 +65,19 @@ to find the registrar for a GTLD subdomain. This option overrides
Be verbose. Be verbose.
.TP 8 .TP 8
Other options are flags understood by RIPE-like servers. Other options are flags understood by RIPE-like servers.
.SH FEATURES
When querying
.I whois.arin.net
for AS numbers, the program will automatically convert the request in
the appropriate format, inserting a space after the string "AS".
.P
When querying
.I whois.nic.ad.jp
english text is requested unless the
.I LANG
environment variable specifies a Japanese locale.
.P
RIPE-specific options are ignored when querying non-RIPE servers.
.SH "SEE ALSO" .SH "SEE ALSO"
.I RFC 812: .I RFC 812:
NICNAME/WHOIS NICNAME/WHOIS
@ -74,7 +87,7 @@ RIPE NCC Database Documentation
.PP .PP
Detailed help on available flags can be found in Detailed help on available flags can be found in
.I RIPE-157 .I RIPE-157
or in the help file, which can be downloaded with the command: or in the help file, which can be obtained with the command:
.IP .IP
.B whois -h whois.ripe.net HELP .B whois -h whois.ripe.net HELP
.SH HISTORY .SH HISTORY
@ -87,4 +100,3 @@ Kessens of QWest for the 6bone server.
.B Whois .B Whois
and this man page were written by Marco d'Itri <md@linux.it> and this man page were written by Marco d'Itri <md@linux.it>
and are licensed under the GPL. and are licensed under the GPL.

102
whois.c
View File

@ -19,18 +19,19 @@
#include <errno.h> #include <errno.h>
#include <signal.h> #include <signal.h>
/* Application-specific */
#include "config.h" #include "config.h"
#include "whois.h"
#include "data.h" #include "data.h"
#include "whois.h"
/* Global variables */
int sockfd, verb = 0; int sockfd, verb = 0;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int ch, nopar = 0, optC = 0; int ch, nopar = 0, optC = 0;
const char *server = NULL; const char *server = NULL;
char *p, qstring[256] = "\0", fstring[64] = "\0", *port = NULL, char *p, *q, qstring[256] = "\0", fstring[64] = "\0", *port = NULL,
defaultserv[] = "whois.internic.net"; defaultserv[] = "whois.internic.net";
#ifdef ENABLE_NLS #ifdef ENABLE_NLS
@ -39,7 +40,7 @@ int main(int argc, char *argv[])
textdomain(NLS_CAT_NAME); textdomain(NLS_CAT_NAME);
#endif #endif
while ((ch = GETOPT(argc, argv, "acCFg:h:i:LmMp:rRs:St:T:v:V")) > 0) { while ((ch = getopt(argc, argv, "acCFg:h:i:LmMp:rRs:St:T:v:V")) > 0) {
/* RIPE flags */ /* RIPE flags */
if (strchr(ripeflags, ch)) { if (strchr(ripeflags, ch)) {
for (p = fstring; *p != '\0'; p++); for (p = fstring; *p != '\0'; p++);
@ -56,7 +57,8 @@ int main(int argc, char *argv[])
/* program flags */ /* program flags */
switch (ch) { switch (ch) {
case 'h': case 'h':
server = optarg; server = q = malloc(strlen(optarg) + 1);
for (p = optarg; *p != '\0'; *q++ = tolower(*p++));
break; break;
case 'p': case 'p':
port = optarg; port = optarg;
@ -89,7 +91,7 @@ int main(int argc, char *argv[])
if (optC && domfind(qstring, gtlds)) { if (optC && domfind(qstring, gtlds)) {
if (verb) if (verb)
printf(_("Connecting to whois.crsnic.net.\n")); fputs(_("Connecting to whois.crsnic.net.\n"), stdout);
sockfd = openconn("whois.crsnic.net", "43"); sockfd = openconn("whois.crsnic.net", "43");
server = query_crsnic(sockfd, qstring); server = query_crsnic(sockfd, qstring);
if (verb && server) if (verb && server)
@ -107,8 +109,9 @@ int main(int argc, char *argv[])
} }
p = queryformat(server, fstring, qstring); p = queryformat(server, fstring, qstring);
if (verb) if (verb) {
printf(_("Query string: \"%s\"\n\n"), p); printf(_("Query string: \"%s\"\n\n"), p);
}
strcat(p, "\r\n"); strcat(p, "\r\n");
signal(SIGTERM, sighandler); signal(SIGTERM, sighandler);
@ -130,22 +133,26 @@ const char *whichwhois(const char *s)
if (*s == '\0') if (*s == '\0')
return "whois.ripe.net"; return "whois.ripe.net";
/* no dot and no hyphen means it's a internic NIC handle or an AS (?) */
if (!strpbrk(s, ".-")) {
if (strncasecmp(s, "AS", 2) == 0) { /* it's an AS */
return whereas(atoi(s + 2), as_assign);
} else /* it's an internic NIC handle (?) */
return "whois.internic.net";
}
/* IPv6 address */ /* IPv6 address */
if (strchr(s, ':')) if (strchr(s, ':'))
return "whois.6bone.net"; return "whois.6bone.net";
/* no dot and no hyphen means it's a internic NIC handle or an AS (?) */
if (!strpbrk(s, ".-"))
return "whois.internic.net";
/* smells like an IP? */ /* smells like an IP? */
if ((ip = myinet_aton(s))) { if ((ip = myinet_aton(s))) {
for (i = 0; ip_assign[i].serv; i++) for (i = 0; ip_assign[i].serv; i++)
if ((ip & ip_assign[i].mask) == ip_assign[i].net) if ((ip & ip_assign[i].mask) == ip_assign[i].net)
return ip_assign[i].serv; return ip_assign[i].serv;
if (verb) if (verb)
printf(_("I don't know where this IP has been delegated.\n" fputs(_("I don't know where this IP has been delegated.\n"
"I'll try ARIN and hope for the best...\n")); "I'll try ARIN and hope for the best...\n"), stdout);
return "whois.arin.net"; return "whois.arin.net";
} }
@ -157,35 +164,62 @@ const char *whichwhois(const char *s)
/* no dot but hyphen, check for ARIN netblock names */ /* no dot but hyphen, check for ARIN netblock names */
if (!strchr(s, '.')) { if (!strchr(s, '.')) {
for (i = 0; arin_nets[i]; i++) for (i = 0; arin_nets[i]; i++)
if (!strncmp(s, arin_nets[i], strlen(arin_nets[i]))) if (!strncasecmp(s, arin_nets[i], strlen(arin_nets[i])))
return "whois.arin.net"; return "whois.arin.net";
/* could be one of *NETBLK-RIPE* *NET-RIPE* *APNIC* *AUNIC-AU* */ /* could be one of *NETBLK-RIPE* *NET-RIPE* *APNIC* *AUNIC-AU* */
if (verb) if (verb)
printf(_("I guess it's a netblock name but I don't know where to" fputs(_("I guess it's a netblock name but I don't know where to"
" look it up.\n")); " look it up.\n"), stdout);
return "whois.arin.net"; return "whois.arin.net";
} }
/* has dot and hypen and it's not in tld_serv[], WTF is it? */ /* has dot and hypen and it's not in tld_serv[], WTF is it? */
if (verb) if (verb)
printf(_("I guess it's a domain but I don't know where to look it" fputs(_("I guess it's a domain but I don't know where to look it"
" up.\n")); " up.\n"), stdout);
return NULL; return NULL;
} }
const char *whereas(unsigned short asn, struct as_del aslist[])
{
int i;
if (asn > 14335)
puts(_("Unknown AS number. Please upgrade this program."));
for (i = 0; aslist[i].serv; i++)
if (asn >= aslist[i].first && asn <= aslist[i].last)
return aslist[i].serv;
return "whois.arin.net";
}
char *queryformat(const char *server, const char *flags, const char *query) char *queryformat(const char *server, const char *flags, const char *query)
{ {
char *buf; char *buf;
int i; int i, isripe = 0;
buf = malloc(QUERYBUFSIZE); buf = malloc(QUERYBUFSIZE + 1); /* +1 is for ARIN AS queries */
strcpy(buf, flags); //*buf = '\0';
for (i = 0; ripe_servers[i]; i++) for (i = 0; ripe_servers[i]; i++)
if (strcmp(server, ripe_servers[i]) == 0) if (strcmp(server, ripe_servers[i]) == 0) {
strcat(buf, VERSION " "); strcat(buf, "-V" IDSTRING " ");
strcat(buf, query); isripe = 1;
if (strcmp(server, "whois.nic.ad.jp") == 0) { break;
}
if (*flags != '\0') {
if (isripe && *flags != '\0')
puts(_("Warning: RIPE flags ignored for a traditional server."));
else
strcat(buf, flags);
}
if (!isripe && strcmp(server, "whois.arin.net") == 0 &&
strncasecmp(query, "AS", 2) == 0 &&
query[2] >= '0' && query[2] <= '9') {
sprintf(buf, "AS ");
strcat(buf, query + 2);
} else
strcat(buf, query);
if (!isripe && strcmp(server, "whois.nic.ad.jp") == 0) {
char *lang = getenv("LANG"); /* not a perfect check, but... */ char *lang = getenv("LANG"); /* not a perfect check, but... */
if (lang && (strncmp(getenv("LANG"), "ja", 2) != 0)) if (lang && (strncmp(getenv("LANG"), "ja", 2) != 0))
strcat(buf, "/e"); /* ask for english text */ strcat(buf, "/e"); /* ask for english text */
@ -206,9 +240,9 @@ void do_query(const int sock, const char *query)
err_sys("write"); err_sys("write");
while (fgets(buf, 100, fi)) { /* XXX errors? */ while (fgets(buf, 100, fi)) { /* XXX errors? */
#ifdef HIDE_DISCL #ifdef HIDE_DISCL
if (hide == 1 && if (hide == 1) {
strncmp(buf, DISCL_END, sizeof(DISCL_END) - 1) == 0) { if (strncmp(buf, DISCL_END, sizeof(DISCL_END) - 1) == 0)
hide = 2; /* stop hiding */ hide = 2; /* stop hiding */
continue; continue;
} }
if (hide == 0 && if (hide == 0 &&
@ -235,7 +269,7 @@ void do_query(const int sock, const char *query)
} }
} }
#endif #endif
printf("%s", buf); fputs(buf, stdout);
} }
#ifdef HIDE_DISCL #ifdef HIDE_DISCL
if (hide == 1) if (hide == 1)
@ -267,7 +301,7 @@ const char *query_crsnic(const int sock, const char *query)
for (; *p != '\n' && *p != '\r'; *q++ = *p++); /* copy data */ for (; *p != '\n' && *p != '\r'; *q++ = *p++); /* copy data */
*q = '\0'; *q = '\0';
} }
printf("%s", buf); fputs(buf, stdout);
} }
free(temp); free(temp);
@ -336,11 +370,12 @@ void sighandler(int signum)
err_quit(_("Interrupted by signal %d..."), signum); err_quit(_("Interrupted by signal %d..."), signum);
} }
/* check if dom ends with tld */
int domcmp(const char *dom, const char *tld) int domcmp(const char *dom, const char *tld)
{ {
const char *p, *q; const char *p, *q;
if (!(p = rindex(dom, *tld))) if (!(p = strrchr(dom, *tld)))
return 0; return 0;
q = tld; q = tld;
while (tolower(*p) == *q) while (tolower(*p) == *q)
@ -349,6 +384,7 @@ int domcmp(const char *dom, const char *tld)
return 0; return 0;
} }
/* check if dom ends with an element of tldlist[] */
int domfind(const char *dom, const char *tldlist[]) int domfind(const char *dom, const char *tldlist[])
{ {
int i; int i;
@ -372,7 +408,7 @@ unsigned long myinet_aton(const char *s)
void usage(void) void usage(void)
{ {
fprintf(stderr, _( fputs(_(
"Usage: whois [OPTION]... OBJECT...\n\n" "Usage: whois [OPTION]... OBJECT...\n\n"
"-a search all databases\n" "-a search all databases\n"
"-C first query CRSNIC to find GTLD registrar\n" "-C first query CRSNIC to find GTLD registrar\n"
@ -394,7 +430,7 @@ void usage(void)
"-v TYPE requests verbose template for object of TYPE\n" "-v TYPE requests verbose template for object of TYPE\n"
"-V explain what is being done\n\n" "-V explain what is being done\n\n"
"Version " VERSION ". Please report bugs to <md@linux.it>.\n" "Version " VERSION ". Please report bugs to <md@linux.it>.\n"
)); ), stderr);
exit(1); exit(1);
} }

19
whois.h
View File

@ -1,7 +1,3 @@
/* Identification string */
/* #define IDSTRING "-VMd" VERSION */
#define IDSTRING "-VwC2.0"
/* Size of the buffer where the query is built */ /* Size of the buffer where the query is built */
#define QUERYBUFSIZE 1024 #define QUERYBUFSIZE 1024
@ -16,7 +12,6 @@
/* system features */ /* system features */
#ifdef linux #ifdef linux
# define HAVE_GNU_GETOPT
# define ENABLE_NLS # define ENABLE_NLS
# if __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1 # if __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1
# define HAVE_GETADDRINFO # define HAVE_GETADDRINFO
@ -47,16 +42,9 @@
#endif #endif
/* If needed, disable GNU getopt "features" */
#ifdef HAVE_GNU_GETOPT
# define GETOPT(argc, argv, str) getopt((argc), (argv), "+" str)
#else
# define GETOPT(argc, argv, str) getopt((argc), (argv), (str))
#endif
/* prototypes */ /* prototypes */
const char *whichwhois(const char *); const char *whichwhois(const char *);
const char *whereas(unsigned short, struct as_del []);
char *queryformat(const char *, const char *, const char *); char *queryformat(const char *, const char *, const char *);
void do_query(const int, const char *); void do_query(const int, const char *);
const char *query_crsnic(const int, const char *); const char *query_crsnic(const int, const char *);
@ -71,3 +59,8 @@ int domfind(const char *, const char *[]);
void err_quit(const char *,...); void err_quit(const char *,...);
void err_sys(const char *,...); void err_sys(const char *,...);
/* flags for RIPE-like servers */
const char *ripeflags="acFLmMrRS";
const char *ripeflagsp="gisTtv";