diff --git a/Lib/aifc.py b/Lib/aifc.py
index bad5e43..e45792e 100644
--- a/Lib/aifc.py
+++ b/Lib/aifc.py
@@ -81,6 +81,7 @@
 #	rewind()	-- rewind to the beginning of the audio stream
 #	setpos(pos)	-- seek to the specified position
 #	tell()		-- return the current position
+#	close()		-- close the instance (make it unusable)
 # The position returned by tell(), the position given to setpos() and
 # the position of marks are all compatible and have nothing to do with
 # the actual postion in the file.
diff --git a/Lib/ftplib.py b/Lib/ftplib.py
index cc96a34..c886f82 100644
--- a/Lib/ftplib.py
+++ b/Lib/ftplib.py
@@ -57,10 +57,6 @@
 CRLF = '\r\n'
 
 
-# Telnet special characters
-DM = chr(242)				# Data Mark
-IP = chr(244)				# Interrupt Process
-
 # Next port to be used by makeport(), with PORT_OFFSET added
 # (This is now only used when the python interpreter doesn't support
 # the getsockname() method yet)
@@ -327,6 +323,12 @@
 	def cwd(self, dirname):
 		self.voidcmd('CWD ' + dirname)
 
+	# Retrieve the size of a file
+	def size(self, filename):
+		resp = self.sendcmd('SIZE ' + filename)
+		if resp[:3] == '213':
+			return string.atoi(string.strip(resp[3:]))
+
 	# Make a directory, return its full pathname
 	def mkd(self, dirname):
 		resp = self.sendcmd('MKD ' + dirname)
@@ -340,6 +342,10 @@
 	# Quit, and close the connection
 	def quit(self):
 		self.voidcmd('QUIT')
+		self.close()
+
+	# Close the connection without assuming anything about it
+	def close(self):
 		self.file.close()
 		self.sock.close()
 		del self.file, self.sock
