bug [ 728515 ] mmap's resize method resizes the file in win32 but not unix
diff --git a/Doc/lib/libmmap.tex b/Doc/lib/libmmap.tex
index 0d7baa1..c7ab348 100644
--- a/Doc/lib/libmmap.tex
+++ b/Doc/lib/libmmap.tex
@@ -132,6 +132,7 @@
 \end{methoddesc}
 
 \begin{methoddesc}{resize}{\var{newsize}}
+  Resizes the map and the underlying file, if any.
   If the mmap was created with \constant{ACCESS_READ} or
   \constant{ACCESS_COPY}, resizing the map will throw a \exception{TypeError} exception.
 \end{methoddesc}
diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py
index efb7180..a0386ef 100644
--- a/Lib/test/test_mmap.py
+++ b/Lib/test/test_mmap.py
@@ -120,6 +120,14 @@
             else:
                 verify(0, 'Could seek beyond the new size')
 
+            # Check that the underlying file is truncated too
+            # (bug #728515)
+            f = open(TESTFN)
+            f.seek(0, 2)
+            verify(f.tell() == 512, 'Underlying file not truncated')
+            f.close()
+            verify(m.size() == 512, 'New size not reflected in file') 
+
         m.close()
 
     finally:
diff --git a/Misc/NEWS b/Misc/NEWS
index 0171492..5bd2dc2 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -128,6 +128,9 @@
 Extension Modules
 -----------------
 
+- Bug #728515: mmap.resize() now resizes the file on Unix as it did
+  on Windows.
+
 - Patch #1180695: Add nanosecond stat resolution, and st_gen, 
   st_birthtime for FreeBSD.
 
diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c
index aaa4925..f58e0f1 100644
--- a/Modules/mmapmodule.c
+++ b/Modules/mmapmodule.c
@@ -421,6 +421,11 @@
 		return NULL;
 #else
 	} else {
+		if (ftruncate(self->fd, new_size) == -1) {
+			PyErr_SetFromErrno(mmap_module_error);
+			return NULL;
+		}
+		
 		void *newmap;
 
 #ifdef MREMAP_MAYMOVE
@@ -910,7 +915,12 @@
 	if (m_obj == NULL) {return NULL;}
 	m_obj->size = (size_t) map_size;
 	m_obj->pos = (size_t) 0;
-	m_obj->fd = fd;
+	m_obj->fd = dup(fd);
+	if (m_obj->fd == -1) {
+		Py_DECREF(m_obj);
+		PyErr_SetFromErrno(mmap_module_error);
+		return NULL;
+	}
 	m_obj->data = mmap(NULL, map_size, 
 			   prot, flags,
 			   fd, 0);