summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--storage/connect/maputil.cpp21
1 files changed, 16 insertions, 5 deletions
diff --git a/storage/connect/maputil.cpp b/storage/connect/maputil.cpp
index c068c09b364..dd8f69cc798 100644
--- a/storage/connect/maputil.cpp
+++ b/storage/connect/maputil.cpp
@@ -117,6 +117,7 @@ HANDLE CreateFileMap(PGLOBAL g, LPCSTR fileName,
MEMMAP *mm, MODE mode, bool del)
{
unsigned int openMode;
+ int protmode;
HANDLE fd;
size_t filesize;
struct stat st;
@@ -127,13 +128,16 @@ HANDLE CreateFileMap(PGLOBAL g, LPCSTR fileName,
switch (mode) {
case MODE_READ:
openMode = O_RDONLY;
+ protmode = PROT_READ;
break;
case MODE_UPDATE:
case MODE_DELETE:
openMode = (del) ? (O_RDWR | O_TRUNC) : O_RDWR;
+ protmode = PROT_WRITE;
break;
case MODE_INSERT:
openMode = (O_WRONLY | O_CREAT | O_APPEND);
+ protmode = PROT_WRITE;
break;
default:
sprintf(g->Message, MSG(BAD_FUNC_MODE), "CreateFileMap", mode);
@@ -155,13 +159,20 @@ HANDLE CreateFileMap(PGLOBAL g, LPCSTR fileName,
// Now we are ready to load the file. If mmap() is available we try
// this first. If not available or it failed we try to load it.
- mm->memory = mmap(NULL, filesize, PROT_READ, MAP_PRIVATE, fd, 0);
- mm->lenL = (mm->memory != 0) ? filesize : 0;
- mm->lenH = 0;
+ mm->memory = mmap(NULL, filesize, protmode, MAP_PRIVATE, fd, 0);
+
+ if (mm->memory) {
+ mm->lenL = (mm->memory != 0) ? filesize : 0;
+ mm->lenH = 0;
+ } else {
+ strcpy(g->Message, "Memory mapping failed");
+ return INVALID_HANDLE_VALUE;
+ } endif // memory
+
} /* endif fd */
- // mmap() call was successful. ??????????
- return fd;
+ // mmap() call was successful. ??????????
+ return fd;
} // end of CreateFileMap
bool CloseMemMap(void *memory, size_t dwSize)