[maemo-commits] [maemo-commits] r9918 - projects/haf/trunk/apt/apt-pkg/contrib
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Thu Feb 15 18:27:14 EET 2007
- Previous message: [maemo-commits] r9917 - projects/haf/trunk/apt
- Next message: [maemo-commits] r9919 - projects/haf/trunk/apt
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: marivoll
Date: 2007-02-15 18:27:13 +0200 (Thu, 15 Feb 2007)
New Revision: 9918
Modified:
projects/haf/trunk/apt/apt-pkg/contrib/mmap.cc
projects/haf/trunk/apt/apt-pkg/contrib/mmap.h
Log:
* Applied mmap.patch that allows us to work on file systems that don't
support read-write mmaps such as JFFS2.
Modified: projects/haf/trunk/apt/apt-pkg/contrib/mmap.cc
===================================================================
--- projects/haf/trunk/apt/apt-pkg/contrib/mmap.cc 2007-02-15 15:49:47 UTC (rev 9917)
+++ projects/haf/trunk/apt/apt-pkg/contrib/mmap.cc 2007-02-15 16:27:13 UTC (rev 9918)
@@ -35,13 +35,15 @@
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
+#include <errno.h>
+
/*}}}*/
// MMap::MMap - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
MMap::MMap(FileFd &F,unsigned long Flags) : Flags(Flags), iSize(0),
- Base(0)
+ Base(0), fd(0)
{
if ((Flags & NoImmMap) != NoImmMap)
Map(F);
@@ -51,7 +53,7 @@
// ---------------------------------------------------------------------
/* */
MMap::MMap(unsigned long Flags) : Flags(Flags), iSize(0),
- Base(0)
+ Base(0), fd(0)
{
}
/*}}}*/
@@ -84,7 +86,26 @@
// Map it.
Base = mmap(0,iSize,Prot,Map,Fd.Fd(),0);
if (Base == (void *)-1)
- return _error->Errno("mmap",_("Couldn't make mmap of %lu bytes"),iSize);
+ {
+ if (errno == ENODEV || errno == EINVAL)
+ {
+ // The filesystem doesn't support this particular kind of
+ // mmap. So we allocate a buffer and read the whole file
+ // into it.
+ //
+ int dupped_fd = dup (Fd.Fd());
+ if (dupped_fd == -1)
+ return _error->Errno("mmap",_("Couldn't dup filedescriptor"));
+
+ Base = new unsigned char[iSize];
+ fd = new FileFd (dupped_fd);
+ if (!fd->Seek(0L) || !fd->Read(Base, iSize))
+ return false;
+ }
+ else
+ return _error->Errno("mmap",_("Couldn't make mmap of %lu bytes"),
+ iSize);
+ }
return true;
}
@@ -99,10 +120,19 @@
if (DoSync == true)
Sync();
+
+ if (fd)
+ {
+ delete[] (char *)Base;
+ delete fd;
+ fd = NULL;
+ }
+ else
+ {
+ if (munmap((char *)Base,iSize) != 0)
+ _error->Warning("Unable to munmap");
+ }
- if (munmap((char *)Base,iSize) != 0)
- _error->Warning("Unable to munmap");
-
iSize = 0;
Base = 0;
return true;
@@ -113,14 +143,24 @@
/* This is done in syncronous mode - the docs indicate that this will
not return till all IO is complete */
bool MMap::Sync()
-{
+{
if ((Flags & UnMapped) == UnMapped)
return true;
#ifdef _POSIX_SYNCHRONIZED_IO
if ((Flags & ReadOnly) != ReadOnly)
- if (msync((char *)Base,iSize,MS_SYNC) != 0)
- return _error->Errno("msync","Unable to write mmap");
+ {
+ if (fd)
+ {
+ if (!fd->Seek (0) || !fd->Write (Base, iSize))
+ return false;
+ }
+ else
+ {
+ if (msync((char *)Base,iSize,MS_SYNC) != 0)
+ return _error->Errno("msync","Unable to write mmap");
+ }
+ }
#endif
return true;
}
@@ -136,8 +176,20 @@
#ifdef _POSIX_SYNCHRONIZED_IO
unsigned long PSize = sysconf(_SC_PAGESIZE);
if ((Flags & ReadOnly) != ReadOnly)
- if (msync((char *)Base+(int)(Start/PSize)*PSize,Stop - Start,MS_SYNC) != 0)
- return _error->Errno("msync","Unable to write mmap");
+ {
+ if (fd)
+ {
+ if (!fd->Seek (Start)
+ || !fd->Write (((char *)Base)+Start, Stop-Start))
+ return false;
+ }
+ else
+ {
+ if (msync((char *)Base+(int)(Start/PSize)*PSize,Stop - Start,
+ MS_SYNC) != 0)
+ return _error->Errno("msync","Unable to write mmap");
+ }
+ }
#endif
return true;
}
Modified: projects/haf/trunk/apt/apt-pkg/contrib/mmap.h
===================================================================
--- projects/haf/trunk/apt/apt-pkg/contrib/mmap.h 2007-02-15 15:49:47 UTC (rev 9917)
+++ projects/haf/trunk/apt/apt-pkg/contrib/mmap.h 2007-02-15 16:27:13 UTC (rev 9918)
@@ -47,6 +47,12 @@
unsigned long iSize;
void *Base;
+ // In case mmap can not be used, we keep a dup of the file
+ // descriptor that should have been mmaped so that we can write to
+ // the file in Sync().
+ //
+ FileFd *fd;
+
bool Map(FileFd &Fd);
bool Close(bool DoSync = true);
- Previous message: [maemo-commits] r9917 - projects/haf/trunk/apt
- Next message: [maemo-commits] r9919 - projects/haf/trunk/apt
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
