[mod_status] page refresh option (fixes #2170)
[lighttpd.git] / src / stream.c
bloba17079c0136853515cbdc6acd9ecb2c6f8bc4e6e
1 #include "first.h"
3 #include "stream.h"
5 #include <sys/types.h>
6 #include <sys/stat.h>
8 #include <unistd.h>
9 #include <fcntl.h>
11 #include "sys-mmap.h"
13 #ifndef O_BINARY
14 # define O_BINARY 0
15 #endif
17 /* don't want to block when open()ing a fifo */
18 #if defined(O_NONBLOCK)
19 # define FIFO_NONBLOCK O_NONBLOCK
20 #else
21 # define FIFO_NONBLOCK 0
22 #endif
24 int stream_open(stream *f, buffer *fn) {
26 #ifdef HAVE_MMAP
28 struct stat st;
29 int fd;
31 f->start = NULL;
32 f->size = 0;
34 if (-1 == (fd = open(fn->ptr, O_RDONLY | O_BINARY | FIFO_NONBLOCK))) {
35 return -1;
38 if (-1 == fstat(fd, &st)) {
39 close(fd);
40 return -1;
43 if (0 == st.st_size) {
44 /* empty file doesn't need a mapping */
45 close(fd);
46 return 0;
49 f->start = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
51 close(fd);
53 if (MAP_FAILED == f->start) {
54 f->start = NULL;
55 return -1;
58 f->size = st.st_size;
59 return 0;
61 #elif defined __WIN32
63 HANDLE *fh, *mh;
64 void *p;
65 LARGE_INTEGER fsize;
67 f->start = NULL;
68 f->size = 0;
70 fh = CreateFile(fn->ptr,
71 GENERIC_READ,
72 FILE_SHARE_READ,
73 NULL,
74 OPEN_EXISTING,
75 FILE_ATTRIBUTE_READONLY,
76 NULL);
78 if (!fh) return -1;
80 if (0 != GetFileSizeEx(fh, &fsize)) {
81 CloseHandle(fh);
82 return -1;
85 if (0 == fsize) {
86 CloseHandle(fh);
87 return 0;
90 mh = CreateFileMapping( fh,
91 NULL,
92 PAGE_READONLY,
93 (sizeof(off_t) > 4) ? fsize >> 32 : 0,
94 fsize & 0xffffffff,
95 NULL);
97 if (!mh) {
99 LPVOID lpMsgBuf;
100 FormatMessage(
101 FORMAT_MESSAGE_ALLOCATE_BUFFER |
102 FORMAT_MESSAGE_FROM_SYSTEM,
103 NULL,
104 GetLastError(),
105 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
106 (LPTSTR) &lpMsgBuf,
107 0, NULL );
109 CloseHandle(fh);
110 return -1;
113 p = MapViewOfFile(mh,
114 FILE_MAP_READ,
118 CloseHandle(mh);
119 CloseHandle(fh);
121 f->start = p;
122 f->size = (off_t)fsize;
123 return 0;
125 #else
126 # error no mmap found
127 #endif
131 int stream_close(stream *f) {
132 #ifdef HAVE_MMAP
133 if (f->start) munmap(f->start, f->size);
134 #elif defined(__WIN32)
135 if (f->start) UnmapViewOfFile(f->start);
136 #endif
138 f->start = NULL;
139 f->size = 0;
141 return 0;