1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */ 27 /* All Rights Reserved */ 28 29 /* 30 * University Copyright- Copyright (c) 1982, 1986, 1988 31 * The Regents of the University of California 32 * All Rights Reserved 33 * 34 * University Acknowledgment- Portions of this document are derived from 35 * software developed by the University of California, Berkeley, and its 36 * contributors. 37 */ 38 39 #include <sys/types.h> 40 #include <sys/socket.h> 41 42 #include <netinet/in.h> 43 44 #include <stdio.h> 45 #include <netdb.h> 46 #include <string.h> 47 #include <stdlib.h> 48 #include <unistd.h> 49 50 #define NICHOST "whois.internic.net" 51 52 int 53 main(int argc, char *argv[]) 54 { 55 int s, rv; 56 register FILE *sfi, *sfo; 57 register int c; 58 char *host = NICHOST; 59 struct addrinfo *ai_head, *ai; 60 struct addrinfo hints; 61 62 argc--, argv++; 63 if (argc > 2 && strcmp(*argv, "-h") == 0) { 64 argv++, argc--; 65 host = *argv++; 66 argc--; 67 } 68 if (argc != 1) { 69 (void) fprintf(stderr, "usage: whois [ -h host ] name\n"); 70 exit(1); 71 } 72 73 memset(&hints, 0, sizeof (hints)); 74 hints.ai_socktype = SOCK_STREAM; 75 hints.ai_protocol = IPPROTO_TCP; 76 hints.ai_flags = AI_ADDRCONFIG; 77 rv = getaddrinfo(host, "whois", &hints, &ai_head); 78 if (rv != 0) { 79 (void) fprintf(stderr, "whois: %s: %s\n", host, 80 gai_strerror(rv)); 81 exit(1); 82 } 83 84 for (ai = ai_head; ai != NULL; ai = ai->ai_next) { 85 s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); 86 if (s >= 0) { 87 rv = connect(s, ai->ai_addr, ai->ai_addrlen); 88 if (rv < 0) 89 (void) close(s); 90 else 91 break; 92 } 93 } 94 if (ai_head != NULL) 95 freeaddrinfo(ai_head); 96 97 if (s < 0) { 98 perror("whois: socket"); 99 exit(2); 100 } else if (rv < 0) { 101 perror("whois: connect"); 102 exit(5); 103 } 104 105 sfi = fdopen(s, "r"); 106 sfo = fdopen(s, "w"); 107 if (sfi == NULL || sfo == NULL) { 108 perror("fdopen"); 109 (void) close(s); 110 exit(1); 111 } 112 (void) fprintf(sfo, "%s\r\n", *argv); 113 (void) fflush(sfo); 114 while ((c = getc(sfi)) != EOF) 115 (void) putchar(c); 116 return (0); 117 } 118