diff --git a/Lib/lib-old/whatsound.py b/Lib/lib-old/whatsound.py
new file mode 100644
index 0000000..a59323b
--- /dev/null
+++ b/Lib/lib-old/whatsound.py
@@ -0,0 +1,269 @@
+# This module contains several routines that help recognizing sound
+# files.
+#
+# Function whathdr() recognizes various types of sound file headers.
+# It understands almost all headers that SOX can decode.
+#
+# The return tuple contains the following items, in this order:
+# - file type (as SOX understands it)
+# - sampling rate (0 if unknown or hard to decode)
+# - number of channels (0 if unknown or hard to decode)
+# - number of frames in the file (-1 if unknown or hard to decode)
+# - number of bits/sample, or 'U' for U-LAW, or 'A' for A-LAW
+#
+# If the file doesn't have a recognizable type, it returns None.
+# If the file can't be opened, IOError is raised.
+#
+# To compute the total time, divide the number of frames by the
+# sampling rate (a frame contains a sample for each channel).
+#
+# Function whatraw() calls the "whatsound" program and interprets its
+# output.  You'll have to guess the sampling rate by listening though!
+#
+# Function what() calls whathdr() and if it doesn't recognize the file
+# then calls whatraw().
+#
+# Finally, the function test() is a simple main program that calls
+# what() for all files mentioned on the argument list.  For directory
+# arguments it calls what() for all files in that directory.  Default
+# argument is "." (testing all files in the current directory).  The
+# option -r tells it to recurse down directories found inside
+# explicitly given directories.
+#
+# The file structure is top-down except that the test program and its
+# subroutine come last.
+
+
+#------------------------------------------------------#
+# Guess the type of any sound file, raw or with header #
+#------------------------------------------------------#
+
+def what(filename):
+	res = whathdr(filename)
+	if not res:
+		res = whatraw(filename)
+	return res
+
+
+#-----------------------------#
+# Guess the type of raw sound #
+#-----------------------------#
+
+def whatraw(filename):
+	# Assume it's always 1 channel, byte-sized samples
+	# Don't assume anything about the rate
+	import os
+	from stat import ST_SIZE
+	# XXX "whatsound" should be part of the distribution somehow...
+	cmd = 'whatsound ' + filename + ' 2>/dev/null'
+	pipe = os.popen(cmd, 'r')
+	data = pipe.read()
+	sts = pipe.close()
+	if sts:
+		return None
+	if data[:13] == '-t raw -b -s ':
+		type = 'sb'
+		sample_size = 8
+	elif data[:13] == '-t raw -b -u ':
+		type = 'ub'
+		sample_size = 8
+	elif data[:13] == '-t raw -b -U ':
+		type = 'ul'
+		sample_size = 'U'
+	else:
+		return None
+	try:
+		frame_count = os.stat(filename)[ST_SIZE]
+	except IOError:
+		frame_count = -1
+	return type, 0, 1, frame_count, sample_size
+
+
+#-------------------------#
+# Recognize sound headers #
+#-------------------------#
+
+def whathdr(filename):
+	f = open(filename, 'r')
+	h = f.read(512)
+	for tf in tests:
+		res = tf(h, f)
+		if res:
+			return res
+	return None
+
+
+#-----------------------------------#
+# Subroutines per sound header type #
+#-----------------------------------#
+
+tests = []
+
+def test_aifc(h, f):
+	import aifc
+	if h[:4] <> 'FORM':
+		return None
+	if h[8:12] == 'AIFC':
+		fmt = 'aifc'
+	elif h[8:12] == 'AIFF':
+		fmt = 'aiff'
+	else:
+		return None
+	f.seek(0)
+	try:
+		a = aifc.openfp(f, 'r')
+	except (EOFError, aifc.Error):
+		return None
+	return (fmt, a.getframerate(), a.getnchannels(), \
+		a.getnframes(), 8*a.getsampwidth())
+
+tests.append(test_aifc)
+
+
+def test_au(h, f):
+	if h[:4] == '.snd':
+		f = get_long_be
+	elif h[:4] in ('\0ds.', 'dns.'):
+		f = get_long_le
+	else:
+		return None
+	type = 'au'
+	hdr_size = f(h[4:8])
+	data_size = f(h[8:12])
+	encoding = f(h[12:16])
+	rate = f(h[16:20])
+	nchannels = f(h[20:24])
+	sample_size = 1 # default
+	if encoding == 1:
+		sample_bits = 'U'
+	elif encoding == 2:
+		sample_bits = 8
+	elif encoding == 3:
+		sample_bits = 16
+		sample_size = 2
+	else:
+		sample_bits = '?'
+	frame_size = sample_size * nchannels
+	return type, rate, nchannels, data_size/frame_size, sample_bits
+
+tests.append(test_au)
+
+
+def test_hcom(h, f):
+	if h[65:69] <> 'FSSD' or h[128:132] <> 'HCOM':
+		return None
+	divisor = get_long_be(h[128+16:128+20])
+	return 'hcom', 22050/divisor, 1, -1, 8
+
+tests.append(test_hcom)
+
+
+def test_voc(h, f):
+	if h[:20] <> 'Creative Voice File\032':
+		return None
+	sbseek = get_short_le(h[20:22])
+	rate = 0
+	if 0 <= sbseek < 500 and h[sbseek] == '\1':
+		ratecode = ord(h[sbseek+4])
+		rate = int(1000000.0 / (256 - ratecode))
+	return 'voc', rate, 1, -1, 8
+
+tests.append(test_voc)
+
+
+def test_wav(h, f):
+	# 'RIFF' <len> 'WAVE' 'fmt ' <len>
+	if h[:4] <> 'RIFF' or h[8:12] <> 'WAVE' or h[12:16] <> 'fmt ':
+		return None
+	style = get_short_le(h[20:22])
+	nchannels = get_short_le(h[22:24])
+	rate = get_long_le(h[24:28])
+	sample_bits = get_short_le(h[34:36])
+	return 'wav', rate, nchannels, -1, sample_bits
+
+tests.append(test_wav)
+
+
+def test_8svx(h, f):
+	if h[:4] <> 'FORM' or h[8:12] <> '8SVX':
+		return None
+	# Should decode it to get #channels -- assume always 1
+	return '8svx', 0, 1, 0, 8
+
+tests.append(test_8svx)
+
+
+def test_sndt(h, f):
+	if h[:5] == 'SOUND':
+		nsamples = get_long_le(h[8:12])
+		rate = get_short_le(h[20:22])
+		return 'sndt', rate, 1, nsamples, 8
+
+tests.append(test_sndt)
+
+
+def test_sndr(h, f):
+	if h[:2] == '\0\0':
+		rate = get_short_le(h[2:4])
+		if 4000 <= rate <= 25000:
+			return 'sndr', rate, 1, -1, 8
+
+tests.append(test_sndr)
+
+
+#---------------------------------------------#
+# Subroutines to extract numbers from strings #
+#---------------------------------------------#
+
+def get_long_be(s):
+	return (ord(s[0])<<24) | (ord(s[1])<<16) | (ord(s[2])<<8) | ord(s[3])
+
+def get_long_le(s):
+	return (ord(s[3])<<24) | (ord(s[2])<<16) | (ord(s[1])<<8) | ord(s[0])
+
+def get_short_be(s):
+	return (ord(s[0])<<8) | ord(s[1])
+
+def get_short_le(s):
+	return (ord(s[1])<<8) | ord(s[0])
+
+
+#--------------------#
+# Small test program #
+#--------------------#
+
+def test():
+	import sys
+	recursive = 0
+	if sys.argv[1:] and sys.argv[1] == '-r':
+		del sys.argv[1:2]
+		recursive = 1
+	try:
+		if sys.argv[1:]:
+			testall(sys.argv[1:], recursive, 1)
+		else:
+			testall(['.'], recursive, 1)
+	except KeyboardInterrupt:
+		sys.stderr.write('\n[Interrupted]\n')
+		sys.exit(1)
+
+def testall(list, recursive, toplevel):
+	import sys
+	import os
+	for filename in list:
+		if os.path.isdir(filename):
+			print filename + '/:',
+			if recursive or toplevel:
+				print 'recursing down:'
+				import glob
+				names = glob.glob(os.path.join(filename, '*'))
+				testall(names, recursive, 0)
+			else:
+				print '*** directory (use -r) ***'
+		else:
+			print filename + ':',
+			sys.stdout.flush()
+			try:
+				print what(filename)
+			except IOError:
+				print '*** not found ***'
diff --git a/Lib/toaiff.py b/Lib/toaiff.py
index adb2e61..d2f5cd7 100644
--- a/Lib/toaiff.py
+++ b/Lib/toaiff.py
@@ -9,7 +9,7 @@
 import os
 import tempfile
 import pipes
