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