Commit 85423c6a authored by Alexandre Julliard's avatar Alexandre Julliard

Added new library.h header for libwine definitions.

Added getpagesize() and wine_anon_mmap() portability functions.
parent 8d1462b6
/*
* Definitions for the Wine library
*
* Copyright 2000 Alexandre Julliard
*/
#ifndef __WINE_WINE_LIBRARY_H
#define __WINE_WINE_LIBRARY_H
#include <sys/types.h>
/* dll loading */
struct _IMAGE_NT_HEADERS;
typedef void (*load_dll_callback_t)( const struct _IMAGE_NT_HEADERS *, const char * );
extern void wine_dll_set_callback( load_dll_callback_t load );
extern void *wine_dll_load( const char *filename );
extern void wine_dll_unload( void *handle );
/* debugging */
extern void wine_dbg_add_option( const char *name, unsigned char set, unsigned char clear );
/* portability */
extern void *wine_anon_mmap( void *start, size_t size, int prot, int flags );
#endif /* __WINE_WINE_LIBRARY_H */
...@@ -77,6 +77,10 @@ int getsockopt(int socket, int level, int option_name, void *option_value, size_ ...@@ -77,6 +77,10 @@ int getsockopt(int socket, int level, int option_name, void *option_value, size_
void *memmove(void *dest, const void *src, unsigned int len); void *memmove(void *dest, const void *src, unsigned int len);
#endif /* !defined(HAVE_MEMMOVE) */ #endif /* !defined(HAVE_MEMMOVE) */
#ifndef HAVE_GETPAGESIZE
size_t getpagesize(void);
#endif /* HAVE_GETPAGESIZE */
#ifndef HAVE_INET_NETWORK #ifndef HAVE_INET_NETWORK
unsigned long inet_network(const char *cp); unsigned long inet_network(const char *cp);
#endif /* !defined(HAVE_INET_NETWORK) */ #endif /* !defined(HAVE_INET_NETWORK) */
......
...@@ -23,6 +23,9 @@ ...@@ -23,6 +23,9 @@
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <termios.h> #include <termios.h>
#ifdef HAVE_SYS_MMAN_H
#include <sys/mman.h>
#endif
#ifdef HAVE_LIBIO_H #ifdef HAVE_LIBIO_H
# include <libio.h> # include <libio.h>
#endif #endif
...@@ -103,6 +106,22 @@ const char *strerror( int err ) ...@@ -103,6 +106,22 @@ const char *strerror( int err )
} }
#endif /* HAVE_STRERROR */ #endif /* HAVE_STRERROR */
/***********************************************************************
* getpagesize
*/
#ifndef HAVE_GETPAGESIZE
size_t getpagesize(void)
{
# ifdef __svr4__
return sysconf(_SC_PAGESIZE);
# else
# error Cannot get the page size on this platform
# endif
}
#endif /* HAVE_GETPAGESIZE */
/*********************************************************************** /***********************************************************************
* clone * clone
*/ */
...@@ -339,3 +358,35 @@ int statfs(const char *name, struct statfs *info) ...@@ -339,3 +358,35 @@ int statfs(const char *name, struct statfs *info)
#endif /* defined(__BEOS__) */ #endif /* defined(__BEOS__) */
} }
#endif /* !defined(HAVE_STATFS) */ #endif /* !defined(HAVE_STATFS) */
/***********************************************************************
* wine_anon_mmap
*
* Portable wrapper for anonymous mmaps
*/
void *wine_anon_mmap( void *start, size_t size, int prot, int flags )
{
static int fdzero = -1;
#ifdef MAP_ANON
flags |= MAP_ANON;
#else
if (fdzero == -1)
{
if ((fdzero = open( "/dev/zero", O_RDONLY )) == -1)
{
perror( "/dev/zero: open" );
exit(1);
}
}
#endif /* MAP_ANON */
/* Linux EINVAL's on us if we don't pass MAP_PRIVATE to an anon mmap */
#ifdef MAP_SHARED
flags &= ~MAP_SHARED;
#endif
#ifdef MAP_PRIVATE
flags |= MAP_PRIVATE;
#endif
return mmap( start, size, prot, flags, fdzero, 0 );
}
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
#include "winbase.h" #include "winbase.h"
#include "wine/exception.h" #include "wine/exception.h"
#include "wine/unicode.h" #include "wine/unicode.h"
#include "wine/library.h"
#include "wine/port.h"
#include "winerror.h" #include "winerror.h"
#include "file.h" #include "file.h"
#include "process.h" #include "process.h"
...@@ -433,10 +435,10 @@ static LPVOID map_image( HANDLE hmapping, int fd, char *base, DWORD total_size, ...@@ -433,10 +435,10 @@ static LPVOID map_image( HANDLE hmapping, int fd, char *base, DWORD total_size,
/* zero-map the whole range */ /* zero-map the whole range */
if ((ptr = VIRTUAL_mmap( -1, base, total_size, 0, if ((ptr = wine_anon_mmap( base, total_size,
PROT_READ | PROT_WRITE | PROT_EXEC, 0 )) == (char *)-1) PROT_READ | PROT_WRITE | PROT_EXEC, 0 )) == (char *)-1)
{ {
ptr = VIRTUAL_mmap( -1, NULL, total_size, 0, ptr = wine_anon_mmap( NULL, total_size,
PROT_READ | PROT_WRITE | PROT_EXEC, 0 ); PROT_READ | PROT_WRITE | PROT_EXEC, 0 );
if (ptr == (char *)-1) if (ptr == (char *)-1)
{ {
...@@ -580,15 +582,7 @@ static LPVOID map_image( HANDLE hmapping, int fd, char *base, DWORD total_size, ...@@ -580,15 +582,7 @@ static LPVOID map_image( HANDLE hmapping, int fd, char *base, DWORD total_size,
#ifndef page_mask #ifndef page_mask
DECL_GLOBAL_CONSTRUCTOR(VIRTUAL_Init) DECL_GLOBAL_CONSTRUCTOR(VIRTUAL_Init)
{ {
# ifdef HAVE_GETPAGESIZE
page_size = getpagesize(); page_size = getpagesize();
# else
# ifdef __svr4__
page_size = sysconf(_SC_PAGESIZE);
# else
# error Cannot get the page size on this platform
# endif
# endif
page_mask = page_size - 1; page_mask = page_size - 1;
/* Make sure we have a power of 2 */ /* Make sure we have a power of 2 */
assert( !(page_size & page_mask) ); assert( !(page_size & page_mask) );
...@@ -668,39 +662,13 @@ DWORD VIRTUAL_HandleFault( LPCVOID addr ) ...@@ -668,39 +662,13 @@ DWORD VIRTUAL_HandleFault( LPCVOID addr )
* Wrapper for mmap() that handles anonymous mappings portably, * Wrapper for mmap() that handles anonymous mappings portably,
* and falls back to read if mmap of a file fails. * and falls back to read if mmap of a file fails.
*/ */
LPVOID VIRTUAL_mmap( int unix_handle, LPVOID start, DWORD size, LPVOID VIRTUAL_mmap( int fd, LPVOID start, DWORD size,
DWORD offset, int prot, int flags ) DWORD offset, int prot, int flags )
{ {
int fd = -1;
int pos; int pos;
LPVOID ret; LPVOID ret;
if (unix_handle == -1) if (fd == -1) return wine_anon_mmap( start, size, prot, flags );
{
#ifdef MAP_ANON
flags |= MAP_ANON;
#else
static int fdzero = -1;
if (fdzero == -1)
{
if ((fdzero = open( "/dev/zero", O_RDONLY )) == -1)
{
perror( "/dev/zero: open" );
ExitProcess(1);
}
}
fd = fdzero;
#endif /* MAP_ANON */
/* Linux EINVAL's on us if we don't pass MAP_PRIVATE to an anon mmap */
#ifdef MAP_SHARED
flags &= ~MAP_SHARED;
#endif
#ifdef MAP_PRIVATE
flags |= MAP_PRIVATE;
#endif
}
else fd = unix_handle;
if ((ret = mmap( start, size, prot, flags, fd, offset )) != (LPVOID)-1) if ((ret = mmap( start, size, prot, flags, fd, offset )) != (LPVOID)-1)
return ret; return ret;
...@@ -709,7 +677,6 @@ LPVOID VIRTUAL_mmap( int unix_handle, LPVOID start, DWORD size, ...@@ -709,7 +677,6 @@ LPVOID VIRTUAL_mmap( int unix_handle, LPVOID start, DWORD size,
/* page-aligned (EINVAL), or because the underlying filesystem */ /* page-aligned (EINVAL), or because the underlying filesystem */
/* does not support mmap() (ENOEXEC,ENODEV), we do it by hand. */ /* does not support mmap() (ENOEXEC,ENODEV), we do it by hand. */
if (unix_handle == -1) return ret;
if ((errno != ENOEXEC) && (errno != EINVAL) && (errno != ENODEV)) return ret; if ((errno != ENOEXEC) && (errno != EINVAL) && (errno != ENODEV)) return ret;
if (prot & PROT_WRITE) if (prot & PROT_WRITE)
{ {
...@@ -723,7 +690,7 @@ LPVOID VIRTUAL_mmap( int unix_handle, LPVOID start, DWORD size, ...@@ -723,7 +690,7 @@ LPVOID VIRTUAL_mmap( int unix_handle, LPVOID start, DWORD size,
} }
/* Reserve the memory with an anonymous mmap */ /* Reserve the memory with an anonymous mmap */
ret = VIRTUAL_mmap( -1, start, size, 0, PROT_READ | PROT_WRITE, flags ); ret = wine_anon_mmap( start, size, PROT_READ | PROT_WRITE, flags );
if (ret == (LPVOID)-1) return ret; if (ret == (LPVOID)-1) return ret;
/* Now read in the file */ /* Now read in the file */
if ((pos = lseek( fd, offset, SEEK_SET )) == -1) if ((pos = lseek( fd, offset, SEEK_SET )) == -1)
...@@ -814,8 +781,7 @@ LPVOID WINAPI VirtualAlloc( ...@@ -814,8 +781,7 @@ LPVOID WINAPI VirtualAlloc(
if (type & MEM_SYSTEM) if (type & MEM_SYSTEM)
ptr = base; ptr = base;
else else
ptr = (UINT)VIRTUAL_mmap( -1, (LPVOID)base, view_size, 0, ptr = (UINT)wine_anon_mmap( (LPVOID)base, view_size, VIRTUAL_GetUnixProt( vprot ), 0 );
VIRTUAL_GetUnixProt( vprot ), 0 );
if (ptr == (UINT)-1) if (ptr == (UINT)-1)
{ {
SetLastError( ERROR_OUTOFMEMORY ); SetLastError( ERROR_OUTOFMEMORY );
...@@ -941,8 +907,7 @@ BOOL WINAPI VirtualFree( ...@@ -941,8 +907,7 @@ BOOL WINAPI VirtualFree(
/* Decommit the pages by remapping zero-pages instead */ /* Decommit the pages by remapping zero-pages instead */
if (VIRTUAL_mmap( -1, (LPVOID)base, size, 0, VIRTUAL_GetUnixProt( 0 ), if (wine_anon_mmap( (LPVOID)base, size, VIRTUAL_GetUnixProt(0), MAP_FIXED ) != (LPVOID)base)
MAP_FIXED ) != (LPVOID)base)
ERR( "Could not remap pages, expect trouble\n" ); ERR( "Could not remap pages, expect trouble\n" );
return VIRTUAL_SetProt( view, base, size, 0 ); return VIRTUAL_SetProt( view, base, size, 0 );
} }
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <stdlib.h> #include <stdlib.h>
#include "winbase.h" #include "winbase.h"
#include "wine/library.h"
#include "main.h" #include "main.h"
#include "options.h" #include "options.h"
#include "version.h" #include "version.h"
...@@ -160,7 +161,6 @@ static void do_config( const char *arg ) ...@@ -160,7 +161,6 @@ static void do_config( const char *arg )
static void do_debugmsg( const char *arg ) static void do_debugmsg( const char *arg )
{ {
extern void wine_dbg_add_option( const char *name, unsigned char set, unsigned char clear );
static const char * const debug_class_names[__DBCL_COUNT] = { "fixme", "err", "warn", "trace" }; static const char * const debug_class_names[__DBCL_COUNT] = { "fixme", "err", "warn", "trace" };
char *opt, *options = strdup(arg); char *opt, *options = strdup(arg);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment