2 * mono-filemap.c: Unix/Windows implementation for filemap.
5 * Paolo Molaro (lupus@ximian.com)
7 * Copyright 2008-2008 Novell, Inc.
23 #include "mono-mmap.h"
26 mono_file_map_open (const char* name
)
29 gunichar2
*wname
= g_utf8_to_utf16 (name
, -1, 0, 0, 0);
34 result
= (MonoFileMap
*) _wfopen ((wchar_t *) wname
, L
"rb");
38 return (MonoFileMap
*)fopen (name
, "rb");
43 mono_file_map_size (MonoFileMap
*fmap
)
46 if (fstat (fileno ((FILE*)fmap
), &stat_buf
) < 0)
48 return stat_buf
.st_size
;
52 mono_file_map_fd (MonoFileMap
*fmap
)
54 return fileno ((FILE*)fmap
);
58 mono_file_map_close (MonoFileMap
*fmap
)
60 return fclose ((FILE*)fmap
);
63 #if !defined (HOST_WIN32)
65 static mono_file_map_alloc_fn alloc_fn
= (mono_file_map_alloc_fn
) malloc
;
66 static mono_file_map_release_fn release_fn
= (mono_file_map_release_fn
) free
;
69 mono_file_map_set_allocator (mono_file_map_alloc_fn alloc
, mono_file_map_release_fn release
)
71 alloc_fn
= alloc
== NULL
? (mono_file_map_alloc_fn
) malloc
: alloc
;
72 release_fn
= release
== NULL
? (mono_file_map_release_fn
) free
: release
;
76 mono_file_map_fileio (size_t length
, int flags
, int fd
, guint64 offset
, void **ret_handle
)
80 void *ptr
= (*alloc_fn
) (length
);
83 cur_offset
= lseek (fd
, 0, SEEK_CUR
);
84 if (lseek (fd
, offset
, SEEK_SET
) != offset
) {
88 bytes_read
= read (fd
, ptr
, length
);
89 if (bytes_read
!= length
)
91 lseek (fd
, cur_offset
, SEEK_SET
);
97 mono_file_unmap_fileio (void *addr
, void *handle
)
102 #if !defined(HAVE_MMAP)
104 mono_file_map (size_t length
, int flags
, int fd
, guint64 offset
, void **ret_handle
)
106 return mono_file_map_fileio (length
, flags
, fd
, offset
, ret_handle
);
110 mono_file_unmap (void *addr
, void *handle
)
112 return mono_file_unmap_fileio(addr
, handle
);