From: Bob Halley Date: Wed, 13 Jun 2007 16:00:14 +0000 (+0000) Subject: add basic multicast support X-Git-Tag: v1.6.0~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f26fb84cd3b158ffb48021a5be889fed2937d9a7;p=thirdparty%2Fdnspython.git add basic multicast support --- diff --git a/ChangeLog b/ChangeLog index 62e54fa0..00aeb5d7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2007-06-13 Bob Halley + + * dns/inet.py: Added is_multicast(). + + * dns/query.py (udp): If the queried address is a multicast address, then + don't check that the address of the response is the same as the address + queried. + 2007-05-24 Bob Halley * dns/rdtypes/IN/NAPTR.py: NAPTR comparisons didn't compare the diff --git a/dns/inet.py b/dns/inet.py index 14709252..67bd6143 100644 --- a/dns/inet.py +++ b/dns/inet.py @@ -88,3 +88,21 @@ def af_for_address(text): return AF_INET6 except: raise ValueError + +def is_multicast(text): + """Is the textual-form network address a multicast address? + + @param text: the textual address + @raises ValueError: the address family cannot be determined from the input. + @rtype: bool + """ + try: + first = ord(dns.ipv4.inet_aton(text)[0]) + return (first >= 224 and first <= 239) + except: + try: + first = ord(dns.ipv6.inet_aton(text)[0]) + return (first == 255) + except: + raise ValueError + diff --git a/dns/query.py b/dns/query.py index f2ff9a1d..785e4230 100644 --- a/dns/query.py +++ b/dns/query.py @@ -117,7 +117,9 @@ def udp(q, where, timeout=None, port=53, af=None, source=None, source_port=0, while 1: _wait_for_readable(s, expiration) (wire, from_address) = s.recvfrom(65535) - if from_address == destination: + if from_address == destination or \ + (dns.inet.is_multicast(where) and \ + from_address[1:] == destination[1:]): break if not ignore_unexpected: raise UnexpectedSource, \