1 | /*************************************** 2 | $Revision: 1.7 $ 3 | 4 | Whois query (wh) - connects to a whois server and returns result 5 | 6 | Status: NOT REVIEWED, TESTED 7 | 8 | Design and implementation by: Marek Bukowy 9 | 10 | Note: still not final. Probably SK calls should be moved to the 11 | calling routine 12 | 13 | ******************/ /****************** 14 | Copyright (c) 1999 RIPE NCC 15 | 16 | All Rights Reserved 17 | 18 | Permission to use, copy, modify, and distribute this software and its 19 | documentation for any purpose and without fee is hereby granted, 20 | provided that the above copyright notice appear in all copies and that 21 | both that copyright notice and this permission notice appear in 22 | supporting documentation, and that the name of the author not be 23 | used in advertising or publicity pertaining to distribution of the 24 | software without specific, written prior permission. 25 | 26 | THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 27 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL 28 | AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY 29 | DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 30 | AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 31 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 32 | ***************************************/ 33 | 34 | #include <sys/types.h> 35 | #include <sys/socket.h> 36 | #include <netinet/in.h> 37 | #include <netdb.h> 38 | #include <stdio.h> 39 | 40 | #include <erroutines.h> 41 | #include "socket.h" 42 | 43 | /*+ opens a connection to hostname and queries it, 44 | sets sock to the socket number it got for this connection. 45 | 46 | All reading and possibly other queries must be performed by 47 | the caller. 48 | +*/ 49 | er_ret_t 50 | WH_connect(int *sock, char *hostname, int port) 51 | { 52 | 53 | struct sockaddr_in sin; 54 | struct hostent *hp; 55 | int s; 56 | 57 | #if 0 58 | char log_str[256]; 59 | sprintf(log_str, "would perform query >%s< to %s:%d \n" 60 | "limits: line %d tmout %d and print on socket %d\n", 61 | query,hostname,port, maxlines,timeout,sock ); 62 | log_inst_print(log_str); 63 | #endif 64 | 65 | if ( (hp = gethostbyname(hostname)) == NULL) { 66 | return WH_BADHOST; 67 | } 68 | 69 | s = socket(AF_INET, SOCK_STREAM, 0); 70 | if (s < 0) { 71 | return WH_SOCKET; 72 | } 73 | 74 | bzero((caddr_t)&sin, sizeof (sin)); 75 | sin.sin_family = hp->h_addrtype; 76 | if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { 77 | close(s); 78 | return WH_BIND; 79 | } 80 | bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length); 81 | sin.sin_port=htons(port); 82 | 83 | if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { 84 | close(s); 85 | return WH_CONNECT; 86 | } 87 | 88 | /* SK_puts(sock, "% Connection established...\n"); */ 89 | 90 | *sock = s; 91 | 92 | return WH_OK; 93 | } 94 | 95 | 96 | 97 | /*+ opens a whois connection to hostname, queries it and 98 | prints result on sock +*/ 99 | er_ret_t 100 | WH_sock(int sock, char *hostname, int port, 101 | char *query, int maxlines, int timeout) 102 | { 103 | int s; 104 | int ch; 105 | er_ret_t err; 106 | 107 | if( (err = WH_connect(&s, hostname, port)) != WH_OK ) { 108 | return err; 109 | } 110 | else { 111 | #if 1 112 | { 113 | FILE *sfi; 114 | FILE *sfo; 115 | 116 | sfi = fdopen(s, "r"); 117 | sfo = fdopen(s, "w"); 118 | if (sfi == NULL || sfo == NULL) { 119 | (void)close(s); 120 | return WH_OPEN; 121 | } 122 | 123 | fprintf(sfo, "%s\r\n", query); 124 | fflush(sfo); 125 | 126 | while ((ch = getc(sfi)) != EOF) { 127 | SK_putc(sock,ch); 128 | } 129 | 130 | fclose(sfo); 131 | fclose(sfi); 132 | } 133 | #else 134 | SK_puts(s, query); 135 | SK_puts(s, "\r\n"); 136 | 137 | while( (ch = SK_getc(s)) != EOF ) { 138 | SK_putc(sock,ch); 139 | } 140 | #endif 141 | close(s); 142 | 143 | 144 | 145 | return WH_OK; 146 | } /* if OK */ 147 | } 148 |