diff --git a/Docs/src/history.but b/Docs/src/history.but index c9aa8bd5..92fae35b 100644 --- a/Docs/src/history.but +++ b/Docs/src/history.but @@ -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 diff --git a/Source/util.cpp b/Source/util.cpp index 133042ce..94461453 100644 --- a/Source/util.cpp +++ b/Source/util.cpp @@ -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 +#include +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 }