lighttpd: fix reading from block devices, enable mmap
[opendreambox.git] / meta-opendreambox / recipes-extended / lighttpd / lighttpd / 0002-stat_cache-fix-reading-block-devices.patch
1 From 2d78c921ebdc2e8823d062acd775c69a2557cda7 Mon Sep 17 00:00:00 2001
2 From: Andreas Oberritter <obi@opendreambox.org>
3 Date: Mon, 18 Aug 2014 01:35:17 +0200
4 Subject: [PATCH] stat_cache: fix reading block devices
5
6 Signed-off-by: Andreas Oberritter <obi@opendreambox.org>
7 ---
8  src/network_write_no_mmap.c |  6 ++++++
9  src/stat_cache.c            | 10 ++++++++++
10  2 files changed, 16 insertions(+)
11
12 diff --git a/src/network_write_no_mmap.c b/src/network_write_no_mmap.c
13 index f5f50ce..0d14178 100644
14 --- a/src/network_write_no_mmap.c
15 +++ b/src/network_write_no_mmap.c
16 @@ -11,6 +11,7 @@
17  #include <stdlib.h>
18  
19  #include <fcntl.h>
20 +#include <sys/mount.h>
21  #include <sys/stat.h>
22  #include <unistd.h>
23  
24 @@ -50,6 +51,11 @@ int network_open_file_chunk(server *srv, connection *con, chunkqueue *cq) {
25                         return -1;
26                 }
27                 file_size = st.st_size;
28 +               if (S_ISBLK(st.st_mode)) {
29 +                       uint64_t size;
30 +                       if (ioctl(c->file.fd, BLKGETSIZE64, &size) == 0)
31 +                               file_size = size;
32 +               }
33         }
34  
35         if (offset > file_size || toSend > file_size || offset > file_size - toSend) {
36 diff --git a/src/stat_cache.c b/src/stat_cache.c
37 index 8aab29d..ba2d901 100644
38 --- a/src/stat_cache.c
39 +++ b/src/stat_cache.c
40 @@ -5,6 +5,7 @@
41  
42  #include <sys/types.h>
43  #include <sys/stat.h>
44 +#include <sys/mount.h>
45  
46  #include <stdlib.h>
47  #include <string.h>
48 @@ -627,6 +628,15 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_
49                 etag_create(sce->etag, &(sce->st), con->etag_flags);
50         } else if (S_ISDIR(st.st_mode)) {
51                 etag_create(sce->etag, &(sce->st), con->etag_flags);
52 +       } else if (S_ISBLK(st.st_mode)) {
53 +               /* set size for block devices */
54 +               fd = open(name->ptr, O_RDONLY);
55 +               if (fd >= 0) {
56 +                       uint64_t size;
57 +                       if (ioctl(fd, BLKGETSIZE64, &size) == 0)
58 +                               sce->st.st_size = size;
59 +                       close(fd);
60 +               }
61         }
62  
63  #ifdef HAVE_FAM_H