home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2004 December / PCpro_2004_12.ISO / files / webserver / xampp / xampp-perl-addon-1.4.9-installer.exe / NSAP.pm < prev    next >
Encoding:
Perl POD Document  |  2004-01-09  |  5.6 KB  |  274 lines

  1. package Net::DNS::RR::NSAP;
  2. #
  3. # $Id: NSAP.pm,v 2.101 2004/01/04 04:31:10 ctriv Exp $
  4. #
  5. use strict;
  6. use vars qw(@ISA $VERSION);
  7.  
  8. use Net::DNS;
  9.  
  10. @ISA     = qw(Net::DNS::RR);
  11. $VERSION = (qw$Revision: 2.101 $)[1];
  12.  
  13. sub new {
  14.     my ($class, $self, $data, $offset) = @_;
  15.  
  16.     if ($self->{"rdlength"} > 0) {
  17.         my $afi = unpack("\@$offset C", $$data);
  18.         $self->{"afi"} = sprintf("%02x", $afi);
  19.         ++$offset;
  20.  
  21.         if ($self->{"afi"} eq "47") {
  22.             my @idi = unpack("\@$offset C2", $$data);
  23.             $offset += 2;
  24.  
  25.             my $dfi = unpack("\@$offset C", $$data);
  26.             $offset += 1;
  27.  
  28.             my @aa = unpack("\@$offset C3", $$data);
  29.             $offset += 3;
  30.  
  31.             my @rsvd = unpack("\@$offset C2", $$data);
  32.             $offset += 2;
  33.  
  34.             my @rd = unpack("\@$offset C2", $$data);
  35.             $offset += 2;
  36.  
  37.             my @area = unpack("\@$offset C2", $$data);
  38.             $offset += 2;
  39.  
  40.             my @id = unpack("\@$offset C6", $$data);
  41.             $offset += 6;
  42.  
  43.             my $sel = unpack("\@$offset C", $$data);
  44.             $offset += 1;
  45.  
  46.             $self->{"idi"}  = sprintf("%02x" x 2, @idi);
  47.             $self->{"dfi"}  = sprintf("%02x" x 1, $dfi);
  48.             $self->{"aa"}   = sprintf("%02x" x 3, @aa);
  49.             $self->{"rsvd"} = sprintf("%02x" x 2, @rsvd);
  50.             $self->{"rd"}   = sprintf("%02x" x 2, @rd);
  51.             $self->{"area"} = sprintf("%02x" x 2, @area);
  52.             $self->{"id"}   = sprintf("%02x" x 6, @id);
  53.             $self->{"sel"}  = sprintf("%02x" x 1, $sel);
  54.  
  55.         } else {
  56.             # What to do for unsupported versions?
  57.         }
  58.     }
  59.  
  60.     return bless $self, $class;
  61. }
  62.  
  63. sub new_from_string {
  64.     my ($class, $self, $string) = @_;
  65.     
  66.     if ($string) {
  67.         $string =~ s/\.//g;  # remove all dots.
  68.         $string =~ s/^0x//;  # remove leading 0x
  69.         
  70.         if ($string =~ /^[a-zA-Z0-9]{40}$/) {
  71.             @{ $self }{ qw(afi idi dfi aa rsvd rd area id sel) } = 
  72.                 unpack("A2A4A2A6A4A4A4A12A2", $string);
  73.         } 
  74.     }
  75.     
  76.     return bless $self, $class;
  77. }
  78.     
  79.  
  80. sub idp {
  81.     my $self = shift;
  82.  
  83.     return join('', $self->{"afi"},
  84.                     $self->{"idi"});
  85. }
  86.  
  87. sub dsp {
  88.     my $self = shift;
  89.  
  90.     return join('', 
  91.              $self->{"dfi"},
  92.              $self->{"aa"},
  93.              $self->rsvd,
  94.              $self->{"rd"},
  95.              $self->{"area"},
  96.              $self->{"id"},
  97.              $self->{"sel"});
  98. }
  99.  
  100. sub rsvd {
  101.     my $self = shift;
  102.  
  103.     return exists $self->{"rsvd"} ? $self->{"rsvd"} : "0000";
  104. }
  105.  
  106. sub rdatastr {
  107.     my $self = shift;
  108.     my $rdatastr;
  109.  
  110.     if (exists $self->{"afi"}) {
  111.         if ($self->{"afi"} eq "47") {
  112.             $rdatastr = join('', $self->idp, $self->dsp);
  113.         } else {
  114.             $rdatastr = "; AFI $self->{'afi'} not supported";
  115.         }
  116.     } else {
  117.         $rdatastr = '';
  118.     }
  119.  
  120.     return $rdatastr;
  121. }
  122.  
  123. sub rr_rdata {
  124.     my $self = shift;
  125.     my $rdata = "";
  126.  
  127.     if (exists $self->{"afi"}) {
  128.         $rdata .= pack("C", hex($self->{"afi"}));
  129.  
  130.         if ($self->{"afi"} eq "47") {
  131.             $rdata .= str2bcd($self->{"idi"},  2);
  132.             $rdata .= str2bcd($self->{"dfi"},  1);
  133.             $rdata .= str2bcd($self->{"aa"},   3);
  134.             $rdata .= str2bcd(0,               2);    # rsvd
  135.             $rdata .= str2bcd($self->{"rd"},   2);
  136.             $rdata .= str2bcd($self->{"area"}, 2);
  137.             $rdata .= str2bcd($self->{"id"},   6);
  138.             $rdata .= str2bcd($self->{"sel"},  1);
  139.         }
  140.  
  141.         # Checks for other versions would go here.
  142.     }
  143.  
  144.     return $rdata;
  145. }
  146.  
  147. #------------------------------------------------------------------------------
  148. # Usage:  str2bcd(STRING, NUM_BYTES)
  149. #
  150. # Takes a string representing a hex number of arbitrary length and
  151. # returns an equivalent BCD string of NUM_BYTES length (with
  152. # NUM_BYTES * 2 digits), adding leading zeros if necessary.
  153. #------------------------------------------------------------------------------
  154.  
  155. # This can't be the best way....
  156. sub str2bcd {
  157.     my ($string, $bytes) = @_;
  158.     my $retval = "";
  159.  
  160.     my $digits = $bytes * 2;
  161.     $string = sprintf("%${digits}s", $string);
  162.     $string =~ tr/ /0/;
  163.  
  164.     my $i;
  165.     for ($i = 0; $i < $bytes; ++$i) {
  166.         my $bcd = substr($string, $i*2, 2);
  167.         $retval .= pack("C", hex $bcd);
  168.     }
  169.  
  170.     return $retval;
  171. }
  172.  
  173. 1;
  174. __END__
  175.  
  176. =head1 NAME
  177.  
  178. Net::DNS::RR::NSAP - DNS NSAP resource record
  179.  
  180. =head1 SYNOPSIS
  181.  
  182. C<use Net::DNS::RR>;
  183.  
  184. =head1 DESCRIPTION
  185.  
  186. Class for DNS Network Service Access Point (NSAP) resource records.
  187.  
  188. =head1 METHODS
  189.  
  190. =head2 idp
  191.  
  192.     print "idp = ", $rr->idp, "\n";
  193.  
  194. Returns the RR's initial domain part (the AFI and IDI fields).
  195.  
  196. =head2 dsp
  197.  
  198.     print "dsp = ", $rr->dsp, "\n";
  199.  
  200. Returns the RR's domain specific part (the DFI, AA, Rsvd, RD, Area,
  201. ID, and SEL fields).
  202.  
  203. =head2 afi
  204.  
  205.     print "afi = ", $rr->afi, "\n";
  206.  
  207. Returns the RR's authority and format identifier.  C<Net::DNS>
  208. currently supports only AFI 47 (GOSIP Version 2).
  209.  
  210. =head2 idi
  211.  
  212.     print "idi = ", $rr->idi, "\n";
  213.  
  214. Returns the RR's initial domain identifier.
  215.  
  216. =head2 dfi
  217.  
  218.     print "dfi = ", $rr->dfi, "\n";
  219.  
  220. Returns the RR's DSP format identifier.
  221.  
  222. =head2 aa
  223.  
  224.     print "aa = ", $rr->aa, "\n";
  225.  
  226. Returns the RR's administrative authority.
  227.  
  228. =head2 rsvd
  229.  
  230.     print "rsvd = ", $rr->rsvd, "\n";
  231.  
  232. Returns the RR's reserved field.
  233.  
  234. =head2 rd
  235.  
  236.     print "rd = ", $rr->rd, "\n";
  237.  
  238. Returns the RR's routing domain identifier.
  239.  
  240. =head2 area
  241.  
  242.     print "area = ", $rr->area, "\n";
  243.  
  244. Returns the RR's area identifier.
  245.  
  246. =head2 id
  247.  
  248.     print "id = ", $rr->id, "\n";
  249.  
  250. Returns the RR's system identifier.
  251.  
  252. =head2 sel
  253.  
  254.     print "sel = ", $rr->sel, "\n";
  255.  
  256. Returns the RR's NSAP selector.
  257.  
  258. =head1 COPYRIGHT
  259.  
  260. Copyright (c) 1997-2002 Michael Fuhr. 
  261.  
  262. Portions Copyright (c) 2002-2003 Chris Reinhardt.
  263.  
  264. All rights reserved.  This program is free software; you may redistribute
  265. it and/or modify it under the same terms as Perl itself.. 
  266.  
  267. =head1 SEE ALSO
  268.  
  269. L<perl(1)>, L<Net::DNS>, L<Net::DNS::Resolver>, L<Net::DNS::Packet>,
  270. L<Net::DNS::Header>, L<Net::DNS::Question>, L<Net::DNS::RR>,
  271. RFC 1706.
  272.  
  273. =cut
  274.