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