-import sndhdr
+import whatsound
 
 table = {}
 
@@ -78,7 +78,7 @@
 	else:
 		fname = filename
 	try:
-		ftype = sndhdr.whathdr(fname)
+		ftype = whatsound.whathdr(fname)
 		if ftype:
 			ftype = ftype[0] # All we're interested in
 	except IOError:
diff --git a/Lib/whatsound.py b/Lib/whatsound.py
new file mode 100644
index 0000000..a59323b
--- /dev/null
+++ b/Lib/whatsound.py
@@ -0,0 +1,269 @@
+# This module contains several routines that help recognizing sound
+# files.
+#
+# Function whathdr() recognizes various types of sound file headers.
+# It understands almost all headers that SOX can decode.
+#
+# The return tuple contains the following items, in this order:
+# - file type (as SOX understands it)
+# - sampling rate (0 if unknown or hard to decode)
+# - number of channels (0 if unknown or hard to decode)
+# - number of frames in the file (-1 if unknown or hard to decode)
+# - number of bits/sample, or 'U' for U-LAW, or 'A' for A-LAW
+#
+# If the file doesn't have a recognizable type, it returns None.
+# If the file can't be opened, IOError is raised.
+#
+# To compute the total time, divide the number of frames by the
+# sampling rate (a frame contains a sample for each channel).
+#
+# Function whatraw() calls the "whatsound" program and interprets its
+# output.  You'll have to guess the sampling rate by listening though!
+#
+# Function what() calls whathdr() and if it doesn't recognize the file
+# then calls whatraw().
+#
+# Finally, the function test() is a simple main program that calls
+# what() for all files mentioned on the argument list.  For directory
+# arguments it calls what() for all files in that directory.  Default
+# argument is "." (testing all files in the current directory).  The
+# option -r tells it to recurse down directories found inside
+# explicitly given directories.
+#
+# The file structure is top-down except that the test program and its
+# subroutine come last.
+
+
+#------------------------------------------------------#
+# Guess the type of any sound file, raw or with header #
+#------------------------------------------------------#
+
+def what(filename):
+	res = whathdr(filename)
+	if not res:
+		res = whatraw(filename)
+	return res
+
+
+#-----------------------------#
+# Guess the type of raw sound #
+#-----------------------------#
+
+def whatraw(filename):
+	# Assume it's always 1 channel, byte-sized samples
+	# Don't assume anything about the rate
+	import os
+	from stat import ST_SIZE
+	# XXX "whatsound" should be part of the distribution somehow...
+	cmd = 'whatsound ' + filename + ' 2>/dev/null'
+	pipe = os.popen(cmd, 'r')
+	data = pipe.read()
+	sts = pipe.close()
+	if sts:
+		return None
+	if data[:13] == '-t raw -b -s ':
+		type = 'sb'
+		sample_size = 8
+	elif data[:13] == '-t raw -b -u ':
+		type = 'ub'
+		sample_size = 8
+	elif data[:13] == '-t raw -b -U ':
+		type = 'ul'
+		sample_size = 'U'
+	else:
+		return None
+	try:
+		frame_count = os.stat(filename)[ST_SIZE]
+	except IOError:
+		frame_count = -1
+	return type, 0, 1, frame_count, sample_size
+
+
+#-------------------------#
+# Recognize sound headers #
+#-------------------------#
+
+def whathdr(filename):
+	f = open(filename, 'r')
+	h = f.read(512)
+	for tf in tests:
+		res = tf(h, f)
+		if res:
+			return res
+	return None
+
+
+#-----------------------------------#
+# Subroutines per sound header type #
+#-----------------------------------#
+
+tests = []
+
+def test_aifc(h, f):
+	import aifc
+	if h[:4] <> 'FORM':
+		return None
+	if h[8:12] == 'AIFC':
+		fmt = 'aifc'
+	elif h[8:12] == 'AIFF':
+		fmt = 'aiff'
+	else:
+		return None
+	f.seek(0)
+	try:
+		a = aifc.openfp(f, 'r')
+	except (EOFError, aifc.Error):
+		return None
+	return (fmt, a.getframerate(), a.getnchannels(), \
+		a.getnframes(), 8*a.getsampwidth())
+
+tests.append(test_aifc)
+
+
+def test_au(h, f):
+	if h[:4] == '.snd':
+		f = get_long_be
+	elif h[:4] in ('\0ds.', 'dns.'):
+		f = get_long_le
+	else:
+		return None
+	type = 'au'
+	hdr_size = f(h[4:8])
+	data_size = f(h[8:12])
+	encoding = f(h[12:16])
+	rate = f(h[16:20])
+	nchannels = f(h[20:24])
+	sample_size = 1 # default
+	if encoding == 1:
+		sample_bits = 'U'
+	elif encoding == 2:
+		sample_bits = 8
+	elif encoding == 3:
+		sample_bits = 16
+		sample_size = 2
+	else:
+		sample_bits = '?'
+	frame_size = sample_size * nchannels
+	return type, rate, nchannels, data_size/frame_size, sample_bits
+
+tests.append(test_au)
+
+
+def test_hcom(h, f):
+	if h[65:69] <> 'FSSD' or h[128:132] <> 'HCOM':
+		return None
+	divisor = get_long_be(h[128+16:128+20])
+	return 'hcom', 22050/divisor, 1, -1, 8
+
+tests.append(test_hcom)
+
+
+def test_voc(h, f):
+	if h[:20] <> 'Creative Voice File\032':
+		return None
+	sbseek = get_short_le(h[20:22])
+	rate = 0
+	if 0 <= sbseek < 500 and h[sbseek] == '\1':
+		ratecode = ord(h[sbseek+4])
+		rate = int(1000000.0 / (256 - ratecode))
+	return 'voc', rate, 1, -1, 8
+
+tests.append(test_voc)
+
+
+def test_wav(h, f):
+	# 'RIFF' <len> 'WAVE' 'fmt ' <len>
+	if h[:4] <> 'RIFF' or h[8:12] <> 'WAVE' or h[12:16] <> 'fmt ':
+		return None
+	style = get_short_le(h[20:22])
+	nchannels = get_short_le(h[22:24])
+	rate = get_long_le(h[24:28])
+	sample_bits = get_short_le(h[34:36])
+	return 'wav', rate, nchannels, -1, sample_bits
+
+tests.append(test_wav)
+
+
+def test_8svx(h, f):
+	if h[:4] <> 'FORM' or h[8:12] <> '8SVX':
+		return None
+	# Should decode it to get #channels -- assume always 1
+	return '8svx', 0, 1, 0, 8
+
+tests.append(test_8svx)
+
+
+def test_sndt(h, f):
+	if h[:5] == 'SOUND':
+		nsamples = get_long_le(h[8:12])
+		rate = get_short_le(h[20:22])
+		return 'sndt', rate, 1, nsamples, 8
+
+tests.append(test_sndt)
+
+
+def test_sndr(h, f):
+	if h[:2] == '\0\0':
+		rate = get_short_le(h[2:4])
+		if 4000 <= rate <= 25000:
+			return 'sndr', rate, 1, -1, 8
+
+tests.append(test_sndr)
+
+
+#---------------------------------------------#
+# Subroutines to extract numbers from strings #
+#---------------------------------------------#
+
+def get_long_be(s):
+	return (ord(s[0])<<24) | (ord(s[1])<<16) | (ord(s[2])<<8) | ord(s[3])
+
+def get_long_le(s):
+	return (ord(s[3])<<24) | (ord(s[2])<<16) | (ord(s[1])<<8) | ord(s[0])
+
+def get_short_be(s):
+	return (ord(s[0])<<8) | ord(s[1])
+
+def get_short_le(s):
+	return (ord(s[1])<<8) | ord(s[0])
+
+
+#--------------------#
+# Small test program #
+#--------------------#
+
+def test():
+	import sys
+	recursive = 0
+	if sys.argv[1:] and sys.argv[1] == '-r':
+		del sys.argv[1:2]
+		recursive = 1
+	try:
+		if sys.argv[1:]:
+			testall(sys.argv[1:], recursive, 1)
+		else:
+			testall(['.'], recursive, 1)
+	except KeyboardInterrupt:
+		sys.stderr.write('\n[Interrupted]\n')
+		sys.exit(1)
+
+def testall(list, recursive, toplevel):
+	import sys
+	import os
+	for filename in list:
+		if os.path.isdir(filename):
+			print filename + '/:',
+			if recursive or toplevel:
+				print 'recursing down:'
+				import glob
+				names = glob.glob(os.path.join(filename, '*'))
+				testall(names, recursive, 0)
+			else:
+				print '*** directory (use -r) ***'
+		else:
+			print filename + ':',
+			sys.stdout.flush()
+			try:
+				print what(filename)
+			except IOError:
+				print '*** not found ***'
