|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted provided
6: * that: (1) source distributions retain this entire copyright notice and
7: * comment, and (2) distributions including binaries display the following
8: * acknowledgement: ``This product includes software developed by the
9: * University of California, Berkeley and its contributors'' in the
10: * documentation or other materials provided with the distribution and in
11: * all advertising materials mentioning features or use of this software.
12: * Neither the name of the University nor the names of its contributors may
13: * be used to endorse or promote products derived from this software without
14: * specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
16: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
17: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: char copyright[] =
22: "@(#) Copyright (c) 1980 Regents of the University of California.\n\
23: All rights reserved.\n";
24: #endif /* not lint */
25:
26: #ifndef lint
27: static char sccsid[] = "@(#)whois.c 5.9 (Berkeley) 6/1/90";
28: #endif /* not lint */
29:
30: #include <sys/types.h>
31: #include <sys/socket.h>
32: #include <netinet/in.h>
33: #include <netdb.h>
34: #include <stdio.h>
35:
36: #define NICHOST "nic.ddn.mil"
37:
38: main(argc, argv)
39: int argc;
40: char **argv;
41: {
42: extern char *optarg;
43: extern int optind;
44: register FILE *sfi, *sfo;
45: register int ch;
46: struct sockaddr_in sin;
47: struct hostent *hp;
48: struct servent *sp;
49: int s;
50: char *host;
51:
52: host = NICHOST;
53: while ((ch = getopt(argc, argv, "h:")) != EOF)
54: switch((char)ch) {
55: case 'h':
56: host = optarg;
57: break;
58: case '?':
59: default:
60: usage();
61: }
62: argc -= optind;
63: argv += optind;
64:
65: if (argc != 1)
66: usage();
67:
68: hp = gethostbyname(host);
69: if (hp == NULL) {
70: (void)fprintf(stderr, "whois: %s: ", host);
71: herror((char *)NULL);
72: exit(1);
73: }
74: host = hp->h_name;
75: s = socket(hp->h_addrtype, SOCK_STREAM, 0);
76: if (s < 0) {
77: perror("whois: socket");
78: exit(2);
79: }
80: bzero((caddr_t)&sin, sizeof (sin));
81: sin.sin_family = hp->h_addrtype;
82: if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
83: perror("whois: bind");
84: exit(3);
85: }
86: bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length);
87: sp = getservbyname("whois", "tcp");
88: if (sp == NULL) {
89: (void)fprintf(stderr, "whois: whois/tcp: unknown service\n");
90: exit(4);
91: }
92: sin.sin_port = sp->s_port;
93: if (connect(s, &sin, sizeof(sin)) < 0) {
94: perror("whois: connect");
95: exit(5);
96: }
97: sfi = fdopen(s, "r");
98: sfo = fdopen(s, "w");
99: if (sfi == NULL || sfo == NULL) {
100: perror("whois: fdopen");
101: (void)close(s);
102: exit(1);
103: }
104: (void)fprintf(sfo, "%s\r\n", *argv);
105: (void)fflush(sfo);
106: while ((ch = getc(sfi)) != EOF)
107: putchar(ch);
108: exit(0);
109: }
110:
111: static
112: usage()
113: {
114: (void)fprintf(stderr, "usage: whois [-h host] name\n");
115: exit(1);
116: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.