## utils/whoisRIP/whoisRIP.c

/* [<][>][^][v][top][bottom][index][help] */

## FUNCTIONS

This source file includes following functions.

1. index
2. rindex
3. bzero
4. bcopy
5. bcopy
6. usage
7. closesocket
8. termhandler
9. occurs
10. occurs
11. main

       1 /*
       2  * RIPE version marten@ripe.net
       3  * many changes & networkupdate by david@ripe.net
       4  * cosmetics by steven@dante.org.uk --  gcc stopped complaining mostly,
       5  *                                      code is still messy, though.
       6  *
       7  * 1.15 94/09/07
       8  *
       9  * 1.2  9705/02
      10  * "-v" option added; ambrose@ripe.net
      11  * "whois.ripe.net" replaced by "bsdbase.ripe.net";  ambrose@ripe.net
      12  * "bsdbase.ripe.net" replaced by "joshua.ripe.net"; marek@ripe.net
      13  * "joshua.ripe.net" replaced by "whois.ripe.net"; roman@ripe.net 981105
      14  *
      15  * Copyright (c) 1980 Regents of the University of California.
      16  * All rights reserved.
      17  *
      18  * Redistribution and use in source and binary forms, with or without
      19  * modification, are permitted provided that the following conditions
      20  * are met:
      21  * 1. Redistributions of source code must retain the above copyright
      22  *    notice, this list of conditions and the following disclaimer.
      23  * 2. Redistributions in binary form must reproduce the above copyright
      24  *    notice, this list of conditions and the following disclaimer in the
      25  *    documentation and/or other materials provided with the distribution.
      26  * 3. All advertising materials mentioning features or use of this software
      27  *    must display the following acknowledgement:
      28  *      This product includes software developed by the University of
      29  *      California, Berkeley and its contributors.
      30  * 4. Neither the name of the University nor the names of its contributors
      31  *    may be used to endorse or promote products derived from this software
      32  *    without specific prior written permission.
      33  *
      34  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
      35  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      36  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      37  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
      38  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      39  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      40  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      41  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      42  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      43  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      44  * SUCH DAMAGE.
      45  */
      46
      47 #if defined(sun) && defined(solaris)
      48 #define SYSV
      49 #endif
      50
      51 #ifndef lint
      52 char copyright[] =
      53 "@(#)Copyright (c) 1980 Regents of the University of California.\n\
      54  All rights reserved.\n";
      55 #endif /* not lint */
      56
      57 #ifndef lint
      58 char sccsid[] =
      59     "@(#)whois.c 5.11 (Berkeley) 3/2/91 - RIPE 1.15 94/09/07 marten@ripe.net";
      60 #endif /* not lint */
      61
      62 #include <sys/types.h>
      63 #include <sys/socket.h>
      64 #include <netinet/in.h>
      65 #include <netdb.h>
      66 #include <stdio.h>
      67 #include <stdlib.h>
      68 #include <ctype.h>
      69 #include <string.h>
      70 #include <errno.h>
      71 #include <unistd.h>
      72 #include <pwd.h>
      73 #include <signal.h>
      74
      75 #ifdef __STDC__
      76 extern FILE     *fdopen(int fildes, const char *type);
      77 #endif /* __STDC__ */
      78
      79 #if defined(SYSV) || defined(__STDC__)
      80
      81 #define         index(s,c)              strchr((const char*)(s),(int)(c))
         /* [<][>][^][v][top][bottom][index][help] */
      82 #define         rindex(s,c)             strrchr((const char*)(s),(int)(c))
         /* [<][>][^][v][top][bottom][index][help] */
      83 #define         bzero(s,n)              memset((void*)s,0,(size_t)n)
         /* [<][>][^][v][top][bottom][index][help] */
      84
      85 #ifdef HASMEMMOVE
      86 # define        bcopy(s,d,n)    memmove((void*)(d),(void*)(s),(size_t)(n))
         /* [<][>][^][v][top][bottom][index][help] */
      87 #else
      88 # define        bcopy(s,d,n)    memcpy((void*)(d),(void*)(s),(size_t)(n))
         /* [<][>][^][v][top][bottom][index][help] */
      89 #endif /* HASMEMMOVE */
      90
      91 #endif /* SYSV || __STDC__ */
      92
      93 #ifdef GLIBC
      94 typedef __u_short u_short;
      95 typedef __caddr_t caddr_t;
      96 #endif /* GLIBC */
      97
      98 #include <sys/param.h>
      99 #define NICHOST "reimp.ripe.net"
     100
     101 void usage()
         /* [<][>][^][v][top][bottom][index][help] */
     102 {
     103   (void)fprintf(stderr, "\nUsage: whois [-h hostname] [-p port] keys ...");
     104   (void)fprintf(stderr, "\n\nWhere:\n\n");
     105   (void)fprintf(stderr, "-h hostname                search alternate server\n");
     106   (void)fprintf(stderr, "-p port                    port to connect to\n");
     107   (void)fprintf(stderr, "\n");
     108
     109   exit(1);
     110 }
     111
     112 int s;
     113
     114 void closesocket(s, child)
         /* [<][>][^][v][top][bottom][index][help] */
     115 int s, child;
     116 {
     117   /* printf("close connection child=%i\n", child);  */
     118
     119   close(s);
     120
     121   exit(0);
     122
     123 }
     124
     125 void termhandler(sig, code, scp, addr)
         /* [<][>][^][v][top][bottom][index][help] */
     126 int sig, code;
     127 struct sigcontext *scp;
     128 char *addr;
     129 {
     130   closesocket(s,1);
     131 }
     132
     133
     134 /* #ifdef RIPE */
     135 #if defined(__STDC__) || defined(SYSV)
     136 #define occurs(str,pat)         ((int) strstr((str),(pat)))
         /* [<][>][^][v][top][bottom][index][help] */
     137 #else /* !__STDC__ && !SYSV */
     138 int occurs(str, pat)
         /* [<][>][^][v][top][bottom][index][help] */
     139      char *str, *pat;
     140 {
     141   register char *point = str;
     142
     143   while ((point=index(point, *pat)))
     144     {
     145       if (strncmp(point, pat, strlen(pat)) == 0)
     146         return(1);
     147       point++;
     148     }
     149   return(0);
     150 }
     151 #endif
     152 /* #endif */
     153
     154 int main(argc, argv)
         /* [<][>][^][v][top][bottom][index][help] */
     155      int argc;
     156      char **argv;
     157 {
     158   FILE *sfi;
     159   FILE *sfo;
     160   int ch;
     161   struct sockaddr_in sin;
     162   struct hostent *hp;
     163   struct servent *sp;
     164   char *host, *whoishost, *realhost;
     165   int optport=0, port=0;
     166   int verb=0, opthost=0;
     167   int optcount;
     168   char query[1024]="";
     169   char *string;
     170
     171
     172   host = NICHOST;
     173
     174   if (argc<=1)
     175     usage();
     176
     177   for (optcount=1; optcount<argc; optcount++) {
     178     if( argv[optcount][0] == '-' ) {
     179       switch (argv[optcount][1]) {
     180       case 'h':
     181         opthost = 1;
     182         if ((!argv[optcount+1]) || (argv[optcount+1][0] == '-'))
     183           usage();
     184         host = argv[optcount+1];
     185
     186         argv[optcount+1] = argv[optcount]; /* set both to point to the same address */
     187         *argv[optcount] = 0;        /* and set to "" */
     188         optcount++;
     189         continue;
     190       case 'p':
     191         if ((!argv[optcount+1]) || (argv[optcount+1][0] == '-'))
     192           usage();
     193         port = htons((u_short)atoi(argv[optcount+1]));
     194         optport = 1;
     195         *argv[optcount] = *argv[optcount+1]=0;
     196         optcount++;
     197         continue;
     198       }
     199     }
     200     strcat(query, argv[optcount]);
     201     strcat(query, " ");
     202   }
     203
     204
     205     if (verb) fprintf(stderr, "Trying: %s\n\n", host);
     206     hp = gethostbyname(host);
     207
     208     if (hp == NULL) {
     209       fprintf(stderr,"whois: %s\n", host);
     210       if (verb) fprintf(stderr, "Now I give up ...\n");
     211       perror("Unknown host");
     212       exit(1);
     213
     214     }
     215
     216
     217   realhost = hp->h_name;
     218
     219   s = socket(hp->h_addrtype, SOCK_STREAM, 0);
     220   if (s < 0) {
     221     perror("whois: socket");
     222     exit(1);
     223   }
     224   bzero((caddr_t)&sin, sizeof (sin));
     225   sin.sin_family = hp->h_addrtype;
     226   if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
     227     perror("whois: bind");
     228     exit(1);
     229   }
     230   bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length);
     231
     232   if (optport) {
     233      sin.sin_port=port;
     234   }
     235   else {
     236
     237      sp=getservbyname("whois", "tcp");
     238
     239      if (sp == NULL) {
     240         (void)fprintf(stderr, "whois: whois/tcp: unknown service\n");
     241         exit(1);
     242      }
     243
     244      sin.sin_port = sp->s_port;
     245
     246   }
     247
     248   /* printf("%i\n", sin.sin_port); */
     249
     250   if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
     251     perror("whois: connect");
     252     exit(1);
     253   }
     254
     255   sfi = fdopen(s, "r");
     256   sfo = fdopen(s, "w");
     257   if (sfi == NULL || sfo == NULL) {
     258     perror("whois: fdopen");
     259     (void)close(s);
     260     exit(1);
     261   }
     262
     263   signal(SIGTERM, termhandler);
     264
     265   /* we can only send the -V when we are sure that we are dealing with
     266      a RIPE whois server :-( */
     267
     268   /* Not a very nice piece of code. The server types change...
     269      There should be a string of (assumed) RIPE servers in the
     270      Makefile, and the string should be processed here. */
     271
     272   whoishost=(char *)calloc(strlen(realhost)+1, sizeof(char));
     273   strcpy(whoishost, realhost);
     274   for (string=whoishost;(*string=(char)tolower(*string));string++);
     275
     276   if (strstr(whoishost, "ripe.net") ||
     277       strstr(whoishost, "ra.net") ||
     278       strstr(whoishost, "apnic.net") ||
     279       strstr(whoishost, "mci.net") ||
     280       strstr(whoishost, "isi.edu") ||
     281       strstr(whoishost, "garr.it") ||
     282       strstr(whoishost, "ans.net") )
     283     (void)fprintf(sfo, "-VwC2.0 ");
     284
     285   (void)fprintf(sfo, "%s", query);
     286   /*if (*argv) (void)fputs(*argv, sfo);*/
     287   (void)fputs("\r\n", sfo);
     288   (void)fflush(sfo);
     289
     290   while ((ch = getc(sfi)) != EOF)
     291     putchar(ch);
     292
     293   closesocket(s, 1);
     294
     295   exit(0);
     296
     297 }
     298

/* [<][>][^][v][top][bottom][index][help] */