summaryrefslogtreecommitdiff
path: root/data/lighttpd/lighttpd-1.4.53/src/stream.c
diff options
context:
space:
mode:
Diffstat (limited to 'data/lighttpd/lighttpd-1.4.53/src/stream.c')
-rw-r--r--data/lighttpd/lighttpd-1.4.53/src/stream.c157
1 files changed, 157 insertions, 0 deletions
diff --git a/data/lighttpd/lighttpd-1.4.53/src/stream.c b/data/lighttpd/lighttpd-1.4.53/src/stream.c
new file mode 100644
index 000000000..9099bf67d
--- /dev/null
+++ b/data/lighttpd/lighttpd-1.4.53/src/stream.c
@@ -0,0 +1,157 @@
+#include "first.h"
+
+#include "stream.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdlib.h>
+
+#include "sys-mmap.h"
+
+#ifndef O_BINARY
+# define O_BINARY 0
+#endif
+
+/* don't want to block when open()ing a fifo */
+#if defined(O_NONBLOCK)
+# define FIFO_NONBLOCK O_NONBLOCK
+#else
+# define FIFO_NONBLOCK 0
+#endif
+
+int stream_open(stream *f, const buffer *fn) {
+
+#if !defined(__WIN32)
+
+ struct stat st;
+ int fd;
+
+ f->start = NULL;
+ f->size = 0;
+ f->mapped = 0;
+
+ if (-1 == (fd = open(fn->ptr, O_RDONLY | O_BINARY | FIFO_NONBLOCK))) {
+ return -1;
+ }
+
+ if (-1 == fstat(fd, &st)) {
+ close(fd);
+ return -1;
+ }
+
+ if (0 == st.st_size) {
+ /* empty file doesn't need a mapping */
+ close(fd);
+ return 0;
+ }
+
+ f->start = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
+
+ if (MAP_FAILED == f->start) {
+ f->start = malloc((size_t)st.st_size);
+ if (NULL == f->start
+ || st.st_size != read(fd, f->start, (size_t)st.st_size)) {
+ free(f->start);
+ f->start = NULL;
+ close(fd);
+ return -1;
+ }
+ } else {
+ f->mapped = 1;
+ }
+
+ close(fd);
+
+ f->size = st.st_size;
+ return 0;
+
+#elif defined __WIN32
+
+ HANDLE *fh, *mh;
+ void *p;
+ LARGE_INTEGER fsize;
+
+ f->start = NULL;
+ f->size = 0;
+
+ fh = CreateFile(fn->ptr,
+ GENERIC_READ,
+ FILE_SHARE_READ,
+ NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_READONLY,
+ NULL);
+
+ if (!fh) return -1;
+
+ if (0 != GetFileSizeEx(fh, &fsize)) {
+ CloseHandle(fh);
+ return -1;
+ }
+
+ if (0 == fsize) {
+ CloseHandle(fh);
+ return 0;
+ }
+
+ mh = CreateFileMapping( fh,
+ NULL,
+ PAGE_READONLY,
+ (sizeof(off_t) > 4) ? fsize >> 32 : 0,
+ fsize & 0xffffffff,
+ NULL);
+
+ if (!mh) {
+/*
+ LPVOID lpMsgBuf;
+ FormatMessage(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ GetLastError(),
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR) &lpMsgBuf,
+ 0, NULL );
+*/
+ CloseHandle(fh);
+ return -1;
+ }
+
+ p = MapViewOfFile(mh,
+ FILE_MAP_READ,
+ 0,
+ 0,
+ 0);
+ CloseHandle(mh);
+ CloseHandle(fh);
+
+ f->start = p;
+ f->size = (off_t)fsize;
+ return 0;
+
+#endif
+
+}
+
+int stream_close(stream *f) {
+#ifdef HAVE_MMAP
+ if (f->start) {
+ if (f->mapped) {
+ f->mapped = 0;
+ munmap(f->start, f->size);
+ } else {
+ free(f->start);
+ }
+ }
+#elif defined(__WIN32)
+ if (f->start) UnmapViewOfFile(f->start);
+#endif
+
+ f->start = NULL;
+ f->size = 0;
+
+ return 0;
+}