home *** CD-ROM | disk | FTP | other *** search
/ Super Net 1 / SUPERNET_1.iso / PC / OTROS / UNIX / ARCHIE / CLIENTS / PERL_ARC / RESOLVER.PL < prev    next >
Encoding:
Perl Script  |  1991-08-28  |  4.3 KB  |  171 lines

  1. #!/usr2/new/bin/perl                                  #-*-perl-*-
  2. # a subroutine to resolve a Internet host name to IP address
  3. # Copyright (C) Khun Yee Fung (clipper@csd.uwo.ca) 1991
  4. # You can do anything to this file except to sell it and/or pretend
  5. # you wrote it. You must preserve the copyright notice.
  6. package resolver;
  7.  
  8. sub main'resolver {
  9.   local($sockaddr) = 'S n a4 x8';
  10.   local($hostname, $server) = @_;
  11.   local($port) = 53;
  12.  
  13.   if ($server =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/) {
  14.       $saddr = pack('CCCC', $1, $2, $3, $4);
  15.   }
  16.   elsif (!(($name, $aliases, $type, $len, $saddr) = gethostbyname($server))) {
  17.       return 0;
  18.   }
  19.   local($sin) = pack($sockaddr, 2, $port, $saddr);
  20.  
  21.   socket(NSERVER, 2, 1, 0) || return 0;
  22.   connect(NSERVER, $sin) || return 0;
  23.  
  24.   select(NSERVER); $| = 1; select(STDOUT); $| = 1;
  25.  
  26.   local($len) = 18 + length($hostname);
  27.   local(@names) = split('\.', $hostname);
  28.   local($head) = pack('S6', 319, 256, 1, 0, 0, 0);
  29.   print NSERVER pack('S', $len), $head;
  30.   local($arg, $response);
  31.   foreach $arg (@names) {
  32.     print NSERVER pack('C', length($arg)), $arg;
  33.   }
  34.   print NSERVER pack('CS2', 0, 1, 1);
  35.  
  36.   read(NSERVER, $len, 2);
  37.   read(NSERVER, $response, unpack('S', $len));
  38.   close NSERVER;
  39.  
  40.   local(@shead) = unpack('S6', $response);
  41.   ($shead[1] & 0x0F) == 0 || return 0;
  42.  
  43.   local($in) = 12;
  44.   local($ans) = $shead[2];
  45.   local($c);
  46.   while ($ans > 0) {
  47.     while (($c = ord(substr($response, $in++, 1))) != 0) {
  48.       $in += $c;
  49.     }
  50.     $in += 4;
  51.     $ans--;
  52.   }
  53.  
  54.   $ans = $shead[3];
  55.   local($type, $rdlength, $rdata);
  56.   local(@return);
  57.   while ($ans > 0) {
  58.     while (($c = ord(substr($response, $in++, 1))) != 0) {
  59.       ($c & 0xc0) != 0xc0 || $in++, last;
  60.       $in += $c;
  61.     }
  62.     $type = substr($response, $in, 2);
  63.     $in += 8;
  64.     $rdlength = unpack('n', substr($response, $in, 2));
  65.     $in += 2;
  66.     $rdata = substr($response, $in, $rdlength);
  67.     if (unpack('S', $type) == 1) {
  68.     push(@return, $rdata);
  69.     }
  70.     $in += $rdlength;
  71.     $ans--;
  72.   }
  73.   return @return;
  74. }
  75.  
  76. sub main'rresolver {
  77.   local($sockaddr) = 'S n a4 x8';
  78.   local($hostname, $server) = @_;
  79.   local($port) = 53;
  80.  
  81.   if ($server =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/) {
  82.       $saddr = pack('CCCC', $1, $2, $3, $4);
  83.   }
  84.   elsif (!(($name, $aliases, $type, $len, $saddr) = gethostbyname($server))) {
  85.       return 0;
  86.   }
  87.   local($sin) = pack($sockaddr, 2, $port, $saddr);
  88.  
  89.   socket(NSERVER, 2, 1, 0) || return 0;
  90.   connect(NSERVER, $sin) || return 0;
  91.  
  92.   select(NSERVER); $| = 1; select(STDOUT); $| = 1;
  93.  
  94.   local($len) = 18 + length($hostname);
  95.   local(@names) = split('\.', $hostname);
  96.   local($head) = pack('S6', 319, 256, 1, 0, 0, 0);
  97.   print NSERVER pack('S', $len), $head;
  98.   @names = reverse(@names);
  99.   push(@names, "in-addr", "arpa");
  100.   foreach $arg (@names) {
  101.     print NSERVER pack('C', length($arg)), $arg;
  102.   }
  103.   print NSERVER pack('CS2', 0, 12, 1);
  104.  
  105.   read(NSERVER, $len, 2);
  106.   read(NSERVER, $response, unpack('S', $len));
  107.   close NSERVER;
  108.  
  109.   @shead = unpack('S6', $response);
  110.   ($shead[1] & 0x0F) == 0 || return 0;
  111.  
  112.   $in = 12;
  113.   $ans = $shead[2];
  114.   while ($ans > 0) {
  115.     while (($c = ord(substr($response, $in++, 1))) != 0) {
  116.       $in += $c;
  117.     }
  118.     $in += 4;
  119.     $ans--;
  120.   }
  121.  
  122.   $ans = $shead[3];
  123.   local($type, $rdlength, $rdata);
  124.   local(@return);
  125.   while ($ans > 0) {
  126.     while (($c = ord(substr($response, $in++, 1))) != 0) {
  127.       ($c & 0xc0) != 0xc0 || $in++, last;
  128.       $in += $c;
  129.     }
  130.     $type = substr($response, $in, 2);
  131.     $in += 8;
  132.     $rdlength = unpack('n', substr($response, $in, 2));
  133.     $in += 2;
  134.     $rdata = substr($response, $in, $rdlength);
  135.     if (unpack('S', $type) == 12) {
  136.     return(&label());
  137.     }
  138.     $in += $rdlength;
  139.     $ans--;
  140.   }
  141.   return 0;
  142. }
  143.  
  144. sub label {
  145.   $qname = "";
  146.   $c = substr($response, $in, 1); $in++;
  147.   $offset = $in;
  148.   $forward = 1;
  149.   loop: while ($c ne "\000") {
  150.     $cc = ord($c);
  151.     if (($cc & 0xc0) == 0xc0) {
  152.       if ($forward) {
  153.         $forward = 0;
  154.         $in = $offset + 1;
  155.       }
  156.       $offset = ($cc - 192) * 256 + ord(substr($response, $offset, 1));
  157.     }
  158.     else {
  159.       $qname = $qname . substr($response, $offset, $cc) . "."; $offset += $cc;
  160.     }
  161.     $c = substr($response, $offset, 1); $offset++;
  162.   }
  163.   if ($forward) {
  164.     $in = $offset;
  165.   }
  166.   chop($qname);
  167.   print "$qname\n";
  168. }
  169.  
  170. 1;
  171.