Patch by Mikael Lyngvig:

1. Fix incorrect file open mode on Win32 platforms (use "rb" instead
of "r").

2. Add shallow parameter to cmp.cmp().  If false, deep file
comparisons are made.

The module should be 100 percent backwards compatible.
diff --git a/Lib/cmp.py b/Lib/cmp.py
index 69e6e27..f21d3a2 100644
--- a/Lib/cmp.py
+++ b/Lib/cmp.py
@@ -12,14 +12,14 @@
 
 cache = {}
 
-def cmp(f1, f2): # Compare two files, use the cache if possible.
+def cmp(f1, f2, shallow=1): # Compare two files, use the cache if possible.
 	# Return 1 for identical files, 0 for different.
 	# Raise exceptions if either file could not be statted, read, etc.
 	s1, s2 = sig(os.stat(f1)), sig(os.stat(f2))
 	if s1[0] <> 8 or s2[0] <> 8:
 		# Either is a not a plain file -- always report as different
 		return 0
-	if s1 == s2:
+	if shallow and s1 == s2:
 		# type, size & mtime match -- report same
 		return 1
 	if s1[:2] <> s2[:2]: # Types or sizes differ, don't bother
@@ -52,8 +52,8 @@
 
 def do_cmp(f1, f2): # Compare two files, really
 	bufsize = 8*1024 # Could be tuned
-	fp1 = open(f1, 'r')
-	fp2 = open(f2, 'r')
+	fp1 = open(f1, 'rb')
+	fp2 = open(f2, 'rb')
 	while 1:
 		b1 = fp1.read(bufsize)
 		b2 = fp2.read(bufsize)