Package dns :: Module inet |
[hide private]
[frames] | no frames]

# Source Code for Module dns.inet

      1  # Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
      2  #
      3  # Permission to use, copy, modify, and distribute this software and its
      4  # documentation for any purpose with or without fee is hereby granted,
      5  # provided that the above copyright notice and this permission notice
      6  # appear in all copies.
      7  #
      8  # THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
      9  # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     10  # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
     11  # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     12  # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     13  # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
     14  # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     15
     16  """Generic Internet address helper functions."""
     17
     18  import socket
     19
     20  import dns.ipv4
     21  import dns.ipv6
     22
     23
     24  # We assume that AF_INET is always defined.
     25
     26  AF_INET = socket.AF_INET
     27
     28  # AF_INET6 might not be defined in the socket module, but we need it.
     29  # We'll try to use the socket module's value, and if it doesn't work,
     30  # we'll use our own value.
     31
     32  try:
     33      AF_INET6 = socket.AF_INET6
     34  except AttributeError:
     35      AF_INET6 = 9999
     36
     37 -def inet_pton(family, text):
     38      """Convert the textual form of a network address into its binary form.
     39
     40      @param family: the address family
     41      @type family: int
     42      @param text: the textual address
     43      @type text: string
     44      @raises NotImplementedError: the address family specified is not
     45      implemented.
     46      @rtype: string
     47      """
     48
     49      if family == AF_INET:
     50          return dns.ipv4.inet_aton(text)
     51      elif family == AF_INET6:
     52          return dns.ipv6.inet_aton(text)
     53      else:
     54          raise NotImplementedError
     55
     56 -def inet_ntop(family, address):
     57      """Convert the binary form of a network address into its textual form.
     58
     59      @param family: the address family
     60      @type family: int
     61      @param address: the binary address
     62      @type address: string
     63      @raises NotImplementedError: the address family specified is not
     64      implemented.
     65      @rtype: string
     66      """
     67      if family == AF_INET:
     68          return dns.ipv4.inet_ntoa(address)
     69      elif family == AF_INET6:
     70          return dns.ipv6.inet_ntoa(address)
     71      else:
     72          raise NotImplementedError
     73
     74 -def af_for_address(text):
     75      """Determine the address family of a textual-form network address.
     76
     77      @param text: the textual address
     78      @type text: string
     79      @raises ValueError: the address family cannot be determined from the input.
     80      @rtype: int
     81      """
     82      try:
     83          junk = dns.ipv4.inet_aton(text)
     84          return AF_INET
     85      except:
     86          try:
     87              junk = dns.ipv6.inet_aton(text)
     88              return AF_INET6
     89          except:
     90              raise ValueError
     91
     92 -def is_multicast(text):
     93      """Is the textual-form network address a multicast address?
     94
     95      @param text: the textual address
     96      @raises ValueError: the address family cannot be determined from the input.
     97      @rtype: bool
     98      """
     99      try:
    100          first = ord(dns.ipv4.inet_aton(text)[0])
    101          return (first >= 224 and first <= 239)
    102      except:
    103          try:
    104              first = ord(dns.ipv6.inet_aton(text)[0])
    105              return (first == 255)
    106          except:
    107              raise ValueError
    108