1 | /*************************************** 2 | $Revision: 1.12 $ 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 "sk.h" 42 | 43 | 44 | 45 | /*+ as above - but with connection structures, timeouts, maxlines, etc. 46 | +*/ 47 | er_ret_t 48 | WH_cd_sock(sk_conn_st *out_cd, char *hostname, unsigned port, 49 | char *query, unsigned maxlines, unsigned timeout) 50 | { 51 | int s; 52 | int lines = 0; 53 | er_ret_t err; 54 | 55 | if( (err = SK_connect(&s, hostname, port, timeout)) == SK_OK ) 56 | { 57 | #define MAX_LINE_SIZE 1024 58 | 59 | char reply[MAX_LINE_SIZE]; 60 | sk_conn_st peer_cd; 61 | 62 | SK_cd_make( &peer_cd, s, timeout ); 63 | 64 | SK_cd_puts( &peer_cd, query); 65 | SK_cd_puts( &peer_cd, "\r\n"); 66 | 67 | do { 68 | SK_cd_gets(&peer_cd, reply, MAX_LINE_SIZE); 69 | SK_cd_puts(out_cd, reply); 70 | } 71 | while( ++lines <= maxlines && peer_cd.rtc == 0 ); 72 | 73 | 74 | switch(peer_cd.rtc) { 75 | case 0: 76 | case SK_DISCONNECT: 77 | /* OK */ 78 | break; 79 | case SK_TIMEOUT: 80 | err = SK_TIMEOUT; 81 | break; 82 | default: 83 | die; /* it should not happen - change here when allowing this */ 84 | } 85 | 86 | if( lines >= maxlines ) { 87 | err = WH_MAXLINES; 88 | } 89 | 90 | 91 | SK_cd_close(&peer_cd); 92 | SK_cd_free (&peer_cd); 93 | } /* if OK */ 94 | 95 | return err; 96 | } 97 |