This is whois.c in view mode; [Download] [Up]
/* Replacement for "whois" client */ /* Eric P. Scott, San Francisco State University, April 1993 */ static char sccsid[]="@(#)whois.c 1.0 (SFSU) 4/9/93"; #include <stdio.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/uio.h> #ifndef WHOIS_DEFAULT #define WHOIS_DEFAULT "rs.internic.net" #endif char defhost[64]=WHOIS_DEFAULT; int verbose; main(argc, argv) int argc; char *argv[]; { extern char *getenv(); extern int optind; extern char *optarg; void try(); unsigned short portfrom(); register struct hostent *h; register int i; struct sockaddr_in sin; char *host, *port; int iovcnt; struct iovec iov[16]; if (!(host=getenv("WHOIS_SERVER"))) host=defhost; port=(char *)NULL; while ((i=getopt(argc, argv, "h:p:v"))!=EOF) switch (i) { case 'h': host=optarg; break; case 'p': port=optarg; break; case 'v': verbose++; break; default: goto usage; } if (argc-optind<1) { usage: if (verbose) (void)fprintf(stderr, "Usage: %s [ -h host ] [ -p port ] [ -v ] name\n\ \tdefault host is %s\n\ \t(can be overridden with WHOIS_SERVER environment variable)\n", *argv, defhost); else (void)fprintf(stderr, "Usage: %s [ -h host ] name\n", *argv); exit(1); } /* allow "name" to consist of multiple "words" */ iovcnt=0; i=optind; iov[iovcnt].iov_base=argv[i]; iov[iovcnt++].iov_len=strlen(argv[i]); while (++i<argc) { if (iovcnt>=sizeof iov/sizeof iov[0]) goto usage; iov[iovcnt].iov_base=" "; iov[iovcnt++].iov_len=1; if (iovcnt>=sizeof iov/sizeof iov[0]) goto usage; iov[iovcnt].iov_base=argv[i]; iov[iovcnt++].iov_len=strlen(argv[i]); } if (iovcnt>=sizeof iov/sizeof iov[0]) goto usage; iov[iovcnt].iov_base="\r\n"; iov[iovcnt++].iov_len=2; /* * Users rarely need to know numeric IP addresses or port numbers, * but it's still a good idea to support them */ bzero((char *)&sin, sizeof sin); sin.sin_addr.s_addr=inet_addr(host); /* try x.x.x.x format */ if (sin.sin_addr.s_addr!=0xffffffff) { sin.sin_family=AF_INET; sin.sin_port=htons(port ? portfrom(port) : IPPORT_WHOIS); try(&sin, iov, iovcnt); } else { if (!(h=gethostbyname(host))) { /* name lookup */ herror(host); exit(1); } sin.sin_family=h->h_addrtype; sin.sin_port=htons(port ? portfrom(port) : IPPORT_WHOIS); i=0; do { /* some hosts have multiple IP addresses */ bcopy(h->h_addr_list[i], (char *)&sin.sin_addr, h->h_length); try(&sin, iov, iovcnt); } while (h->h_addr_list[++i]); } exit(1); } /* convert string to TCP port number, return in host order */ unsigned short portfrom(n) char *n; { register struct servent *se; int port, pos; pos=0; if (sscanf(n, "%d%n", &port, &pos)==1&&pos==0&&(unsigned)port<=65535) return(port); if (!(se=getservbyname(n, "tcp"))) { (void)fprintf(stderr, "%s/tcp: unknown service\n", n); exit(1); } return(ntohl(se->s_port)); } /* try to establish session with given host; return on failure */ void try(sin, iov, iovcnt) struct sockaddr_in *sin; struct iovec *iov; int iovcnt; { int s, i; FILE *f; if (verbose) { (void)fprintf(stderr, "Trying [%s]... ", inet_ntoa(sin->sin_addr)); (void)fflush(stderr); } if ((s=socket(PF_INET, SOCK_STREAM, 0))<0) { perror("socket"); exit(1); } if (connect(s, (struct sockaddr *)sin, sizeof(*sin))<0) { perror(""); (void)close(s); return; } if (verbose) { (void)fputs("OK\n", stderr); (void)fflush(stderr); } /* send one-line message to server */ if (writev(s, iov, iovcnt)<0) { perror("writev"); (void)close(s); return; } /* read from socket, output anything we receive */ /* convert NVT end-of-line convention to UNIX newline */ f=fdopen(s, "r"); while ((s=getc(f))!=EOF) { if (s=='\r') { if ((s=getc(f))!='\n') putchar('\r'); if (s==EOF) break; if (s=='\0') continue; } putchar(s); } (void)fclose(f); exit(0); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.