version 1.3, 1997/01/15 23:43:39 |
version 1.4, 1998/02/24 10:09:50 |
|
|
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
|
#include <sysexits.h> |
#include <unistd.h> |
#include <unistd.h> |
|
|
#define NICHOST "whois.internic.net" |
#define NICHOST "whois.internic.net" |
|
#define DNICHOST "nic.ddn.mil" |
|
#define ANICHOST "whois.arin.net" |
|
#define RNICHOST "whois.ripe.net" |
|
#define PNICHOST "whois.apnic.net" |
|
#define WHOIS_PORT 43 |
|
|
static void usage(); |
static void usage(); |
|
|
|
|
char *host; |
char *host; |
|
|
host = NICHOST; |
host = NICHOST; |
while ((ch = getopt(argc, argv, "h:")) != -1) |
while ((ch = getopt(argc, argv, "adh:pr")) != -1) |
switch((char)ch) { |
switch((char)ch) { |
|
case 'a': |
|
host = ANICHOST; |
|
break; |
|
case 'd': |
|
host = DNICHOST; |
|
break; |
case 'h': |
case 'h': |
host = optarg; |
host = optarg; |
break; |
break; |
|
case 'p': |
|
host = PNICHOST; |
|
break; |
|
case 'r': |
|
host = RNICHOST; |
|
break; |
case '?': |
case '?': |
default: |
default: |
usage(); |
usage(); |
|
|
if (!argc) |
if (!argc) |
usage(); |
usage(); |
|
|
hp = gethostbyname(host); |
s = socket(PF_INET, SOCK_STREAM, 0); |
if (hp == NULL) { |
if (s < 0) |
(void)fprintf(stderr, "whois: %s: ", host); |
err(EX_OSERR, "socket"); |
herror((char *)NULL); |
|
exit(1); |
memset(&sin, 0, sizeof sin); |
|
sin.sin_len = sizeof sin; |
|
sin.sin_family = AF_INET; |
|
|
|
if (inet_aton(host, &sin.sin_addr) == 0) { |
|
hp = gethostbyname2(host, AF_INET); |
|
if (hp == NULL) |
|
errx(EX_NOHOST, "%s: %s", host, hstrerror(h_errno)); |
|
host = hp->h_name; |
|
sin.sin_addr = *(struct in_addr *)hp->h_addr_list[0]; |
} |
} |
host = hp->h_name; |
|
s = socket(hp->h_addrtype, SOCK_STREAM, 0); |
|
if (s < 0) { |
|
perror("whois: socket"); |
|
exit(1); |
|
} |
|
bzero((caddr_t)&sin, sizeof (sin)); |
|
sin.sin_family = hp->h_addrtype; |
|
if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { |
|
perror("whois: bind"); |
|
exit(1); |
|
} |
|
bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length); |
|
sp = getservbyname("whois", "tcp"); |
sp = getservbyname("whois", "tcp"); |
if (sp == NULL) { |
if (sp == NULL) |
(void)fprintf(stderr, "whois: whois/tcp: unknown service\n"); |
sin.sin_port = htons(WHOIS_PORT); |
exit(1); |
else |
} |
sin.sin_port = sp->s_port; |
sin.sin_port = sp->s_port; |
|
if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { |
if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) |
perror("whois: connect"); |
err(EX_OSERR, "connect"); |
exit(1); |
|
} |
|
sfi = fdopen(s, "r"); |
sfi = fdopen(s, "r"); |
sfo = fdopen(s, "w"); |
sfo = fdopen(s, "w"); |
if (sfi == NULL || sfo == NULL) { |
if (sfi == NULL || sfo == NULL) |
perror("whois: fdopen"); |
err(EX_OSERR, "fdopen"); |
(void)close(s); |
|
exit(1); |
|
} |
|
while (argc-- > 1) |
while (argc-- > 1) |
(void)fprintf(sfo, "%s ", *argv++); |
(void)fprintf(sfo, "%s ", *argv++); |
(void)fprintf(sfo, "%s\r\n", *argv); |
(void)fprintf(sfo, "%s\r\n", *argv); |
|
|
static void |
static void |
usage() |
usage() |
{ |
{ |
(void)fprintf(stderr, "usage: whois [-h hostname] name ...\n"); |
(void)fprintf(stderr, "usage: whois [-adpr] [-h hostname] name ...\n"); |
exit(1); |
exit(EX_USAGE); |
} |
} |