Enlightenment CVS committal
Author : doursse
Project : e17
Module : proto/evil
Dir : e17/proto/evil/src/lib/mman
Modified Files:
mman.c Makefile.am
Log Message:
* src/lib/Evil.h:
* src/lib/evil.c: (evil_last_error_get):
add evil_last_error_get() function to get
useful error string creation.
* src/lib/dlfcn/dlfcn.c: (get_last_error), (dlopen), (dlsym),
(dladdr):
use UNICODE check instead of compiler checks when needed.
use evil_last_error_get()
* src/lib/mman/mman.c: (mmap), (munmap):
file mapping does not work on Windows CE < 5.0.
if it is the case, just read the file and return
the data.
use evil_last_error_get()
* src/lib/mman/Makefile.am:
* src/lib/Makefile.am:
add libevil dependancy
===================================================================
RCS file: /cvs/e/e17/proto/evil/src/lib/mman/mman.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- mman.c 26 Apr 2008 16:27:46 -0000 1.5
+++ mman.c 8 Jun 2008 21:39:49 -0000 1.6
@@ -1,4 +1,6 @@
+#include <stdio.h>
#include <sys/types.h>
+#include <unistd.h>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
@@ -8,6 +10,8 @@
# include <io.h>
#endif /* ! __CEGCC__ */
+#include "../Evil.h"
+
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif /* HAVE_CONFIG_H */
@@ -21,13 +25,15 @@
#endif /* HAVE___ATTRIBUTE__ */
#if defined(__CEGCC__)
-# define CreateFileMapping CreateFileMappingW
# define _get_osfhandle get_osfhandle
# elif defined (__MINGW32CE__)
# define _get_osfhandle(FILEDES) ((long)FILEDES)
#endif /* ! __CEGCC__ && ! __MINGW32CE__ */
+/***** API *****/
+
+
void *
mmap(void *addr __UNUSED__,
size_t len,
@@ -36,86 +42,187 @@
int fd,
off_t offset)
{
+ OSVERSIONINFO os_version;
void *data;
- HANDLE fm;
- DWORD protect = PAGE_NOACCESS;
- DWORD access = 0;
- /* support only MAP_SHARED */
- if (!(flags & MAP_SHARED)) return (void *)~0;
+ os_version.dwOSVersionInfoSize = sizeof(os_version);
+ if (!GetVersionEx(&os_version))
+ {
+ char *str;
+
+ str = evil_last_error_get();
+ fprintf(stderr, "[Evil] [mmap] GetVersionEx failed: %s\n", str);
+ free(str);
+
+ return MAP_FAILED;
+ }
- if (prot & PROT_EXEC)
+ if ((os_version.dwPlatformId == VER_PLATFORM_WIN32_CE) &&
+ (os_version.dwMajorVersion < 5))
{
- if (prot & PROT_READ)
+ size_t size;
+
+ data = malloc(len);
+ if (!data)
{
- if (prot & PROT_WRITE)
- protect = PAGE_EXECUTE_READWRITE;
- else
- protect = PAGE_EXECUTE_READ;
+ fprintf (stderr, "[Evil] [mmap] malloc failed\n");
+ return MAP_FAILED;
}
- else
+
+ size = read(fd, data, len);
+ if (size != len)
{
- if (prot & PROT_WRITE)
- protect = PAGE_EXECUTE_WRITECOPY;
- else
- protect = PAGE_EXECUTE;
+ fprintf (stderr, "[Evil] [mmap] read failed\n");
+ free(data);
+ return MAP_FAILED;
+ }
+
+ if (lseek(fd, 0, SEEK_SET) == -1)
+ {
+ fprintf (stderr, "[Evil] [mmap] lseek failed\n");
+ free(data);
+ return MAP_FAILED;
}
}
else
{
- if (prot & PROT_READ)
+ HANDLE fm;
+ DWORD protect = PAGE_NOACCESS;
+ DWORD access = 0;
+ HANDLE handle;
+
+ /* support only MAP_SHARED */
+ if (!(flags & MAP_SHARED))
+ return MAP_FAILED;
+
+ if (prot & PROT_EXEC)
{
- if (prot & PROT_WRITE)
- protect = PAGE_READWRITE;
+ if (prot & PROT_READ)
+ {
+ if (prot & PROT_WRITE)
+ protect = PAGE_EXECUTE_READWRITE;
+ else
+ protect = PAGE_EXECUTE_READ;
+ }
else
- protect = PAGE_READONLY;
+ {
+ if (prot & PROT_WRITE)
+ protect = PAGE_EXECUTE_WRITECOPY;
+ else
+ protect = PAGE_EXECUTE;
+ }
+ }
+ else
+ {
+ if (prot & PROT_READ)
+ {
+ if (prot & PROT_WRITE)
+ protect = PAGE_READWRITE;
+ else
+ protect = PAGE_READONLY;
+ }
+ else if (prot & PROT_WRITE)
+ protect = PAGE_WRITECOPY;
+ }
+
+ handle = (HANDLE)_get_osfhandle(fd);
+ if (handle == INVALID_HANDLE_VALUE)
+ {
+ fprintf(stderr, "[Evil] [mmap] _get_osfhandle failed\n");
+
+ return MAP_FAILED;
+ }
+
+ fm = CreateFileMapping(handle, NULL, protect, 0, 0, NULL);
+ if (!fm)
+ {
+ char *str;
+
+ str = evil_last_error_get();
+ fprintf(stderr, "[Evil] [mmap] CreateFileMapping failed: %s\n",
str);
+ free(str);
+
+ return MAP_FAILED;
}
- else if (prot & PROT_WRITE)
- protect = PAGE_WRITECOPY;
- }
- fm = CreateFileMapping((HANDLE)_get_osfhandle (fd),
- NULL,
- protect,
- 0,
- 0,
- NULL);
- if (!fm) return (void *)~0;
-
- if (protect & PAGE_READWRITE)
- access = FILE_MAP_ALL_ACCESS;
- if (protect & PAGE_WRITECOPY)
- access = FILE_MAP_COPY;
+ if (protect & PAGE_READWRITE)
+ access = FILE_MAP_ALL_ACCESS;
+ if (protect & PAGE_WRITECOPY)
+ access = FILE_MAP_COPY;
#if 0
- if (protect & (PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_READ))
- access = FILE_MAP_EXECUTE;
+ if (protect & (PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_READ))
+ access = FILE_MAP_EXECUTE;
#endif
- if (protect & (PAGE_READWRITE | PAGE_READONLY))
- access = FILE_MAP_READ;
- else
- {
- if (protect & PAGE_READWRITE)
- access = FILE_MAP_WRITE;
- }
+ if (protect & (PAGE_READWRITE | PAGE_READONLY))
+ access = FILE_MAP_READ;
+ else
+ {
+ if (protect & PAGE_READWRITE)
+ access = FILE_MAP_WRITE;
+ }
- data = MapViewOfFile(fm,
- access,
- offset & 0xffff0000,
- offset & 0x0000ffff,
- len);
- CloseHandle(fm);
+ data = MapViewOfFile(fm,
+ access,
+ offset & 0xffff0000,
+ offset & 0x0000ffff,
+ len);
+ CloseHandle(fm);
- if (!data) return (void *)~0;
- else return data;
+ if (!data)
+ {
+ char *str;
+
+ str = evil_last_error_get();
+ fprintf(stderr, "[Evil] [mmap] MapViewOfFile failed: %s\n", str);
+ free(str);
+
+ return MAP_FAILED;
+ }
+ }
+
+ return data;
}
int
munmap(void *addr,
size_t len __UNUSED__)
{
- BOOL res;
+ OSVERSIONINFO os_version;
- res = UnmapViewOfFile(addr);
+ os_version.dwOSVersionInfoSize = sizeof(os_version);
+ if (!GetVersionEx(&os_version))
+ {
+ char *str;
- return (res == 0) ? -1 : 0;
+ str = evil_last_error_get();
+ fprintf(stderr, "[Evil] [munmap] GetVersionEx failed: %s\n", str);
+ free(str);
+
+ return -1;
+ }
+
+ if ((os_version.dwPlatformId == VER_PLATFORM_WIN32_CE) &&
+ (os_version.dwMajorVersion < 5))
+ {
+ if (addr && (addr != MAP_FAILED))
+ free(addr);
+
+ return 0;
+ }
+ else
+ {
+ BOOL res;
+
+ res = UnmapViewOfFile(addr);
+ if (!res)
+ {
+ char *str;
+
+ str = evil_last_error_get();
+ fprintf(stderr, "[Evil] [munmap] UnmapViewOfFile failed: %s\n",
str);
+ free(str);
+ }
+
+ return (res == 0) ? -1 : 0;
+ }
}
===================================================================
RCS file: /cvs/e/e17/proto/evil/src/lib/mman/Makefile.am,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- Makefile.am 26 Apr 2008 16:27:46 -0000 1.3
+++ Makefile.am 8 Jun 2008 21:39:49 -0000 1.4
@@ -7,5 +7,6 @@
libmman_la_SOURCES = mman.c
libmman_la_CFLAGS = @win32_cflags@
-libmman_la_DEPENDENCIES = $(top_builddir)/config.h
+libmman_la_LIBADD = $(top_builddir)/src/lib/libevil.la
+libmman_la_DEPENDENCIES = $(top_builddir)/config.h
$(top_builddir)/src/lib/libevil.la
libmman_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info
@version_info@
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
enlightenment-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs