Importing usr.bin/whois
No Minix-specific changes needed. Change-Id: Ia255774b1389a838714dc67be808b31258bab050
This commit is contained in:
parent
f55b7dc853
commit
2f85279772
6 changed files with 653 additions and 1 deletions
|
@ -543,6 +543,7 @@
|
||||||
./usr/bin/which minix-sys
|
./usr/bin/which minix-sys
|
||||||
./usr/bin/who minix-sys
|
./usr/bin/who minix-sys
|
||||||
./usr/bin/whoami minix-sys
|
./usr/bin/whoami minix-sys
|
||||||
|
./usr/bin/whois minix-sys
|
||||||
./usr/bin/worldstone minix-sys
|
./usr/bin/worldstone minix-sys
|
||||||
./usr/bin/write minix-sys
|
./usr/bin/write minix-sys
|
||||||
./usr/bin/writeisofs minix-sys
|
./usr/bin/writeisofs minix-sys
|
||||||
|
@ -2102,6 +2103,7 @@
|
||||||
./usr/man/man1/which.1 minix-sys
|
./usr/man/man1/which.1 minix-sys
|
||||||
./usr/man/man1/who.1 minix-sys
|
./usr/man/man1/who.1 minix-sys
|
||||||
./usr/man/man1/whoami.1 minix-sys
|
./usr/man/man1/whoami.1 minix-sys
|
||||||
|
./usr/man/man1/whois.1 minix-sys
|
||||||
./usr/man/man1/worldstone.1 minix-sys
|
./usr/man/man1/worldstone.1 minix-sys
|
||||||
./usr/man/man1/write.1 minix-sys
|
./usr/man/man1/write.1 minix-sys
|
||||||
./usr/man/man1/xargs.1 minix-sys
|
./usr/man/man1/xargs.1 minix-sys
|
||||||
|
|
|
@ -217,6 +217,7 @@
|
||||||
2012/10/17 12:00:00,usr.bin/wc
|
2012/10/17 12:00:00,usr.bin/wc
|
||||||
2013/03/22 12:00:00,usr.bin/whatis
|
2013/03/22 12:00:00,usr.bin/whatis
|
||||||
2013/03/15 12:00:00,usr.bin/who
|
2013/03/15 12:00:00,usr.bin/who
|
||||||
|
2012/10/17 12:00:00,usr.bin/whois
|
||||||
2012/10/17 12:00:00,usr.bin/write
|
2012/10/17 12:00:00,usr.bin/write
|
||||||
2012/10/17 12:00:00,usr.bin/xinstall
|
2012/10/17 12:00:00,usr.bin/xinstall
|
||||||
2013/03/15 12:00:00,usr.bin/yes
|
2013/03/15 12:00:00,usr.bin/yes
|
||||||
|
|
|
@ -31,7 +31,7 @@ SUBDIR= asa \
|
||||||
uniq units unzip users \
|
uniq units unzip users \
|
||||||
uuidgen \
|
uuidgen \
|
||||||
\
|
\
|
||||||
wc whatis who \
|
wc whatis who whois \
|
||||||
write xargs xinstall yes
|
write xargs xinstall yes
|
||||||
|
|
||||||
.if !defined(__MINIX)
|
.if !defined(__MINIX)
|
||||||
|
|
9
usr.bin/whois/Makefile
Normal file
9
usr.bin/whois/Makefile
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# $NetBSD: Makefile,v 1.7 2009/04/14 22:15:29 lukem Exp $
|
||||||
|
# @(#)Makefile 8.1 (Berkeley) 6/6/93
|
||||||
|
|
||||||
|
USE_FORT?= yes # network client
|
||||||
|
|
||||||
|
PROG= whois
|
||||||
|
CPPFLAGS+= -DRIPE
|
||||||
|
|
||||||
|
.include <bsd.prog.mk>
|
311
usr.bin/whois/whois.1
Normal file
311
usr.bin/whois/whois.1
Normal file
|
@ -0,0 +1,311 @@
|
||||||
|
.\" $NetBSD: whois.1,v 1.26 2012/03/15 22:35:03 njoly Exp $
|
||||||
|
.\" $OpenBSD: whois.1,v 1.22 2003/09/02 18:50:07 jmc Exp $
|
||||||
|
.\"
|
||||||
|
.\" Copyright (c) 1985, 1990, 1993
|
||||||
|
.\" The Regents of the University of California. All rights reserved.
|
||||||
|
.\"
|
||||||
|
.\" Redistribution and use in source and binary forms, with or without
|
||||||
|
.\" modification, are permitted provided that the following conditions
|
||||||
|
.\" are met:
|
||||||
|
.\" 1. Redistributions of source code must retain the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer.
|
||||||
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer in the
|
||||||
|
.\" documentation and/or other materials provided with the distribution.
|
||||||
|
.\" 3. Neither the name of the University nor the names of its contributors
|
||||||
|
.\" may be used to endorse or promote products derived from this software
|
||||||
|
.\" without specific prior written permission.
|
||||||
|
.\"
|
||||||
|
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
.\" SUCH DAMAGE.
|
||||||
|
.\"
|
||||||
|
.\" @(#)whois.1 8.2 (Berkeley) 6/20/94
|
||||||
|
.\"
|
||||||
|
.Dd September 9, 2007
|
||||||
|
.Dt WHOIS 1
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm whois
|
||||||
|
.Nd Internet domain name and network number directory service
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.Nm whois
|
||||||
|
.Op Fl 6AadfgilmQRr
|
||||||
|
.Oo
|
||||||
|
.Fl c Ar country-code | Fl h Ar host
|
||||||
|
.Oc
|
||||||
|
.Op Fl p Ar port
|
||||||
|
.Ar name Op Ar ...
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
The
|
||||||
|
.Nm
|
||||||
|
utility looks up records in the databases maintained by several
|
||||||
|
Network Information Centers
|
||||||
|
.Pq Tn NICs .
|
||||||
|
.Pp
|
||||||
|
The options are as follows:
|
||||||
|
.Bl -tag -width Ds
|
||||||
|
.It Fl 6
|
||||||
|
Use the IPv6 Resource Center
|
||||||
|
.Pq Tn 6bone
|
||||||
|
database.
|
||||||
|
It contains network names and addresses for the IPv6 network.
|
||||||
|
.It Fl A
|
||||||
|
Use the Asia/Pacific Network Information Center
|
||||||
|
.Pq Tn APNIC
|
||||||
|
database.
|
||||||
|
It contains network numbers used in East Asia, Australia,
|
||||||
|
New Zealand, and the Pacific islands.
|
||||||
|
.It Fl a
|
||||||
|
Use the American Registry for Internet Numbers
|
||||||
|
.Pq Tn ARIN
|
||||||
|
database.
|
||||||
|
It contains network numbers used in those parts of the world
|
||||||
|
not covered by
|
||||||
|
.Tn AfriNIC ,
|
||||||
|
.Tn APNIC ,
|
||||||
|
.Tn LACNIC
|
||||||
|
or by
|
||||||
|
.Tn RIPE .
|
||||||
|
.Pp
|
||||||
|
(Hint: All point of contact handles in the
|
||||||
|
.Tn ARIN
|
||||||
|
whois database end with
|
||||||
|
.Qq Li -ARIN . )
|
||||||
|
.It Fl c Ar country-code
|
||||||
|
This is the equivalent of using the
|
||||||
|
.Fl h
|
||||||
|
option with an argument of
|
||||||
|
.Qq Ar country-code Ns Li .whois-servers.net .
|
||||||
|
.It Fl d
|
||||||
|
Use the US Department of Defense database.
|
||||||
|
It contains points of contact for subdomains of
|
||||||
|
.Tn \&.MIL .
|
||||||
|
.It Fl f
|
||||||
|
Use the African Network Information Center
|
||||||
|
.Pq Tn AfriNIC
|
||||||
|
database.
|
||||||
|
It contains network numbers used in Africa.
|
||||||
|
.It Fl g
|
||||||
|
Use the US non-military federal government database, which contains points of
|
||||||
|
contact for subdomains of
|
||||||
|
.Tn \&.GOV .
|
||||||
|
.It Fl h Ar host
|
||||||
|
Use the specified host instead of the default NIC
|
||||||
|
(whois.crsnic.net).
|
||||||
|
Either a host name or an IP address may be specified.
|
||||||
|
.Pp
|
||||||
|
By default
|
||||||
|
.Nm
|
||||||
|
constructs the name of a whois server to use from the top-level domain
|
||||||
|
.Pq Tn TLD
|
||||||
|
of the supplied (single) argument, and appending
|
||||||
|
.Qq Li .whois-servers.net .
|
||||||
|
This effectively allows a suitable whois server to be selected
|
||||||
|
automatically for a large number of
|
||||||
|
.Tn TLDs .
|
||||||
|
.Pp
|
||||||
|
In the event that an IP
|
||||||
|
address is specified, the whois server will default to the American
|
||||||
|
Registry for Internet Numbers
|
||||||
|
.Pq Tn ARIN .
|
||||||
|
If a query to
|
||||||
|
.Tn ARIN
|
||||||
|
references
|
||||||
|
.Tn AfriNIC, APNIC , LACNIC ,
|
||||||
|
or
|
||||||
|
.Tn RIPE ,
|
||||||
|
that server will be queried also, provided that the
|
||||||
|
.Fl Q
|
||||||
|
option is not specified.
|
||||||
|
.Pp
|
||||||
|
If the query is not a domain name or IP address,
|
||||||
|
.Nm
|
||||||
|
will fall back to
|
||||||
|
.Pa whois.crsnic.net .
|
||||||
|
.It Fl i
|
||||||
|
Use the Network Solutions Registry for Internet Numbers
|
||||||
|
.Pq Tn whois.networksolutions.com
|
||||||
|
database.
|
||||||
|
Historically, it contained network numbers and domain contact information
|
||||||
|
for most of
|
||||||
|
.Tn \&.COM ,
|
||||||
|
.Tn \&.NET ,
|
||||||
|
.Tn \&.ORG
|
||||||
|
and
|
||||||
|
.Tn \&.EDU
|
||||||
|
domains.
|
||||||
|
However, the registration of these domains is now done by a number of
|
||||||
|
independent and competing registrars and this database holds no information
|
||||||
|
on the domains registered by organizations other than Network Solutions, Inc.
|
||||||
|
Also, note that the
|
||||||
|
.Tn InterNIC
|
||||||
|
database
|
||||||
|
.Pq Pa whois.internic.net
|
||||||
|
is no longer handled by Network Solutions, Inc.
|
||||||
|
For details, see
|
||||||
|
.Lk http://www.internic.net/ .
|
||||||
|
.Pp
|
||||||
|
(Hint: Contact information, identified by the term
|
||||||
|
.Em handle ,
|
||||||
|
can be looked up by prefixing
|
||||||
|
.Qq Li \&!
|
||||||
|
or
|
||||||
|
.Qq Li handle\ \&
|
||||||
|
to the
|
||||||
|
.Tn NIC
|
||||||
|
handle in the query.)
|
||||||
|
.It Fl l
|
||||||
|
Use the Latin American and Caribbean IP address Regional Registry
|
||||||
|
.Pq Tn LACNIC
|
||||||
|
database.
|
||||||
|
It contains network numbers used in much of Latin America and the
|
||||||
|
Caribbean.
|
||||||
|
.It Fl m
|
||||||
|
Use the Route Arbiter Database
|
||||||
|
.Pq Tn RADB
|
||||||
|
database.
|
||||||
|
It contains route policy specifications for a large
|
||||||
|
number of operators' networks.
|
||||||
|
.It Fl p Ar port
|
||||||
|
Connect to the whois server on
|
||||||
|
.Ar port .
|
||||||
|
If this option is not specified,
|
||||||
|
.Nm
|
||||||
|
defaults to the
|
||||||
|
.Dq whois
|
||||||
|
port listed in
|
||||||
|
.Pa /etc/services
|
||||||
|
(port 43).
|
||||||
|
.It Fl Q
|
||||||
|
Do a quick lookup.
|
||||||
|
This means that
|
||||||
|
.Nm
|
||||||
|
will not attempt to lookup the name in the authoritative whois
|
||||||
|
server (if one is listed) nor will it contact InterNic if a lookup
|
||||||
|
fails.
|
||||||
|
This flag has no effect when combined with any other flag.
|
||||||
|
.It Fl R
|
||||||
|
Use the Russia Network Information Center
|
||||||
|
.Pq Tn RIPN
|
||||||
|
database.
|
||||||
|
It contains network numbers and domain contact information
|
||||||
|
for subdomains of
|
||||||
|
.Tn \&.RU .
|
||||||
|
This option is deprecated; use the
|
||||||
|
.Fl c
|
||||||
|
option with an argument of
|
||||||
|
.Qq Li RU
|
||||||
|
instead.
|
||||||
|
.It Fl r
|
||||||
|
Use the R\(aaeseaux IP Europ\(aaeens
|
||||||
|
.Pq Tn RIPE
|
||||||
|
database.
|
||||||
|
It contains network numbers and domain contact information for Europe.
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
The default action, unless directed otherwise with a special
|
||||||
|
.Ar name ,
|
||||||
|
is to do a very broad search, looking for matches to
|
||||||
|
.Ar name
|
||||||
|
in all types of records and most fields (name, nicknames, hostname, net
|
||||||
|
address, etc.) in the database.
|
||||||
|
For more information as to what
|
||||||
|
.Ar name
|
||||||
|
operands have special meaning, and how to guide the search, use
|
||||||
|
the special name
|
||||||
|
.Dq help .
|
||||||
|
.Ss Special cases
|
||||||
|
Queries beginning with an exclamation point
|
||||||
|
.Ql \&!
|
||||||
|
are assumed to be
|
||||||
|
.Tn NSI
|
||||||
|
contact handles.
|
||||||
|
Unless a host or domain is specified on the command line,
|
||||||
|
.Pq Tn whois.networksolutions.com
|
||||||
|
will be used as the
|
||||||
|
.Nm
|
||||||
|
database.
|
||||||
|
.Pp
|
||||||
|
Similarly, queries beginning with
|
||||||
|
.Dq COCO-
|
||||||
|
are assumed to be
|
||||||
|
.Tn CORE
|
||||||
|
contact handles.
|
||||||
|
Unless a host or domain is specified on the command line,
|
||||||
|
.Pq Tn whois.corenic.net
|
||||||
|
will be used as the
|
||||||
|
.Nm
|
||||||
|
database.
|
||||||
|
.Sh EXAMPLES
|
||||||
|
Most types of data, such as domain names and
|
||||||
|
.Tn IP
|
||||||
|
addresses, can be used as arguments to
|
||||||
|
.Nm
|
||||||
|
without any options, and
|
||||||
|
.Nm
|
||||||
|
will choose the correct whois server to query.
|
||||||
|
Some exceptions, where
|
||||||
|
.Nm
|
||||||
|
will not be able to handle data correctly, are detailed below.
|
||||||
|
.Pp
|
||||||
|
To obtain contact information about an
|
||||||
|
administrator located in the Russian
|
||||||
|
.Tn TLD
|
||||||
|
domain
|
||||||
|
.Qq Li RU ,
|
||||||
|
use the
|
||||||
|
.Fl c
|
||||||
|
option as shown in the following example, where
|
||||||
|
.Ar CONTACT-ID
|
||||||
|
is substituted with the actual contact identifier.
|
||||||
|
.Pp
|
||||||
|
.Dl "whois -c RU CONTACT-ID"
|
||||||
|
.Pp
|
||||||
|
(Note: This example is specific to the
|
||||||
|
.Tn TLD
|
||||||
|
.Qq Li RU ,
|
||||||
|
but other
|
||||||
|
.Tn TLDs
|
||||||
|
can be queried by using a similar syntax.)
|
||||||
|
.Pp
|
||||||
|
The following example demonstrates how to obtain information about an
|
||||||
|
.Tn IPv6
|
||||||
|
address or hostname using the
|
||||||
|
.Fl 6
|
||||||
|
option, which directs the query to
|
||||||
|
.Tn 6bone .
|
||||||
|
.Pp
|
||||||
|
.Dl "whois -6 IPv6-IP-Address"
|
||||||
|
.Pp
|
||||||
|
The following example demonstrates how to query
|
||||||
|
a whois server using a non-standard port, where
|
||||||
|
.Dq Li query-data
|
||||||
|
is the query to be sent to
|
||||||
|
.Dq Li whois.example.com
|
||||||
|
on port
|
||||||
|
.Dq Li rwhois
|
||||||
|
(written numerically as 4321).
|
||||||
|
.Pp
|
||||||
|
.Dl "whois -h whois.example.com -p rwhois query-data"
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Rs
|
||||||
|
.%A Ken Harrenstien
|
||||||
|
.%A Vic White
|
||||||
|
.%T NICNAME/WHOIS
|
||||||
|
.%D 1 March 1982
|
||||||
|
.%O RFC 812
|
||||||
|
.Re
|
||||||
|
.Sh HISTORY
|
||||||
|
The
|
||||||
|
.Nm
|
||||||
|
command appeared in
|
||||||
|
.Bx 4.3 .
|
329
usr.bin/whois/whois.c
Normal file
329
usr.bin/whois/whois.c
Normal file
|
@ -0,0 +1,329 @@
|
||||||
|
/* $NetBSD: whois.c,v 1.35 2011/08/17 13:57:12 christos Exp $ */
|
||||||
|
/* $OpenBSD: whois.c,v 1.28 2003/09/18 22:16:15 fgsch Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1980, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
__COPYRIGHT("@(#) Copyright (c) 1980, 1993\
|
||||||
|
The Regents of the University of California. All rights reserved.");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
#if 0
|
||||||
|
static const char sccsid[] = "@(#)whois.c 8.1 (Berkeley) 6/6/93";
|
||||||
|
#else
|
||||||
|
__RCSID("$NetBSD: whois.c,v 1.35 2011/08/17 13:57:12 christos Exp $");
|
||||||
|
#endif
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <err.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#define ANICHOST "whois.arin.net"
|
||||||
|
#define BNICHOST "whois.registro.br"
|
||||||
|
#define CNICHOST "whois.corenic.net"
|
||||||
|
#define DNICHOST "whois.nic.mil"
|
||||||
|
#define FNICHOST "whois.afrinic.net"
|
||||||
|
#define GNICHOST "whois.nic.gov"
|
||||||
|
#define INICHOST "whois.networksolutions.com"
|
||||||
|
#define LNICHOST "whois.lacnic.net"
|
||||||
|
#define MNICHOST "whois.ra.net"
|
||||||
|
#define NICHOST "whois.crsnic.net"
|
||||||
|
#define PNICHOST "whois.apnic.net"
|
||||||
|
#define QNICHOST_TAIL ".whois-servers.net"
|
||||||
|
#define RNICHOST "whois.ripe.net"
|
||||||
|
#define RUNICHOST "whois.ripn.net"
|
||||||
|
#define SNICHOST "whois.6bone.net"
|
||||||
|
|
||||||
|
#define WHOIS_PORT "whois"
|
||||||
|
#define WHOIS_SERVER_ID "Whois Server:"
|
||||||
|
|
||||||
|
#define WHOIS_RECURSE 0x01
|
||||||
|
#define WHOIS_QUICK 0x02
|
||||||
|
|
||||||
|
static const char *port_whois = WHOIS_PORT;
|
||||||
|
static const char *ip_whois[] =
|
||||||
|
{ LNICHOST, RNICHOST, PNICHOST, FNICHOST, BNICHOST, NULL };
|
||||||
|
|
||||||
|
static void usage(void) __dead;
|
||||||
|
static int whois(const char *, const char *, const char *, int);
|
||||||
|
static const char *choose_server(const char *, const char *);
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int ch, flags, rval;
|
||||||
|
const char *host, *name, *country;
|
||||||
|
|
||||||
|
#ifdef SOCKS
|
||||||
|
SOCKSinit(argv[0]);
|
||||||
|
#endif
|
||||||
|
country = host = NULL;
|
||||||
|
flags = rval = 0;
|
||||||
|
while ((ch = getopt(argc, argv, "6Aac:dfgh:ilmp:qQRr")) != -1)
|
||||||
|
switch(ch) {
|
||||||
|
case 'a':
|
||||||
|
host = ANICHOST;
|
||||||
|
break;
|
||||||
|
case 'A':
|
||||||
|
host = PNICHOST;
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
country = optarg;
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
host = DNICHOST;
|
||||||
|
break;
|
||||||
|
case 'f':
|
||||||
|
host = FNICHOST;
|
||||||
|
break;
|
||||||
|
case 'g':
|
||||||
|
host = GNICHOST;
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
host = optarg;
|
||||||
|
break;
|
||||||
|
case 'i':
|
||||||
|
host = INICHOST;
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
host = LNICHOST;
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
host = MNICHOST;
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
port_whois = optarg;
|
||||||
|
break;
|
||||||
|
case 'q':
|
||||||
|
/* deprecated, now the default */
|
||||||
|
break;
|
||||||
|
case 'Q':
|
||||||
|
flags |= WHOIS_QUICK;
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
host = RNICHOST;
|
||||||
|
break;
|
||||||
|
case 'R':
|
||||||
|
host = RUNICHOST;
|
||||||
|
break;
|
||||||
|
case '6':
|
||||||
|
host = SNICHOST;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
argc -= optind;
|
||||||
|
argv += optind;
|
||||||
|
|
||||||
|
if (!argc || (country != NULL && host != NULL))
|
||||||
|
usage();
|
||||||
|
|
||||||
|
if (host == NULL && country == NULL && !(flags & WHOIS_QUICK))
|
||||||
|
flags |= WHOIS_RECURSE;
|
||||||
|
for (name = *argv; (name = *argv) != NULL; argv++)
|
||||||
|
rval += whois(name, host ? host : choose_server(name, country),
|
||||||
|
port_whois, flags);
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
whois(const char *query, const char *server, const char *port, int flags)
|
||||||
|
{
|
||||||
|
FILE *sfi, *sfo;
|
||||||
|
char *buf, *p, *nhost, *nbuf = NULL;
|
||||||
|
size_t len;
|
||||||
|
int i, s, error;
|
||||||
|
const char *reason = NULL, *fmt;
|
||||||
|
struct addrinfo hints, *res, *ai;
|
||||||
|
|
||||||
|
(void)memset(&hints, 0, sizeof(hints));
|
||||||
|
hints.ai_flags = 0;
|
||||||
|
hints.ai_family = AF_UNSPEC;
|
||||||
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
|
error = getaddrinfo(server, port, &hints, &res);
|
||||||
|
if (error) {
|
||||||
|
warnx("%s: %s", server, gai_strerror(error));
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (s = -1, ai = res; ai != NULL; ai = ai->ai_next) {
|
||||||
|
s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
|
||||||
|
if (s < 0) {
|
||||||
|
error = errno;
|
||||||
|
reason = "socket";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (connect(s, ai->ai_addr, ai->ai_addrlen) < 0) {
|
||||||
|
error = errno;
|
||||||
|
reason = "connect";
|
||||||
|
close(s);
|
||||||
|
s = -1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break; /*okay*/
|
||||||
|
}
|
||||||
|
if (s < 0) {
|
||||||
|
if (reason) {
|
||||||
|
errno = error;
|
||||||
|
warn("%s: %s", server, reason);
|
||||||
|
} else
|
||||||
|
warnx("Unknown error in connection attempt");
|
||||||
|
freeaddrinfo(res);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(server, "whois.denic.de") == 0 ||
|
||||||
|
strcmp(server, "de.whois-servers.net") == 0)
|
||||||
|
fmt = "-T dn,ace -C ISO-8859-1";
|
||||||
|
else
|
||||||
|
fmt = "";
|
||||||
|
|
||||||
|
sfi = fdopen(s, "r");
|
||||||
|
sfo = fdopen(s, "w");
|
||||||
|
if (sfi == NULL || sfo == NULL)
|
||||||
|
err(1, "fdopen");
|
||||||
|
(void)fprintf(sfo, "%s%s\r\n", fmt, query);
|
||||||
|
(void)fflush(sfo);
|
||||||
|
nhost = NULL;
|
||||||
|
while ((buf = fgetln(sfi, &len)) != NULL) {
|
||||||
|
p = buf + len - 1;
|
||||||
|
if (isspace((unsigned char)*p)) {
|
||||||
|
do
|
||||||
|
*p = '\0';
|
||||||
|
while (p > buf && isspace((unsigned char)*--p));
|
||||||
|
} else {
|
||||||
|
if ((nbuf = malloc(len + 1)) == NULL)
|
||||||
|
err(1, "malloc");
|
||||||
|
(void)memcpy(nbuf, buf, len);
|
||||||
|
nbuf[len] = '\0';
|
||||||
|
buf = nbuf;
|
||||||
|
}
|
||||||
|
(void)puts(buf);
|
||||||
|
|
||||||
|
if (nhost != NULL || !(flags & WHOIS_RECURSE))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if ((p = strstr(buf, WHOIS_SERVER_ID))) {
|
||||||
|
p += sizeof(WHOIS_SERVER_ID) - 1;
|
||||||
|
while (isblank((unsigned char)*p))
|
||||||
|
p++;
|
||||||
|
if ((len = strcspn(p, " \t\n\r"))) {
|
||||||
|
if ((nhost = malloc(len + 1)) == NULL)
|
||||||
|
err(1, "malloc");
|
||||||
|
(void)memcpy(nhost, p, len);
|
||||||
|
nhost[len] = '\0';
|
||||||
|
}
|
||||||
|
} else if (strcmp(server, ANICHOST) == 0) {
|
||||||
|
for (p = buf; *p != '\0'; p++)
|
||||||
|
*p = tolower((unsigned char)*p);
|
||||||
|
for (i = 0; ip_whois[i] != NULL; i++) {
|
||||||
|
if (strstr(buf, ip_whois[i]) != NULL) {
|
||||||
|
nhost = strdup(ip_whois[i]);
|
||||||
|
if (nhost == NULL)
|
||||||
|
err(1, "strdup");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (nbuf != NULL)
|
||||||
|
free(nbuf);
|
||||||
|
|
||||||
|
if (nhost != NULL) {
|
||||||
|
error = whois(query, nhost, port, 0);
|
||||||
|
free(nhost);
|
||||||
|
}
|
||||||
|
freeaddrinfo(res);
|
||||||
|
(void)fclose(sfi);
|
||||||
|
(void)fclose(sfo);
|
||||||
|
return (error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If no country is specified determine the top level domain from the query.
|
||||||
|
* If the TLD is a number, query ARIN, otherwise, use TLD.whois-server.net.
|
||||||
|
* If the domain does not contain '.', check to see if it is an NSI handle
|
||||||
|
* (starts with '!') or a CORE handle (COCO-[0-9]+ or COHO-[0-9]+).
|
||||||
|
* Fall back to NICHOST for the non-handle case.
|
||||||
|
*/
|
||||||
|
static const char *
|
||||||
|
choose_server(const char *name, const char *country)
|
||||||
|
{
|
||||||
|
static char *server;
|
||||||
|
char *nserver;
|
||||||
|
const char *qhead;
|
||||||
|
char *ep;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
if (country != NULL)
|
||||||
|
qhead = country;
|
||||||
|
else if ((qhead = strrchr(name, '.')) == NULL) {
|
||||||
|
if (*name == '!')
|
||||||
|
return (INICHOST);
|
||||||
|
else if ((strncasecmp(name, "COCO-", 5) == 0 ||
|
||||||
|
strncasecmp(name, "COHO-", 5) == 0) &&
|
||||||
|
strtol(name + 5, &ep, 10) > 0 && *ep == '\0')
|
||||||
|
return (CNICHOST);
|
||||||
|
else
|
||||||
|
return (NICHOST);
|
||||||
|
} else if (isdigit((unsigned char)*(++qhead)))
|
||||||
|
return (ANICHOST);
|
||||||
|
len = strlen(qhead) + sizeof(QNICHOST_TAIL);
|
||||||
|
if ((nserver = realloc(server, len)) == NULL)
|
||||||
|
err(1, "realloc");
|
||||||
|
server = nserver;
|
||||||
|
(void)strlcpy(server, qhead, len);
|
||||||
|
(void)strlcat(server, QNICHOST_TAIL, len);
|
||||||
|
return (server);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
(void)fprintf(stderr,
|
||||||
|
"usage: %s [-6AadgilmQRr] [-c country-code | -h hostname] "
|
||||||
|
"[-p port] name ...\n", getprogname());
|
||||||
|
exit(1);
|
||||||
|
}
|
Loading…
Reference in a new issue