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>