1*76404edcSAsim Jamshed #include "stream.h"
2*76404edcSAsim Jamshed
3*76404edcSAsim Jamshed #include <sys/types.h>
4*76404edcSAsim Jamshed #include <sys/stat.h>
5*76404edcSAsim Jamshed
6*76404edcSAsim Jamshed #include <unistd.h>
7*76404edcSAsim Jamshed #include <fcntl.h>
8*76404edcSAsim Jamshed
9*76404edcSAsim Jamshed #include "sys-mmap.h"
10*76404edcSAsim Jamshed
11*76404edcSAsim Jamshed #ifndef O_BINARY
12*76404edcSAsim Jamshed # define O_BINARY 0
13*76404edcSAsim Jamshed #endif
14*76404edcSAsim Jamshed
stream_open(stream * f,buffer * fn)15*76404edcSAsim Jamshed int stream_open(stream *f, buffer *fn) {
16*76404edcSAsim Jamshed struct stat st;
17*76404edcSAsim Jamshed #ifdef HAVE_MMAP
18*76404edcSAsim Jamshed int fd;
19*76404edcSAsim Jamshed #elif defined __WIN32
20*76404edcSAsim Jamshed HANDLE *fh, *mh;
21*76404edcSAsim Jamshed void *p;
22*76404edcSAsim Jamshed #endif
23*76404edcSAsim Jamshed
24*76404edcSAsim Jamshed f->start = NULL;
25*76404edcSAsim Jamshed
26*76404edcSAsim Jamshed if (-1 == stat(fn->ptr, &st)) {
27*76404edcSAsim Jamshed return -1;
28*76404edcSAsim Jamshed }
29*76404edcSAsim Jamshed
30*76404edcSAsim Jamshed f->size = st.st_size;
31*76404edcSAsim Jamshed
32*76404edcSAsim Jamshed #ifdef HAVE_MMAP
33*76404edcSAsim Jamshed if (-1 == (fd = open(fn->ptr, O_RDONLY | O_BINARY))) {
34*76404edcSAsim Jamshed return -1;
35*76404edcSAsim Jamshed }
36*76404edcSAsim Jamshed
37*76404edcSAsim Jamshed f->start = mmap(NULL, f->size, PROT_READ, MAP_SHARED, fd, 0);
38*76404edcSAsim Jamshed
39*76404edcSAsim Jamshed close(fd);
40*76404edcSAsim Jamshed
41*76404edcSAsim Jamshed if (MAP_FAILED == f->start) {
42*76404edcSAsim Jamshed return -1;
43*76404edcSAsim Jamshed }
44*76404edcSAsim Jamshed
45*76404edcSAsim Jamshed #elif defined __WIN32
46*76404edcSAsim Jamshed fh = CreateFile(fn->ptr,
47*76404edcSAsim Jamshed GENERIC_READ,
48*76404edcSAsim Jamshed FILE_SHARE_READ,
49*76404edcSAsim Jamshed NULL,
50*76404edcSAsim Jamshed OPEN_EXISTING,
51*76404edcSAsim Jamshed FILE_ATTRIBUTE_READONLY,
52*76404edcSAsim Jamshed NULL);
53*76404edcSAsim Jamshed
54*76404edcSAsim Jamshed if (!fh) return -1;
55*76404edcSAsim Jamshed
56*76404edcSAsim Jamshed mh = CreateFileMapping( fh,
57*76404edcSAsim Jamshed NULL,
58*76404edcSAsim Jamshed PAGE_READONLY,
59*76404edcSAsim Jamshed (sizeof(off_t) > 4) ? f->size >> 32 : 0,
60*76404edcSAsim Jamshed f->size & 0xffffffff,
61*76404edcSAsim Jamshed NULL);
62*76404edcSAsim Jamshed
63*76404edcSAsim Jamshed if (!mh) {
64*76404edcSAsim Jamshed /*
65*76404edcSAsim Jamshed LPVOID lpMsgBuf;
66*76404edcSAsim Jamshed FormatMessage(
67*76404edcSAsim Jamshed FORMAT_MESSAGE_ALLOCATE_BUFFER |
68*76404edcSAsim Jamshed FORMAT_MESSAGE_FROM_SYSTEM,
69*76404edcSAsim Jamshed NULL,
70*76404edcSAsim Jamshed GetLastError(),
71*76404edcSAsim Jamshed MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
72*76404edcSAsim Jamshed (LPTSTR) &lpMsgBuf,
73*76404edcSAsim Jamshed 0, NULL );
74*76404edcSAsim Jamshed */
75*76404edcSAsim Jamshed return -1;
76*76404edcSAsim Jamshed }
77*76404edcSAsim Jamshed
78*76404edcSAsim Jamshed p = MapViewOfFile(mh,
79*76404edcSAsim Jamshed FILE_MAP_READ,
80*76404edcSAsim Jamshed 0,
81*76404edcSAsim Jamshed 0,
82*76404edcSAsim Jamshed 0);
83*76404edcSAsim Jamshed CloseHandle(mh);
84*76404edcSAsim Jamshed CloseHandle(fh);
85*76404edcSAsim Jamshed
86*76404edcSAsim Jamshed f->start = p;
87*76404edcSAsim Jamshed #else
88*76404edcSAsim Jamshed # error no mmap found
89*76404edcSAsim Jamshed #endif
90*76404edcSAsim Jamshed
91*76404edcSAsim Jamshed return 0;
92*76404edcSAsim Jamshed }
93*76404edcSAsim Jamshed
stream_close(stream * f)94*76404edcSAsim Jamshed int stream_close(stream *f) {
95*76404edcSAsim Jamshed #ifdef HAVE_MMAP
96*76404edcSAsim Jamshed if (f->start) munmap(f->start, f->size);
97*76404edcSAsim Jamshed #elif defined(__WIN32)
98*76404edcSAsim Jamshed if (f->start) UnmapViewOfFile(f->start);
99*76404edcSAsim Jamshed #endif
100*76404edcSAsim Jamshed
101*76404edcSAsim Jamshed f->start = NULL;
102*76404edcSAsim Jamshed
103*76404edcSAsim Jamshed return 0;
104*76404edcSAsim Jamshed }
105