X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=support%2Fsys-mman.c;h=3973bd6614f7199b3e4585bbf367c89301219a64;hb=17078213cec92f9c30523dfc051d68a00a740225;hp=57b4e08c73554b669967452c5128b6982c3e8c1c;hpb=6b6435d1b3206b0162c37e5ecce8d9a699fe6467;p=mono.git diff --git a/support/sys-mman.c b/support/sys-mman.c index 57b4e08c735..3973bd6614f 100644 --- a/support/sys-mman.c +++ b/support/sys-mman.c @@ -4,10 +4,23 @@ * Authors: * Jonathan Pryor (jonpryor@vt.edu) * - * Copyright (C) 2004 Jonathan Pryor + * Copyright (C) 2004-2006 Jonathan Pryor */ +#include + +#ifndef __OpenBSD__ #define _XOPEN_SOURCE 600 +#endif + +#ifdef PLATFORM_MACOSX +/* For mincore () */ +#define _DARWIN_C_SOURCE +#endif +#ifdef __FreeBSD__ +/* For mincore () */ +#define __BSD_VISIBLE 1 +#endif #include #include @@ -18,6 +31,97 @@ G_BEGIN_DECLS +void* +Mono_Posix_Syscall_mmap (void *start, mph_size_t length, int prot, int flags, + int fd, mph_off_t offset) +{ + int _prot, _flags; + + mph_return_val_if_size_t_overflow (length, MAP_FAILED); + mph_return_val_if_off_t_overflow (offset, MAP_FAILED); + + if (Mono_Posix_FromMmapProts (prot, &_prot) == -1) + return MAP_FAILED; + if (Mono_Posix_FromMmapFlags (flags, &_flags) == -1) + return MAP_FAILED; + + return mmap (start, (size_t) length, _prot, _flags, fd, (off_t) offset); +} + +int +Mono_Posix_Syscall_munmap (void *start, mph_size_t length) +{ + mph_return_if_size_t_overflow (length); + + return munmap (start, (size_t) length); +} + +int +Mono_Posix_Syscall_mprotect (void *start, mph_size_t len, int prot) +{ + int _prot; + mph_return_if_size_t_overflow (len); + + if (Mono_Posix_FromMmapProts (prot, &_prot) == -1) + return -1; + + return mprotect (start, (size_t) len, _prot); +} + +int +Mono_Posix_Syscall_msync (void *start, mph_size_t len, int flags) +{ + int _flags; + mph_return_if_size_t_overflow (len); + + if (Mono_Posix_FromMsyncFlags (flags, &_flags) == -1) + return -1; + + return msync (start, (size_t) len, _flags); +} + +int +Mono_Posix_Syscall_mlock (void *start, mph_size_t len) +{ + mph_return_if_size_t_overflow (len); + + return mlock (start, (size_t) len); +} + +int +Mono_Posix_Syscall_munlock (void *start, mph_size_t len) +{ + mph_return_if_size_t_overflow (len); + + return munlock (start, (size_t) len); +} + +#ifdef HAVE_MREMAP +void* +Mono_Posix_Syscall_mremap (void *old_address, mph_size_t old_size, + mph_size_t new_size, guint64 flags) +{ + guint64 _flags; + + mph_return_val_if_size_t_overflow (old_size, MAP_FAILED); + mph_return_val_if_size_t_overflow (new_size, MAP_FAILED); + + if (Mono_Posix_FromMremapFlags (flags, &_flags) == -1) + return MAP_FAILED; + + return mremap (old_address, (size_t) old_size, (size_t) new_size, + (unsigned long) _flags); +} +#endif /* def HAVE_MREMAP */ + +int +Mono_Posix_Syscall_mincore (void *start, mph_size_t length, unsigned char *vec) +{ + mph_return_if_size_t_overflow (length); + + return mincore (start, (size_t) length, (void*)vec); +} + #ifdef HAVE_POSIX_MADVISE gint32 Mono_Posix_Syscall_posix_madvise (void *addr, mph_size_t len, gint32 advice) @@ -31,6 +135,25 @@ Mono_Posix_Syscall_posix_madvise (void *addr, mph_size_t len, gint32 advice) } #endif /* def HAVE_POSIX_MADVISE */ +#ifdef HAVE_REMAP_FILE_PAGES +int +Mono_Posix_Syscall_remap_file_pages (void *start, mph_size_t size, + int prot, mph_ssize_t pgoff, int flags) +{ + int _prot, _flags; + + mph_return_if_size_t_overflow (size); + mph_return_if_ssize_t_overflow (pgoff); + + if (Mono_Posix_FromMmapProts (prot, &_prot) == -1) + return -1; + if (Mono_Posix_FromMmapFlags (flags, &_flags) == -1) + return -1; + + return remap_file_pages (start, (size_t) size, _prot, (ssize_t) pgoff, _flags); +} +#endif /* def HAVE_REMAP_FILE_PAGES */ + G_END_DECLS /*