1 # Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
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.
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.
16 """Generic Internet address helper functions."""
24 # We assume that AF_INET is always defined.
26 AF_INET
= socket
.AF_INET
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.
33 AF_INET6
= socket
.AF_INET6
34 except AttributeError:
37 def inet_pton(family
, text
):
38 """Convert the textual form of a network address into its binary form.
40 @param family: the address family
42 @param text: the textual address
44 @raises NotImplementedError: the address family specified is not
50 return dns
.ipv4
.inet_aton(text
)
51 elif family
== AF_INET6
:
52 return dns
.ipv6
.inet_aton(text
)
54 raise NotImplementedError
56 def inet_ntop(family
, address
):
57 """Convert the binary form of a network address into its textual form.
59 @param family: the address family
61 @param address: the binary address
63 @raises NotImplementedError: the address family specified is not
68 return dns
.ipv4
.inet_ntoa(address
)
69 elif family
== AF_INET6
:
70 return dns
.ipv6
.inet_ntoa(address
)
72 raise NotImplementedError
74 def af_for_address(text
):
75 """Determine the address family of a textual-form network address.
77 @param text: the textual address
79 @raises ValueError: the address family cannot be determined from the input.
83 junk
= dns
.ipv4
.inet_aton(text
)
87 junk
= dns
.ipv6
.inet_aton(text
)
92 def is_multicast(text
):
93 """Is the textual-form network address a multicast address?
95 @param text: the textual address
96 @raises ValueError: the address family cannot be determined from the input.
100 first
= ord(dns
.ipv4
.inet_aton(text
)[0])
101 return (first
>= 224 and first
<= 239)
104 first
= ord(dns
.ipv6
.inet_aton(text
)[0])
105 return (first
== 255)