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
     38 -def inet_pton(family, text):
     39      """Convert the textual form of a network address into its binary form.
     40
     41      @param family: the address family
     42      @type family: int
     43      @param text: the textual address
     44      @type text: string
     45      @raises NotImplementedError: the address family specified is not
     46      implemented.
     47      @rtype: string
     48      """
     49
     50      if family == AF_INET:
     51          return dns.ipv4.inet_aton(text)
     52      elif family == AF_INET6:
     53          return dns.ipv6.inet_aton(text)
     54      else:
     55          raise NotImplementedError
     56
     57
     58 -def inet_ntop(family, address):
     59      """Convert the binary form of a network address into its textual form.
     60
     61      @param family: the address family
     62      @type family: int
     63      @param address: the binary address
     64      @type address: string
     65      @raises NotImplementedError: the address family specified is not
     66      implemented.
     67      @rtype: string
     68      """
     69      if family == AF_INET:
     70          return dns.ipv4.inet_ntoa(address)
     71      elif family == AF_INET6:
     72          return dns.ipv6.inet_ntoa(address)
     73      else:
     74          raise NotImplementedError
     75
     76
     77 -def af_for_address(text):
     78      """Determine the address family of a textual-form network address.
     79
     80      @param text: the textual address
     81      @type text: string
     82      @raises ValueError: the address family cannot be determined from the input.
     83      @rtype: int
     84      """
     85      try:
     86          dns.ipv4.inet_aton(text)
     87          return AF_INET
     88      except Exception:
     89          try:
     90              dns.ipv6.inet_aton(text)
     91              return AF_INET6
     92          except:
     93              raise ValueError
     94
     95
     96 -def is_multicast(text):
     97      """Is the textual-form network address a multicast address?
     98
     99      @param text: the textual address
    100      @raises ValueError: the address family cannot be determined from the input.
    101      @rtype: bool
    102      """
    103      try:
    104          first = ord(dns.ipv4.inet_aton(text)[0])
    105          return first >= 224 and first <= 239
    106      except Exception:
    107          try:
    108              first = ord(dns.ipv6.inet_aton(text)[0])
    109              return first == 255
    110          except Exception:
    111              raise ValueError
    112