forked from enlightenment/efl
* 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 SVN revision: 34775
This commit is contained in:
parent
c51a00a7d3
commit
0fbdc23c40
|
@ -1,3 +1,25 @@
|
|||
2008-06-08 Vincent Torri <doursse at users dot sf dot net>
|
||||
|
||||
* 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
|
||||
|
||||
2008-06-07 Vincent Torri <doursse at users dot sf dot net>
|
||||
|
||||
* src/lib/Evil.h:
|
||||
|
|
|
@ -517,7 +517,7 @@ EAPI const char *evil_tmpdir_get(void);
|
|||
*/
|
||||
EAPI char *evil_getcwd(char *buffer, size_t size);
|
||||
|
||||
#if defined(__CEGCC__) || defined(__MINGW32CE__)
|
||||
#ifdef UNICODE
|
||||
|
||||
/**
|
||||
* @brief Convert a string from char * to wchar_t *.
|
||||
|
@ -557,7 +557,9 @@ EAPI wchar_t *evil_char_to_wchar(const char *text);
|
|||
*/
|
||||
EAPI char *evil_wchar_to_char(const wchar_t *text);
|
||||
|
||||
#endif /* __CEGCC__ || __MINGW32CE__ */
|
||||
#endif /* UNICODE */
|
||||
|
||||
EAPI char *evil_last_error_get(void);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -12,4 +12,3 @@ libevil_la_CFLAGS = @win32_cflags@
|
|||
libevil_la_LIBADD = @win32_libs@
|
||||
libevil_la_DEPENDENCIES = $(top_builddir)/config.h
|
||||
libevil_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@
|
||||
|
||||
|
|
|
@ -25,27 +25,14 @@ static int dl_err_viewed = 0;
|
|||
static void
|
||||
get_last_error(char *desc)
|
||||
{
|
||||
TCHAR *str;
|
||||
char *str2;
|
||||
char *str;
|
||||
int l1;
|
||||
int l2;
|
||||
|
||||
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||||
FORMAT_MESSAGE_FROM_SYSTEM |
|
||||
FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||
NULL, GetLastError(),
|
||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||
(LPTSTR)&str, 0, NULL);
|
||||
|
||||
#if defined(__CEGCC__) || defined(__MINGW32CE__)
|
||||
str2 = evil_wchar_to_char(str);
|
||||
LocalFree(str);
|
||||
#else
|
||||
str2 = str;
|
||||
#endif /* ! __CEGCC__ && ! __MINGW32CE__ */
|
||||
str = evil_last_error_get();
|
||||
|
||||
l1 = strlen(desc);
|
||||
l2 = strlen(str2);
|
||||
l2 = strlen(str);
|
||||
|
||||
if (dl_err)
|
||||
free(dl_err);
|
||||
|
@ -56,10 +43,10 @@ get_last_error(char *desc)
|
|||
else
|
||||
{
|
||||
memcpy(dl_err, desc, l1);
|
||||
memcpy(dl_err + l1, str2, l2);
|
||||
memcpy(dl_err + l1, str, l2);
|
||||
dl_err[l1 + l2] = '\0';
|
||||
}
|
||||
LocalFree(str2);
|
||||
free(str);
|
||||
dl_err_viewed = 0;
|
||||
}
|
||||
|
||||
|
@ -98,7 +85,7 @@ dlopen(const char* path, int mode __UNUSED__)
|
|||
else
|
||||
new_path[i] = path[i];
|
||||
}
|
||||
#if defined(__CEGCC__) || defined(__MINGW32CE__)
|
||||
#ifdef UNICODE
|
||||
{
|
||||
wchar_t *wpath;
|
||||
|
||||
|
@ -109,7 +96,7 @@ dlopen(const char* path, int mode __UNUSED__)
|
|||
#else
|
||||
module = LoadLibraryEx(new_path, NULL,
|
||||
LOAD_WITH_ALTERED_SEARCH_PATH);
|
||||
#endif /* ! __CEGCC__ && ! __MINGW32CE__ */
|
||||
#endif /* ! UNICODE */
|
||||
if (!module)
|
||||
get_last_error("LoadLibraryEx returned: ");
|
||||
|
||||
|
@ -136,7 +123,7 @@ dlsym(void *handle, const char *symbol)
|
|||
{
|
||||
FARPROC fp;
|
||||
|
||||
#if defined(__CEGCC__) || defined(__MINGW32CE__)
|
||||
#ifdef UNICODE
|
||||
{
|
||||
wchar_t *wsymbol;
|
||||
|
||||
|
@ -146,7 +133,7 @@ dlsym(void *handle, const char *symbol)
|
|||
}
|
||||
#else
|
||||
fp = GetProcAddress(handle, symbol);
|
||||
#endif /* ! __CEGCC__ && ! __MINGW32CE__ */
|
||||
#endif /* ! UNICODE */
|
||||
if (!fp)
|
||||
get_last_error("GetProcAddress returned: ");
|
||||
|
||||
|
@ -169,11 +156,11 @@ dladdr (void *addr __UNUSED__, Dl_info *info)
|
|||
if (!ret)
|
||||
return 0;
|
||||
|
||||
#if defined(__CEGCC__) || defined(__MINGW32CE__)
|
||||
#ifdef UNICODE
|
||||
path = evil_wchar_to_char(tpath);
|
||||
#else
|
||||
path = tpath;
|
||||
#endif /* ! __CEGCC__ && ! __MINGW32CE__ */
|
||||
#endif /* ! UNICODE */
|
||||
|
||||
length = strlen (path);
|
||||
if (length >= PATH_MAX)
|
||||
|
@ -195,9 +182,9 @@ dladdr (void *addr __UNUSED__, Dl_info *info)
|
|||
info->dli_sname = NULL;
|
||||
info->dli_saddr = NULL;
|
||||
|
||||
#if defined(__CEGCC__) || defined(__MINGW32CE__)
|
||||
#ifdef UNICODE
|
||||
free (path);
|
||||
#endif /* __CEGCC__ || __MINGW32CE__ */
|
||||
#endif /* ! UNICODE */
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -15,9 +15,9 @@
|
|||
# include <sys/syslimits.h>
|
||||
#endif /* __CEGCC__ */
|
||||
|
||||
#if defined(__CEGCC__) || defined(__MINGW32CE__)
|
||||
#ifdef UNICODE
|
||||
# include <wchar.h>
|
||||
#endif /* __CEGCC__ || __MINGW32CE__ */
|
||||
#endif /* UNICODE */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/timeb.h>
|
||||
|
@ -497,7 +497,7 @@ evil_getcwd(char *buffer, size_t size)
|
|||
#endif /* ! __CEGCC__ && ! __MINGW32CE__ */
|
||||
}
|
||||
|
||||
#if defined(__CEGCC__) || defined(__MINGW32CE__)
|
||||
#ifdef UNICODE
|
||||
|
||||
wchar_t *
|
||||
evil_char_to_wchar(const char *text)
|
||||
|
@ -541,4 +541,34 @@ evil_wchar_to_char(const wchar_t *text)
|
|||
return atext;
|
||||
}
|
||||
|
||||
#endif /* __CEGCC__ || __MINGW32CE__ */
|
||||
#endif /* UNICODE */
|
||||
|
||||
char *
|
||||
evil_last_error_get(void)
|
||||
{
|
||||
char str[PATH_MAX];
|
||||
LPTSTR str1;
|
||||
char *str2;
|
||||
DWORD err;
|
||||
|
||||
err = GetLastError();
|
||||
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||
NULL,
|
||||
err,
|
||||
0, // Default language
|
||||
(LPTSTR)&str1,
|
||||
0,
|
||||
NULL);
|
||||
|
||||
#ifdef UNICODE
|
||||
str2 = evil_wchar_to_char(str1);
|
||||
LocalFree(str1);
|
||||
#else
|
||||
str2 = str1;
|
||||
#endif /* ! UNICODE */
|
||||
|
||||
snprintf(str, PATH_MAX, "(%ld) %s", err, str2);
|
||||
LocalFree(str2);
|
||||
|
||||
return strdup(str);
|
||||
}
|
||||
|
|
|
@ -7,5 +7,6 @@ nobase_include_HEADERS = sys/mman.h
|
|||
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@
|
||||
|
|
|
@ -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 @@ mmap(void *addr __UNUSED__,
|
|||
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;
|
||||
|
||||
if (prot & PROT_EXEC)
|
||||
os_version.dwOSVersionInfoSize = sizeof(os_version);
|
||||
if (!GetVersionEx(&os_version))
|
||||
{
|
||||
if (prot & PROT_READ)
|
||||
char *str;
|
||||
|
||||
str = evil_last_error_get();
|
||||
fprintf(stderr, "[Evil] [mmap] GetVersionEx failed: %s\n", str);
|
||||
free(str);
|
||||
|
||||
return MAP_FAILED;
|
||||
}
|
||||
|
||||
if ((os_version.dwPlatformId == VER_PLATFORM_WIN32_CE) &&
|
||||
(os_version.dwMajorVersion < 5))
|
||||
{
|
||||
size_t size;
|
||||
|
||||
data = malloc(len);
|
||||
if (!data)
|
||||
{
|
||||
if (prot & PROT_WRITE)
|
||||
protect = PAGE_EXECUTE_READWRITE;
|
||||
fprintf (stderr, "[Evil] [mmap] malloc failed\n");
|
||||
return MAP_FAILED;
|
||||
}
|
||||
|
||||
size = read(fd, data, len);
|
||||
if (size != len)
|
||||
{
|
||||
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
|
||||
{
|
||||
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_READ)
|
||||
{
|
||||
if (prot & PROT_WRITE)
|
||||
protect = PAGE_EXECUTE_READWRITE;
|
||||
else
|
||||
protect = PAGE_EXECUTE_READ;
|
||||
}
|
||||
else
|
||||
protect = PAGE_EXECUTE_READ;
|
||||
{
|
||||
if (prot & PROT_WRITE)
|
||||
protect = PAGE_EXECUTE_WRITECOPY;
|
||||
else
|
||||
protect = PAGE_EXECUTE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (prot & PROT_WRITE)
|
||||
protect = PAGE_EXECUTE_WRITECOPY;
|
||||
else
|
||||
protect = PAGE_EXECUTE;
|
||||
if (prot & PROT_READ)
|
||||
{
|
||||
if (prot & PROT_WRITE)
|
||||
protect = PAGE_READWRITE;
|
||||
else
|
||||
protect = PAGE_READONLY;
|
||||
}
|
||||
else if (prot & PROT_WRITE)
|
||||
protect = PAGE_WRITECOPY;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (prot & PROT_READ)
|
||||
|
||||
handle = (HANDLE)_get_osfhandle(fd);
|
||||
if (handle == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
if (prot & PROT_WRITE)
|
||||
protect = PAGE_READWRITE;
|
||||
else
|
||||
protect = PAGE_READONLY;
|
||||
fprintf(stderr, "[Evil] [mmap] _get_osfhandle failed\n");
|
||||
|
||||
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;
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
#endif
|
||||
if (protect & (PAGE_READWRITE | PAGE_READONLY))
|
||||
access = FILE_MAP_READ;
|
||||
else
|
||||
{
|
||||
if (protect & PAGE_READWRITE)
|
||||
access = FILE_MAP_WRITE;
|
||||
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;
|
||||
#endif
|
||||
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);
|
||||
|
||||
if (!data)
|
||||
{
|
||||
char *str;
|
||||
|
||||
str = evil_last_error_get();
|
||||
fprintf(stderr, "[Evil] [mmap] MapViewOfFile failed: %s\n", str);
|
||||
free(str);
|
||||
|
||||
return MAP_FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
data = MapViewOfFile(fm,
|
||||
access,
|
||||
offset & 0xffff0000,
|
||||
offset & 0x0000ffff,
|
||||
len);
|
||||
CloseHandle(fm);
|
||||
|
||||
if (!data) return (void *)~0;
|
||||
else return data;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue