Added POSIX mmap helper function used by VxD parser (patch #284)
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6935 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
b4b709769e
commit
636d774750
2 changed files with 27 additions and 5 deletions
|
@ -16,7 +16,7 @@ Released on ??? ??rd, 20??
|
|||
|
||||
\b Added \R{ppgettlbversion}{!gettlbversion}
|
||||
|
||||
\b \R{library}{Library} TLB version support on POSIX
|
||||
\b \R{library}{Library} TLB and VxD version support on POSIX (\W{http://sf.net/p/nsis/patches/284}{patch #284})
|
||||
|
||||
\S2{} Minor Changes
|
||||
|
||||
|
|
|
@ -58,11 +58,12 @@ using namespace std;
|
|||
extern int g_display_errors;
|
||||
extern FILE *g_output, *g_errout;
|
||||
|
||||
|
||||
#ifdef _WIN32
|
||||
static char* CreateMappedFileView(LPCTSTR szFile, DWORD FAccess, DWORD FShare, DWORD FMode, DWORD PProtect, DWORD MAccess)
|
||||
static char* CreateMappedFileView(LPCTSTR Path, DWORD FAccess, DWORD FShare, DWORD FMode, DWORD PProtect, DWORD MAccess)
|
||||
{
|
||||
char *pView = NULL, restoreGLE = false;
|
||||
HANDLE hFile = CreateFile(szFile, FAccess, FShare, NULL, FMode, 0, NULL);
|
||||
HANDLE hFile = CreateFile(Path, FAccess, FShare, NULL, FMode, 0, NULL);
|
||||
if (hFile == INVALID_HANDLE_VALUE) return pView;
|
||||
HANDLE hMap = CreateFileMapping(hFile, NULL, PProtect, 0, 0, NULL);
|
||||
if (hMap != INVALID_HANDLE_VALUE)
|
||||
|
@ -87,6 +88,27 @@ static char* CreateMappedFileView(LPCTSTR szFile, DWORD FAccess, DWORD FShare, D
|
|||
}
|
||||
return pView;
|
||||
}
|
||||
#else
|
||||
#include <sys/stat.h>
|
||||
#include <sys/mman.h>
|
||||
static char* CreateMappedFileView(const TCHAR *Path, const char *FMode, int PProtect, int MFlags, size_t &FSize)
|
||||
{
|
||||
char *pView = NULL;
|
||||
FILE *pFile = FOPEN(Path, FMode);
|
||||
if (pFile)
|
||||
{
|
||||
struct stat fs;
|
||||
int fd = fileno(pFile), toobig;
|
||||
if (-1 != fd && 0 == fstat(fd, &fs))
|
||||
{
|
||||
FSize = (size_t) fs.st_size, toobig = sizeof(size_t) < sizeof(fs.st_size) && (INT64)FSize != fs.st_size;
|
||||
void *p = !toobig ? mmap(NULL, FSize, PProtect, MFlags, fd, 0) : MAP_FAILED;
|
||||
if (p != MAP_FAILED) pView = (char*) p;
|
||||
}
|
||||
fclose(pFile);
|
||||
}
|
||||
return pView;
|
||||
}
|
||||
#endif //~ _WIN32
|
||||
|
||||
|
||||
|
@ -706,7 +728,7 @@ void close_file_view(FILEVIEW&mmfv)
|
|||
#ifdef _WIN32
|
||||
if (mmfv.base) UnmapViewOfFile(mmfv.base);
|
||||
#else
|
||||
// TODO
|
||||
if (mmfv.base) munmap(mmfv.base, mmfv.internal);
|
||||
#endif
|
||||
}
|
||||
char* create_file_view_readonly(const TCHAR *filepath, FILEVIEW&mmfv)
|
||||
|
@ -714,7 +736,7 @@ char* create_file_view_readonly(const TCHAR *filepath, FILEVIEW&mmfv)
|
|||
#ifdef _WIN32
|
||||
return mmfv.base = CreateMappedFileView(filepath, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, PAGE_READONLY, FILE_MAP_READ);
|
||||
#else
|
||||
return 0; // TODO
|
||||
return mmfv.base = CreateMappedFileView(filepath, "rb", PROT_READ, MAP_SHARED, mmfv.internal);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue