mirror of
https://github.com/rfc1036/whois.git
synced 2026-05-03 06:51:09 +00:00
Imported Debian version 4.4.1
This commit is contained in:
parent
bc68e8c4a6
commit
6d3af40a95
24
Makefile
24
Makefile
@ -1,24 +1,38 @@
|
||||
prefix=/usr/local
|
||||
|
||||
OPTS=-O2
|
||||
|
||||
# Solaris
|
||||
#LDFLAGS=-lnsl -lsocket
|
||||
|
||||
all: whois #pos
|
||||
|
||||
whois: whois.c whois.h config.h data.h ip_del.h tld_serv.h
|
||||
$(CC) $(OPTS) whois.c -o whois
|
||||
whois: whois.c whois.h config.h data.h as_del.h ip_del.h tld_serv.h
|
||||
$(CC) $(OPTS) whois.c -o whois $(LDFLAGS)
|
||||
|
||||
mkpasswd:
|
||||
$(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
|
||||
./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
|
||||
./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
|
||||
rm -f po/whois.pot
|
||||
|
||||
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
|
||||
|
||||
test:
|
||||
|
||||
4
README
4
README
@ -24,8 +24,10 @@ Other information sources:
|
||||
- RIPE-187 and RIPE-189 (from ftp://ftp.ripe.net/ripe/docs/ or
|
||||
http://www.ripe.net/docs/)
|
||||
- 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/
|
||||
|
||||
- http://www.apnic.net/db/RIRs.html and
|
||||
http://www.apnic.net/maps/tld-list.html
|
||||
|
||||
Marco d'Itri
|
||||
<md@linux.it>
|
||||
|
||||
2
TODO
2
TODO
@ -3,3 +3,5 @@ Still to sort:
|
||||
|
||||
Is MNT-* a standard of some registry?
|
||||
|
||||
What about rwhois?
|
||||
|
||||
|
||||
15
as_del_list
Normal file
15
as_del_list
Normal 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
|
||||
7
config.h
7
config.h
@ -6,6 +6,9 @@
|
||||
/* Suppress lame Internic disclaimer */
|
||||
#define HIDE_DISCL
|
||||
|
||||
/* program version */
|
||||
#define VERSION "4.3"
|
||||
/* Program version */
|
||||
#define VERSION "4.4.1"
|
||||
|
||||
/* String sent to RIPE servers - ONLY FIVE CHARACTERS! */
|
||||
#define IDSTRING "Md4.4"
|
||||
|
||||
|
||||
50
data.h
50
data.h
@ -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[] = {
|
||||
/* will accept the new syntax (-V wp3.0) */
|
||||
"whois.ripe.net",
|
||||
"whois.ra.net",
|
||||
"whois.apnic.net",
|
||||
"whois.mci.net",
|
||||
"whois.isi.edu",
|
||||
"whois.6bone.net", /* 3.0.0b1 */
|
||||
"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.6bone.net",
|
||||
"whois.ans.net",
|
||||
"whois.ra.net",
|
||||
"whois.ripn.net",
|
||||
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[] = {
|
||||
".com",
|
||||
".net",
|
||||
@ -29,9 +48,9 @@ const char *arin_nets[] = {
|
||||
};
|
||||
|
||||
struct ip_del {
|
||||
unsigned long int net;
|
||||
unsigned long int mask;
|
||||
const char *serv;
|
||||
unsigned long net;
|
||||
unsigned long mask;
|
||||
const char *serv;
|
||||
};
|
||||
|
||||
struct ip_del ip_assign[] = {
|
||||
@ -39,6 +58,17 @@ struct ip_del ip_assign[] = {
|
||||
{ 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[] = {
|
||||
#include "tld_serv.h"
|
||||
NULL, NULL
|
||||
|
||||
29
debian/changelog
vendored
29
debian/changelog
vendored
@ -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
|
||||
|
||||
* CRSNIC code parsed the wrong field (closes: #48590).
|
||||
|
||||
57
ip_del_list
57
ip_del_list
@ -3,38 +3,65 @@
|
||||
61.0.0.0/8 apnic
|
||||
62.0.0.0/8 ripe
|
||||
0.0.0.0/2 arin # all other A classes are managed by ARIN
|
||||
## The B class space is a mess :-(
|
||||
#? 139. 20-29
|
||||
145.224.0.0/12 ripe
|
||||
## The B class space is a mess :-( - something could be still missing
|
||||
139.20.0.0/14 ripe
|
||||
139.24.0.0/14 ripe
|
||||
139.28.0.0/15 ripe
|
||||
141.0.0.0/10 ripe
|
||||
141.64.0.0/11 ripe # unsure
|
||||
149.192.0.0/10 ripe # unsure
|
||||
#? 149. 202-251
|
||||
141.64.0.0/12 ripe
|
||||
141.80.0.0/14 ripe
|
||||
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
|
||||
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.220.0.0/8 ripe
|
||||
163.128.0.0/12 ripe
|
||||
160.220.0.0/16 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.0.0.0/6 ripe
|
||||
164.128.0.0/12 ripe
|
||||
169.208.0.0/12 apnic
|
||||
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
|
||||
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.106.144.0/20 ripe
|
||||
192.106.196.0/23 ripe
|
||||
192.162.0.0/16 ripe
|
||||
192.164.0.0/14 ripe
|
||||
192.0.0.0/8 arin # the swamp
|
||||
193.0.0.0/8 ripe
|
||||
194.0.0.0/7 ripe
|
||||
198.17.117.0/24 ripe
|
||||
196.0.0.0/6 arin
|
||||
200.0.0.0/7 arin
|
||||
203.0.0.0/10 aunic
|
||||
202.0.0.0/7 apnic
|
||||
204.0.0.0/6 arin
|
||||
208.0.0.0/7 arin
|
||||
|
||||
20
make_as_del.pl
Executable file
20
make_as_del.pl
Executable 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";
|
||||
}
|
||||
|
||||
@ -7,7 +7,7 @@ while (<>) {
|
||||
s/^\s*(.*)\s*$/$1/;
|
||||
s/\s*#.*$//;
|
||||
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";
|
||||
}
|
||||
|
||||
|
||||
42
po/it.po
42
po/it.po
@ -4,8 +4,8 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: whois 3.0\n"
|
||||
"POT-Creation-Date: 1999-10-26 12:19+0200\n"
|
||||
"Project-Id-Version: whois 4.4.0\n"
|
||||
"POT-Creation-Date: 1999-11-09 22:15+0100\n"
|
||||
"PO-Revision-Date: 1999-10-26 12:19+02:00\n"
|
||||
"Last-Translator: Marco d'Itri <md@linux.it>\n"
|
||||
"Language-Team: Italian <it@li.org>\n"
|
||||
@ -13,11 +13,11 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=iso-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: ../whois.c:95
|
||||
#: ../whois.c:93
|
||||
msgid "Connecting to whois.crsnic.net.\n"
|
||||
msgstr "Mi sto connettendo a whois.crsnic.net.\n"
|
||||
|
||||
#: ../whois.c:103
|
||||
#: ../whois.c:97
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\n"
|
||||
@ -25,20 +25,20 @@ msgid ""
|
||||
"\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Trovato un riferimento CRSNIC a %s.\n"
|
||||
"Trovato un riferimento di CRSNIC a %s.\n"
|
||||
"\n"
|
||||
|
||||
#: ../whois.c:113
|
||||
#: ../whois.c:105
|
||||
#, c-format
|
||||
msgid "Using default server %s.\n"
|
||||
msgstr "Uso il server predefinito %s.\n"
|
||||
|
||||
#: ../whois.c:115
|
||||
#: ../whois.c:107
|
||||
#, c-format
|
||||
msgid "Using server %s.\n"
|
||||
msgstr "Uso il server %s.\n"
|
||||
|
||||
#: ../whois.c:120
|
||||
#: ../whois.c:112
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Query string: \"%s\"\n"
|
||||
@ -47,7 +47,7 @@ msgstr ""
|
||||
"Richiesta: \"%s\"\n"
|
||||
"\n"
|
||||
|
||||
#: ../whois.c:156
|
||||
#: ../whois.c:153
|
||||
msgid ""
|
||||
"I don't know where this IP has been delegated.\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"
|
||||
"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"
|
||||
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"
|
||||
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
|
||||
msgid "Detected referral to %s on %s.\n"
|
||||
msgstr "Trovato un riferimento a %s su %s.\n"
|
||||
|
||||
#: ../whois.c:252
|
||||
#: ../whois.c:267
|
||||
msgid ""
|
||||
"Catastrophic error: INTERNIC changed the disclaimer text.\n"
|
||||
"Please upgrade this program.\n"
|
||||
@ -76,22 +84,22 @@ msgstr ""
|
||||
"Errore catastrofico: INTERNIC ha cambiato il testo di avvertenze.\n"
|
||||
"Aggiorna questo programma.\n"
|
||||
|
||||
#: ../whois.c:313
|
||||
#: ../whois.c:335
|
||||
#, c-format
|
||||
msgid "Host %s not found."
|
||||
msgstr "Host %s non trovato."
|
||||
|
||||
#: ../whois.c:322
|
||||
#: ../whois.c:344
|
||||
#, c-format
|
||||
msgid "%s/tcp: unknown service"
|
||||
msgstr "%s/tcp: servizio sconosciuto"
|
||||
|
||||
#: ../whois.c:339
|
||||
#: ../whois.c:361
|
||||
#, c-format
|
||||
msgid "Interrupted by signal %d..."
|
||||
msgstr "Interrotto dal segnale %d..."
|
||||
|
||||
#: ../whois.c:379
|
||||
#: ../whois.c:403
|
||||
msgid ""
|
||||
"Usage: whois [OPTION]... OBJECT...\n"
|
||||
"\n"
|
||||
|
||||
108
test-whois.pl
Executable file
108
test-whois.pl
Executable 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;
|
||||
}
|
||||
|
||||
@ -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.net whois.nomination.net
|
||||
.uk.net whois.nomination.net
|
||||
@ -11,18 +14,21 @@
|
||||
.mil whois.nic.mil
|
||||
.ac whois.nic.ac
|
||||
.ad whois.ripe.net
|
||||
.al whois.ripe.net
|
||||
.af whois.nic.tm
|
||||
#.al whois.ripe.net #wrong
|
||||
.am whois.amnic.net
|
||||
.as whois.nic.as
|
||||
.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
|
||||
.az whois.ripe.net
|
||||
#.az whois.ripe.net #wrong
|
||||
.ba whois.ripe.net
|
||||
.be whois.ripe.net
|
||||
.bg whois.ripe.net
|
||||
#.bm rwhois.ibl.bm:4321
|
||||
.br whois.nic.br
|
||||
.by whois.ripe.net
|
||||
.bt whois.nic.tm
|
||||
#.by whois.ripe.net #wrong
|
||||
.ca whois.cdnnet.ca
|
||||
.cc whois.nic.cc
|
||||
.ch whois.nic.ch
|
||||
@ -30,33 +36,37 @@
|
||||
.ac.cn whois.cnc.ac.cn
|
||||
.cn whois.cnnic.net.cn
|
||||
.uk.co whois.uk.co
|
||||
.co whois.ripe.net
|
||||
#.co whois.ripe.net #wrong
|
||||
#.cx whois.nic.cx #
|
||||
.cy whois.ripe.net
|
||||
.cz whois.ripe.net
|
||||
.de whois.ripe.net
|
||||
.dk whois.ripe.net
|
||||
.dz whois.ripe.net
|
||||
.ee whois.ripe.net
|
||||
.eg whois.ripe.net
|
||||
#.dz whois.ripe.net #wrong
|
||||
#.ee whois.ripe.net #wrong
|
||||
#.eg whois.ripe.net #wrong
|
||||
.es whois.ripe.net
|
||||
.fi whois.ripe.net
|
||||
#.fi whois.ripe.net #wrong
|
||||
.fo whois.ripe.net
|
||||
.fr whois.nic.fr
|
||||
.ga whois.ripe.net
|
||||
.gb whois.ripe.net
|
||||
.ge whois.ripe.net
|
||||
#.ga whois.ripe.net #wrong
|
||||
#.gb whois.ripe.net #wrong
|
||||
#.ge whois.ripe.net #wrong
|
||||
#.gf whois.nplus.gf #
|
||||
#.gi whois.nic.gi #
|
||||
.gl whois.ripe.net
|
||||
.gm whois.ripe.net
|
||||
.gr whois.ripe.net
|
||||
.gs whois.adamsnames.tc
|
||||
.hk whois.apnic.net
|
||||
.hk whois.hknic.net.hk
|
||||
.hm whois.nic.hm
|
||||
.hr whois.ripe.net
|
||||
.hu whois.ripe.net
|
||||
.id whois.idnic.net.id
|
||||
.id whois.idnic.net.id # broken
|
||||
.ie 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
|
||||
.it whois.nic.it
|
||||
.jo whois.ripe.net
|
||||
@ -68,13 +78,14 @@
|
||||
.lt whois.ripe.net
|
||||
.lu whois.ripe.net
|
||||
.lv whois.ripe.net
|
||||
.ma whois.ripe.net
|
||||
#.ly whois.nic.ly #
|
||||
#.ma whois.ripe.net #wrong
|
||||
.mc whois.ripe.net
|
||||
.md whois.ripe.net
|
||||
.mk whois.ripe.net
|
||||
.mm whois.nic.mm
|
||||
#.mk whois.ripe.net #wrong
|
||||
#.mm whois.nic.mm #
|
||||
.ms whois.adamsnames.tc
|
||||
.mt whois.ripe.net
|
||||
#.mt whois.ripe.net #wrong
|
||||
.mx whois.nic.mx
|
||||
.ng pgebrehiwot.iat.cnr.it
|
||||
.nl www.domain-registry.nl
|
||||
@ -83,17 +94,21 @@
|
||||
.nz tardis.patho.gen.nz
|
||||
.pe whois.rcp.net.pe
|
||||
.pl whois.ripe.net
|
||||
#.pr whois.uprr.pr #
|
||||
.pk whois.pknic.net.pk
|
||||
.pt whois.dns.pt
|
||||
.ro whois.nic.ro
|
||||
#.pt whois.dns.pt # disabled - use http://www.dns.pt/info/
|
||||
.pw whois.nic.pw
|
||||
.ro whois.ripe.net
|
||||
.ru whois.ripn.net
|
||||
.se whois.nic-se.se
|
||||
.sg whois.nic.net.sg
|
||||
.sh whois.nic.sh
|
||||
.si whois.ripe.net
|
||||
#.si whois.ripe.net #wrong
|
||||
.sk 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
|
||||
.tf whois.adamsnames.tc
|
||||
.th whois.thnic.net
|
||||
@ -108,12 +123,18 @@
|
||||
.uk whois.nic.uk
|
||||
.us whois.isi.edu
|
||||
.va whois.ripe.net
|
||||
#.ve rwhois.reacciun.ve:4321
|
||||
.vg whois.adamsnames.tc
|
||||
.yu whois.ripe.net
|
||||
.za whois.frd.ac.za
|
||||
-arin whois.arin.net
|
||||
-ripe whois.ripe.net
|
||||
-ap whois.apnic.net
|
||||
-dom whois.internic.net
|
||||
-org 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
|
||||
-ripn whois.ripn.net
|
||||
-sgnic whois.nic.net.sg
|
||||
-metu whois.metu.edu.tr
|
||||
|
||||
18
whois.1
18
whois.1
@ -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
|
||||
whois \- client for the whois directory service
|
||||
.SH SYNOPSIS
|
||||
@ -65,6 +65,19 @@ to find the registrar for a GTLD subdomain. This option overrides
|
||||
Be verbose.
|
||||
.TP 8
|
||||
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"
|
||||
.I RFC 812:
|
||||
NICNAME/WHOIS
|
||||
@ -74,7 +87,7 @@ RIPE NCC Database Documentation
|
||||
.PP
|
||||
Detailed help on available flags can be found in
|
||||
.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
|
||||
.B whois -h whois.ripe.net HELP
|
||||
.SH HISTORY
|
||||
@ -87,4 +100,3 @@ Kessens of QWest for the 6bone server.
|
||||
.B Whois
|
||||
and this man page were written by Marco d'Itri <md@linux.it>
|
||||
and are licensed under the GPL.
|
||||
|
||||
|
||||
102
whois.c
102
whois.c
@ -19,18 +19,19 @@
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
|
||||
/* Application-specific */
|
||||
#include "config.h"
|
||||
#include "whois.h"
|
||||
#include "data.h"
|
||||
#include "whois.h"
|
||||
|
||||
/* Global variables */
|
||||
int sockfd, verb = 0;
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int ch, nopar = 0, optC = 0;
|
||||
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";
|
||||
|
||||
#ifdef ENABLE_NLS
|
||||
@ -39,7 +40,7 @@ int main(int argc, char *argv[])
|
||||
textdomain(NLS_CAT_NAME);
|
||||
#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 */
|
||||
if (strchr(ripeflags, ch)) {
|
||||
for (p = fstring; *p != '\0'; p++);
|
||||
@ -56,7 +57,8 @@ int main(int argc, char *argv[])
|
||||
/* program flags */
|
||||
switch (ch) {
|
||||
case 'h':
|
||||
server = optarg;
|
||||
server = q = malloc(strlen(optarg) + 1);
|
||||
for (p = optarg; *p != '\0'; *q++ = tolower(*p++));
|
||||
break;
|
||||
case 'p':
|
||||
port = optarg;
|
||||
@ -89,7 +91,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
if (optC && domfind(qstring, gtlds)) {
|
||||
if (verb)
|
||||
printf(_("Connecting to whois.crsnic.net.\n"));
|
||||
fputs(_("Connecting to whois.crsnic.net.\n"), stdout);
|
||||
sockfd = openconn("whois.crsnic.net", "43");
|
||||
server = query_crsnic(sockfd, qstring);
|
||||
if (verb && server)
|
||||
@ -107,8 +109,9 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
p = queryformat(server, fstring, qstring);
|
||||
if (verb)
|
||||
if (verb) {
|
||||
printf(_("Query string: \"%s\"\n\n"), p);
|
||||
}
|
||||
strcat(p, "\r\n");
|
||||
|
||||
signal(SIGTERM, sighandler);
|
||||
@ -130,22 +133,26 @@ const char *whichwhois(const char *s)
|
||||
if (*s == '\0')
|
||||
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 */
|
||||
if (strchr(s, ':'))
|
||||
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? */
|
||||
if ((ip = myinet_aton(s))) {
|
||||
for (i = 0; ip_assign[i].serv; i++)
|
||||
if ((ip & ip_assign[i].mask) == ip_assign[i].net)
|
||||
return ip_assign[i].serv;
|
||||
if (verb)
|
||||
printf(_("I don't know where this IP has been delegated.\n"
|
||||
"I'll try ARIN and hope for the best...\n"));
|
||||
fputs(_("I don't know where this IP has been delegated.\n"
|
||||
"I'll try ARIN and hope for the best...\n"), stdout);
|
||||
return "whois.arin.net";
|
||||
}
|
||||
|
||||
@ -157,35 +164,62 @@ const char *whichwhois(const char *s)
|
||||
/* no dot but hyphen, check for ARIN netblock names */
|
||||
if (!strchr(s, '.')) {
|
||||
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";
|
||||
/* could be one of *NETBLK-RIPE* *NET-RIPE* *APNIC* *AUNIC-AU* */
|
||||
if (verb)
|
||||
printf(_("I guess it's a netblock name but I don't know where to"
|
||||
" look it up.\n"));
|
||||
fputs(_("I guess it's a netblock name but I don't know where to"
|
||||
" look it up.\n"), stdout);
|
||||
return "whois.arin.net";
|
||||
}
|
||||
|
||||
/* has dot and hypen and it's not in tld_serv[], WTF is it? */
|
||||
if (verb)
|
||||
printf(_("I guess it's a domain but I don't know where to look it"
|
||||
" up.\n"));
|
||||
fputs(_("I guess it's a domain but I don't know where to look it"
|
||||
" up.\n"), stdout);
|
||||
|
||||
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 *buf;
|
||||
int i;
|
||||
int i, isripe = 0;
|
||||
|
||||
buf = malloc(QUERYBUFSIZE);
|
||||
strcpy(buf, flags);
|
||||
buf = malloc(QUERYBUFSIZE + 1); /* +1 is for ARIN AS queries */
|
||||
//*buf = '\0';
|
||||
for (i = 0; ripe_servers[i]; i++)
|
||||
if (strcmp(server, ripe_servers[i]) == 0)
|
||||
strcat(buf, VERSION " ");
|
||||
strcat(buf, query);
|
||||
if (strcmp(server, "whois.nic.ad.jp") == 0) {
|
||||
if (strcmp(server, ripe_servers[i]) == 0) {
|
||||
strcat(buf, "-V" IDSTRING " ");
|
||||
isripe = 1;
|
||||
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... */
|
||||
if (lang && (strncmp(getenv("LANG"), "ja", 2) != 0))
|
||||
strcat(buf, "/e"); /* ask for english text */
|
||||
@ -206,9 +240,9 @@ void do_query(const int sock, const char *query)
|
||||
err_sys("write");
|
||||
while (fgets(buf, 100, fi)) { /* XXX errors? */
|
||||
#ifdef HIDE_DISCL
|
||||
if (hide == 1 &&
|
||||
strncmp(buf, DISCL_END, sizeof(DISCL_END) - 1) == 0) {
|
||||
hide = 2; /* stop hiding */
|
||||
if (hide == 1) {
|
||||
if (strncmp(buf, DISCL_END, sizeof(DISCL_END) - 1) == 0)
|
||||
hide = 2; /* stop hiding */
|
||||
continue;
|
||||
}
|
||||
if (hide == 0 &&
|
||||
@ -235,7 +269,7 @@ void do_query(const int sock, const char *query)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
printf("%s", buf);
|
||||
fputs(buf, stdout);
|
||||
}
|
||||
#ifdef HIDE_DISCL
|
||||
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 */
|
||||
*q = '\0';
|
||||
}
|
||||
printf("%s", buf);
|
||||
fputs(buf, stdout);
|
||||
}
|
||||
|
||||
free(temp);
|
||||
@ -336,11 +370,12 @@ void sighandler(int signum)
|
||||
err_quit(_("Interrupted by signal %d..."), signum);
|
||||
}
|
||||
|
||||
/* check if dom ends with tld */
|
||||
int domcmp(const char *dom, const char *tld)
|
||||
{
|
||||
const char *p, *q;
|
||||
|
||||
if (!(p = rindex(dom, *tld)))
|
||||
if (!(p = strrchr(dom, *tld)))
|
||||
return 0;
|
||||
q = tld;
|
||||
while (tolower(*p) == *q)
|
||||
@ -349,6 +384,7 @@ int domcmp(const char *dom, const char *tld)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* check if dom ends with an element of tldlist[] */
|
||||
int domfind(const char *dom, const char *tldlist[])
|
||||
{
|
||||
int i;
|
||||
@ -372,7 +408,7 @@ unsigned long myinet_aton(const char *s)
|
||||
|
||||
void usage(void)
|
||||
{
|
||||
fprintf(stderr, _(
|
||||
fputs(_(
|
||||
"Usage: whois [OPTION]... OBJECT...\n\n"
|
||||
"-a search all databases\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 explain what is being done\n\n"
|
||||
"Version " VERSION ". Please report bugs to <md@linux.it>.\n"
|
||||
));
|
||||
), stderr);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
19
whois.h
19
whois.h
@ -1,7 +1,3 @@
|
||||
/* Identification string */
|
||||
/* #define IDSTRING "-VMd" VERSION */
|
||||
#define IDSTRING "-VwC2.0"
|
||||
|
||||
/* Size of the buffer where the query is built */
|
||||
#define QUERYBUFSIZE 1024
|
||||
|
||||
@ -16,7 +12,6 @@
|
||||
|
||||
/* system features */
|
||||
#ifdef linux
|
||||
# define HAVE_GNU_GETOPT
|
||||
# define ENABLE_NLS
|
||||
# if __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1
|
||||
# define HAVE_GETADDRINFO
|
||||
@ -47,16 +42,9 @@
|
||||
#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 */
|
||||
const char *whichwhois(const char *);
|
||||
const char *whereas(unsigned short, struct as_del []);
|
||||
char *queryformat(const char *, const char *, const char *);
|
||||
void do_query(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_sys(const char *,...);
|
||||
|
||||
|
||||
/* flags for RIPE-like servers */
|
||||
const char *ripeflags="acFLmMrRS";
|
||||
const char *ripeflagsp="gisTtv";
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user