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 "windhoos-suck-suck-suck-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
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 //