1    | /***************************************
2    |   $Revision: 1.10 $
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   | /*+ 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   |   {
66   |     int error;
67   |     struct hostent result;
68   |     char aliasbuf[8192]; /* Stevens, UNIX net. prog., p.304 */
69   | 
70   | #ifdef _LINUX
71   |     if(gethostbyname_r(hostname,  &result, aliasbuf, 
72   |                        sizeof(aliasbuf), &hp, &error)<0) {
73   | #else /* default is Solaris implementation */                             
74   |     if( (hp=gethostbyname_r(hostname,  &result, aliasbuf, 
75   |                        sizeof(aliasbuf), &error)) == NULL) {
76   | #endif      
77   |       return WH_BADHOST;
78   |     }
79   |   }
80   | 
81   |   s = socket(AF_INET, SOCK_STREAM, 0);
82   |   if (s < 0) {
83   |     return WH_SOCKET;
84   |   }
85   |   
86   |   bzero((caddr_t)&sin, sizeof (sin));
87   |   sin.sin_family = hp->h_addrtype;
88   |   if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
89   |     close(s);
90   |     return WH_BIND;
91   |   }
92   |   bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length);
93   |   sin.sin_port=htons(port);
94   | 
95   |   if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
96   |     close(s);
97   |     return WH_CONNECT;
98   |   }
99   | 
100  |   /*  SK_puts(sock, "% Connection established...\n"); */
101  | 
102  |   *sock = s;
103  | 
104  |   return WH_OK;
105  | }
106  | 
107  | 
108  | 
109  | /*+ opens a whois connection to hostname, queries it and
110  |   prints result on sock +*/
111  | er_ret_t
112  | WH_sock(int sock, char *hostname, int port, 
113  | 	char *query, int maxlines, int timeout)
114  | {
115  |   int s; 
116  |   int ch;
117  |   er_ret_t err;
118  |   
119  |  if( (err = WH_connect(&s, hostname, port)) != WH_OK ) {
120  |    return err;
121  |  } 
122  |  else {
123  | #if 1
124  |   {
125  |     FILE *sfi;
126  |     FILE *sfo;
127  |     
128  |     sfi = fdopen(s, "r");
129  |     sfo = fdopen(s, "w");
130  |     if (sfi == NULL || sfo == NULL) {
131  |       (void)close(s);
132  |       return WH_OPEN;
133  |     }
134  |     
135  |     fprintf(sfo, "%s\r\n", query);
136  |     fflush(sfo);
137  |     
138  |     while ((ch = getc(sfi)) != EOF) {
139  |       SK_putc(sock,ch);
140  |     }
141  |     
142  |     fclose(sfo);
143  |     fclose(sfi);
144  |   }
145  | #else
146  |   SK_puts(s, query);
147  |   SK_puts(s, "\r\n");
148  |   
149  |   while( (ch = SK_getc(s)) != EOF ) {
150  |     SK_putc(sock,ch);
151  |   }
152  | #endif
153  |   close(s);
154  |   
155  |   
156  |   
157  |   return WH_OK;
158  |  } /* if OK */
159  | }
160  |