Source File modules/wh/wh_queries.c

    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  |