--- embedaddon/lighttpd/src/stream.c 2013/10/14 10:32:48 1.1.1.1 +++ embedaddon/lighttpd/src/stream.c 2016/11/02 10:35:00 1.1.1.2 @@ -1,3 +1,5 @@ +#include "first.h" + #include "stream.h" #include @@ -12,37 +14,68 @@ # define O_BINARY 0 #endif -int stream_open(stream *f, buffer *fn) { +/* 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; -#ifdef HAVE_MMAP int fd; -#elif defined __WIN32 - HANDLE *fh, *mh; - void *p; -#endif f->start = NULL; + f->size = 0; + f->mapped = 0; - if (-1 == stat(fn->ptr, &st)) { + if (-1 == (fd = open(fn->ptr, O_RDONLY | O_BINARY | FIFO_NONBLOCK))) { return -1; } - f->size = st.st_size; - -#ifdef HAVE_MMAP - if (-1 == (fd = open(fn->ptr, O_RDONLY | O_BINARY))) { + if (-1 == fstat(fd, &st)) { + close(fd); return -1; } - f->start = mmap(NULL, f->size, PROT_READ, MAP_SHARED, fd, 0); + if (0 == st.st_size) { + /* empty file doesn't need a mapping */ + close(fd); + return 0; + } - close(fd); + f->start = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0); if (MAP_FAILED == f->start) { - return -1; + 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, @@ -53,11 +86,21 @@ int stream_open(stream *f, buffer *fn) { 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) ? f->size >> 32 : 0, - f->size & 0xffffffff, + (sizeof(off_t) > 4) ? fsize >> 32 : 0, + fsize & 0xffffffff, NULL); if (!mh) { @@ -72,6 +115,7 @@ int stream_open(stream *f, buffer *fn) { (LPTSTR) &lpMsgBuf, 0, NULL ); */ + CloseHandle(fh); return -1; } @@ -84,21 +128,29 @@ int stream_open(stream *f, buffer *fn) { CloseHandle(fh); f->start = p; -#else -# error no mmap found + f->size = (off_t)fsize; + return 0; + #endif - return 0; } int stream_close(stream *f) { #ifdef HAVE_MMAP - if (f->start) munmap(f->start, f->size); + 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; }