]> granicus.if.org Git - python/commitdiff
Fix the size() method to return the size of the file on Unix, not the
authorAndrew M. Kuchling <amk@amk.ca>
Sat, 17 Jun 2000 22:41:22 +0000 (22:41 +0000)
committerAndrew M. Kuchling <amk@amk.ca>
Sat, 17 Jun 2000 22:41:22 +0000 (22:41 +0000)
size of the mapped area.  This seems to be what the Windows version does.
This change requires keeping around the fd of the mapped file.

Modules/mmapmodule.c

index 1f5e19a5e699dbff75acd5792169ffbf947f4b87..4bfcb21889ff7ed19101f9f90478b1887f84ffbc 100644 (file)
@@ -29,6 +29,7 @@
 #ifdef UNIX
 #include <unistd.h>
 #include <sys/mman.h>
+#include <sys/stat.h>
 #endif
 
 #include <string.h>
@@ -49,7 +50,7 @@ typedef struct {
 #endif
 
 #ifdef UNIX
-  /* No Unix-specific information at this point in time */
+        int fd;
 #endif
 } mmap_object;
 
@@ -210,7 +211,7 @@ mmap_find_method (mmap_object *self,
 
 static PyObject *
 mmap_write_method (mmap_object * self,
-                      PyObject * args)
+                  PyObject * args)
 {
        long length;
        char * data;
@@ -264,7 +265,14 @@ mmap_size_method (mmap_object * self,
 #endif /* MS_WIN32 */
 
 #ifdef UNIX
-       return (Py_BuildValue ("l", self->size) );
+       {
+               struct stat buf;
+               if (-1 == fstat(self->fd, &buf)) {
+                       PyErr_SetFromErrno(mmap_module_error);
+                       return NULL;
+               }
+               return (Py_BuildValue ("l", buf.st_size) );
+       }
 #endif /* UNIX */
 }
 
@@ -717,6 +725,7 @@ new_mmap_object (PyObject * self, PyObject * args, PyObject *kwdict)
        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->data = mmap(NULL, map_size, 
                           prot, flags,
                           fd, 0);