2 * mono-filemap.c: Unix/Windows implementation for filemap.
5 * Paolo Molaro (lupus@ximian.com)
7 * Copyright 2008-2008 Novell, Inc.
8 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
24 #include "mono-mmap.h"
27 mono_file_map_open (const char* name)
30 gunichar2 *wname = g_utf8_to_utf16 (name, -1, 0, 0, 0);
35 result = (MonoFileMap *) _wfopen ((wchar_t *) wname, L"rb");
39 int fd = open (name, O_RDONLY);
42 return (MonoFileMap *)(size_t)fd;
47 mono_file_map_size (MonoFileMap *fmap)
50 if (fstat (mono_file_map_fd (fmap), &stat_buf) < 0)
52 return stat_buf.st_size;
56 mono_file_map_fd (MonoFileMap *fmap)
59 return fileno ((FILE*)fmap);
61 return (int)(size_t)fmap;
66 mono_file_map_close (MonoFileMap *fmap)
69 return fclose ((FILE*)fmap);
71 return close (mono_file_map_fd (fmap));
75 #if !defined (HOST_WIN32)
77 static mono_file_map_alloc_fn alloc_fn = (mono_file_map_alloc_fn) malloc;
78 static mono_file_map_release_fn release_fn = (mono_file_map_release_fn) free;
81 mono_file_map_set_allocator (mono_file_map_alloc_fn alloc, mono_file_map_release_fn release)
83 alloc_fn = alloc == NULL ? (mono_file_map_alloc_fn) malloc : alloc;
84 release_fn = release == NULL ? (mono_file_map_release_fn) free : release;
88 mono_file_map_fileio (size_t length, int flags, int fd, guint64 offset, void **ret_handle)
92 void *ptr = (*alloc_fn) (length);
95 cur_offset = lseek (fd, 0, SEEK_CUR);
96 if (lseek (fd, offset, SEEK_SET) != offset) {
100 bytes_read = read (fd, ptr, length);
101 if (bytes_read != length)
103 lseek (fd, cur_offset, SEEK_SET);
109 mono_file_unmap_fileio (void *addr, void *handle)
111 (*release_fn) (addr);
114 #if !defined(HAVE_MMAP)
116 mono_file_map (size_t length, int flags, int fd, guint64 offset, void **ret_handle)
118 return mono_file_map_fileio (length, flags, fd, offset, ret_handle);
122 mono_file_unmap (void *addr, void *handle)
124 return mono_file_unmap_fileio(addr, handle);