--- orig/rpath.py	2010-12-22 16:54:48.414822737 -0800
+++ rpath.py	2010-12-23 16:23:44.957000529 -0800
@@ -55,13 +55,27 @@
 
 class RPathException(Exception): pass
 
+zero_buffer = None
 def copyfileobj(inputfp, outputfp):
 	"""Copies file inputfp to outputfp in blocksize intervals"""
 	blocksize = Globals.blocksize
+
+	# Create a zero-buffer cache to make comparisons faster
+	global zero_buffer;
+	if not zero_buffer:
+		zero_buffer = chr(0) * Globals.blocksize
+
 	while 1:
 		inbuf = inputfp.read(blocksize)
 		if not inbuf: break
-		outputfp.write(inbuf)
+
+		if inbuf == zero_buffer:
+			buflen = len(inbuf)
+			#log.Log("sparse-0-write of %ld bytes at offset %ld" %( buflen, outputfp.tell() ), 1)
+			outputfp.seek(buflen-1, os.SEEK_CUR)
+			outputfp.write(chr(0));
+		else:
+			outputfp.write(inbuf)
 
 def cmpfileobj(fp1, fp2):
 	"""True if file objects fp1 and fp2 contain same data"""

