4 // mmap () should work now (cygnus beta 18), but let's keep it here
5 // for people using old cygnus releases
6 #if 0 // def _WINDOWS32
11 #include "thank-you-cygnus.hh"
14 HANDLE CreateFileMapping (
15 HANDLE hFile, // handle to file to map
16 LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // optional security attributes
17 DWORD flProtect, // protection for mapping object
18 DWORD dwMaximumSizeHigh, // high-order 32 bits of object size
19 DWORD dwMaximumSizeLow, // low-order 32 bits of object size
20 LPCTSTR lpName // name of file-mapping object
24 LPVOID MapViewOfFile (
25 HANDLE hFileMappingObject, // file-mapping object to map into address space
26 DWORD dwDesiredAccess, // access mode
27 DWORD dwFileOffsetHigh, // high-order 32 bits of file offset
28 DWORD dwFileOffsetLow, // low-order 32 bits of file offset
29 DWORD dwNumberOfBytesToMap // number of bytes to map
34 long _get_osfhandle (int filehandle);
37 // cygnus's gnu-win32-b17.1 does not have _get_osfhandle
38 // however, after some hacking, it turns out that:
40 static const int OSF_OFFSET_i = 72;
41 static const int OSF_BASE_i = -3;
42 static const int OSF_FACTOR_i = 8;
43 // let-s hope bill doesn-t change his mind any time soon :-)
45 // so that, while waiting for cygnus's mmap, we can write:
47 // #define HAVE_GET_OSFHANDLE // no we still cannot; works only with cl.exe
49 _get_osfhandle (int filedes_i)
51 return (long)(OSF_OFFSET_i + (filedes_i + OSF_BASE_i) * OSF_FACTOR_i);
54 #ifdef HAVE_GET_OSFHANDLE
59 mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
64 HANDLE osf = (HANDLE)_get_osfhandle (fd);
65 HANDLE file_handle = CreateFileMapping (osf, (void*)0, PAGE_READONLY,
67 return (caddr_t)MapViewOfFile (file_handle, FILE_MAP_READ, 0, offset, len);
72 munmap (caddr_t addr, size_t len)
75 return UnmapViewOfFile (addr);
78 #else // ! HAVE_GET_OSFHANDLE //
81 mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
87 char* ch_p = new char[ len ];
89 read (fd, (void*)ch_p, len);
95 munmap (caddr_t addr, size_t len)
102 #endif // !HAVE_GET_OSFHANDLE //
105 #endif // _WINDOWS32 //