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 |