pydns AAAA query support

David B Terrell dbt at meat.net
Wed Jan 30 20:27:39 EST 2002


There is no support for AAAA answers (turning "::1" into the
appropriate byte stream) yet.

[also posted to pydns-developers]

Index: DNS/Lib.py
===================================================================
RCS file: /cvsroot/pydns/pydns/DNS/Lib.py,v
retrieving revision 1.8
diff -u -r1.8 Lib.py
--- DNS/Lib.py	2001/08/09 09:08:55	1.8
+++ DNS/Lib.py	2002/01/30 02:37:39
@@ -37,6 +37,16 @@
 	return chr((n>>24)&0xFF) + chr((n>>16)&0xFF) \
 		  + chr((n>>8)&0xFF) + chr(n&0xFF)
 
+def pack128bit(t):
+	return chr(chr(t[0]>>24)&0xFF) + chr((t[0]>>16)&0xFF) \
+	       + chr((t[0]>>8)&0xFF) + chr(t[0]&0xFF) \
+	       + chr((t[1]>>24)&0xFF) + chr((t[1]>>16)&0xFF) \
+	       + chr((t[1]>>8)&0xFF) + chr(t[1]&0xFF) \
+	       + chr((t[2]>>24)&0xFF) + chr((t[2]>>16)&0xFF) \
+	       + chr((t[2]>>8)&0xFF) + chr(t[2]&0xFF) \
+	       + chr((t[3]>>24)&0xFF) + chr((t[3]>>16)&0xFF) \
+	       + chr((t[3]>>8)&0xFF) + chr(t[3]&0xFF)
+
 def unpack16bit(s):
 	return (ord(s[0])<<8) | ord(s[1])
 
@@ -44,6 +54,17 @@
 	return (ord(s[0])<<24) | (ord(s[1])<<16) \
 		  | (ord(s[2])<<8) | ord(s[3])
 
+def unpack128bit(s):
+	# tuple of 4 32 bit values
+	return(((ord(s[0])<<24) | (ord(s[1])<<16) \
+	       | (ord(s[2])<<8) | ord(s[3])),
+	       ((ord(s[4])<<24) | (ord(s[5])<<16) \
+	       | (ord(s[6])<<8) | ord(s[7])),
+	       ((ord(s[8])<<24) | (ord(s[9])<<16) \
+	       | (ord(s[10])<<8) | ord(s[11])),
+	       ((ord(s[12])<<24) | (ord(s[13])<<16) \
+	       | (ord(s[14])<<8) | ord(s[15])))
+
 def addr2bin(addr):
 	if type(addr) == type(0):
 		return addr
@@ -57,7 +78,26 @@
 	return '%d.%d.%d.%d' % ((n>>24)&0xFF, (n>>16)&0xFF,
 		  (n>>8)&0xFF, n&0xFF)
 
-
+def bin2addr6(t):
+	comp = 0 #  0 - no compression yet, 1 - compressing, 2 - already compressed
+	mask = (0xffff0000,0xffff)
+	shift = (16, 0)
+	ret = ''
+	for n in 0,1,2,3:
+		for sub in 0,1:
+			if comp < 2 and ((t[n] & mask[sub])==0):
+				# and skip it
+				comp = 1
+			else:
+				if(comp==1):
+					comp=2
+					ret += ':'
+				if(ret):
+					ret += ':'
+				ret += '%x' % (((t[n] & mask[sub]) >> shift[sub]) & 0xFFFF)
+				
+	return(ret)
+				
 # Packing class
 
 class Packer:
@@ -168,8 +208,12 @@
 		return unpack16bit(self.getbytes(2))
 	def get32bit(self):
 		return unpack32bit(self.getbytes(4))
+	def get128bit(self):
+		return unpack128bit(self.getbytes(16))
 	def getaddr(self):
 		return bin2addr(self.get32bit())
+	def getaddr6(self):
+		return bin2addr6(self.get128bit())
 	def getstring(self):
 		return self.getbytes(ord(self.getbyte()))
 	def getname(self):
@@ -386,6 +430,8 @@
 		return list
 	def getAdata(self):
 		return self.getaddr()
+	def getAAAAdata(self):
+		return self.getaddr6()
 	def getWKSdata(self):
 		address = self.getaddr()
 		protocol = ord(self.getbyte())

-- 
David Terrell            | "Instead of plodding through the equivalent of
Prime Minister, NebCorp  | literary Xanax, the pregeeks go for sci-fi and
dbt at meat.net             | fantasy:  LSD in book form." - Benjy Feen,
http://wwn.nebcorp.com   | http://www.monkeybagel.com/ "Origins of Sysadmins"



More information about the Python-list mailing list