// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: mmap.cc,v 1.15 1999/04/18 06:36:36 jgg Exp $
+// $Id: mmap.cc,v 1.22 2001/05/27 05:19:30 jgg Exp $
/* ######################################################################
MMap Class - Provides 'real' mmap or a faked mmap using read().
#include <apt-pkg/mmap.h>
#include <apt-pkg/error.h>
+#include <apti18n.h>
+
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
Map = MAP_PRIVATE;
if (iSize == 0)
- return _error->Error("Can't mmap an empty file");
+ return _error->Error(_("Can't mmap an empty file"));
// Map it.
Base = mmap(0,iSize,Prot,Map,Fd.Fd(),0);
if (Base == (void *)-1)
- return _error->Errno("mmap","Couldn't make mmap of %u bytes",iSize);
+ return _error->Errno("mmap",_("Couldn't make mmap of %lu bytes"),iSize);
return true;
}
_error->Warning("Unable to munmap");
iSize = 0;
+ Base = 0;
return true;
}
/*}}}*/
#ifdef _POSIX_SYNCHRONIZED_IO
if ((Flags & ReadOnly) != ReadOnly)
if (msync((char *)Base,iSize,MS_SYNC) != 0)
- return _error->Error("msync","Unable to write mmap");
+ return _error->Errno("msync","Unable to write mmap");
#endif
return true;
}
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->Error("msync","Unable to write mmap");
+ return _error->Errno("msync","Unable to write mmap");
#endif
return true;
}
return;
unsigned long EndOfFile = Fd->Size();
- Fd->Seek(WorkSpace);
- char C = 0;
- Fd->Write(&C,sizeof(C));
+ if (EndOfFile > WorkSpace)
+ WorkSpace = EndOfFile;
+ else
+ {
+ Fd->Seek(WorkSpace);
+ char C = 0;
+ Fd->Write(&C,sizeof(C));
+ }
+
Map(F);
iSize = EndOfFile;
}
return;
Base = new unsigned char[WorkSpace];
+ memset(Base,0,WorkSpace);
iSize = 0;
}
/*}}}*/
}
unsigned long EndOfFile = iSize;
- Sync();
iSize = WorkSpace;
Close(false);
ftruncate(Fd->Fd(),EndOfFile);
- Fd->Close();
}
/*}}}*/
// DynamicMMap::RawAllocate - Allocate a raw chunk of unaligned space /*{{{*/
_error->Error("Dynamic MMap ran out of room");
return 0;
}
+
return Result;
}
/*}}}*/
I->Count--;
unsigned long Result = I->Start;
- I->Start += ItemSize;
+ I->Start += ItemSize;
return Result/ItemSize;
}
/*}}}*/
{
unsigned long Result = iSize;
// Just in case error check
- if (Result > WorkSpace)
+ if (Result + Len > WorkSpace)
{
_error->Error("Dynamic MMap ran out of room");
return 0;
}
- if (Len == 0)
+ if (Len == (unsigned long)-1)
Len = strlen(String);
iSize += Len + 1;
memcpy((char *)Base + Result,String,Len);