Mercurial > dovecot > core-2.2
annotate src/lib/mmap-util.c @ 22955:812e5c961328
fts: Indexing virtual mailbox didn't always index the last mails
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 03 May 2018 18:33:00 +0300 |
parents | cb108f786fb4 |
children |
rev | line source |
---|---|
22713
cb108f786fb4
Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
1 /* Copyright (c) 2002-2018 Dovecot authors, see the included COPYING file */ |
0 | 2 |
3 #include "lib.h" | |
4 #include "mmap-util.h" | |
5 | |
543
52fd3d82e59a
Removed mmap_aligned() which isn't used anywhere. Added mmap_file() which
Timo Sirainen <tss@iki.fi>
parents:
222
diff
changeset
|
6 #include <sys/stat.h> |
52fd3d82e59a
Removed mmap_aligned() which isn't used anywhere. Added mmap_file() which
Timo Sirainen <tss@iki.fi>
parents:
222
diff
changeset
|
7 |
52fd3d82e59a
Removed mmap_aligned() which isn't used anywhere. Added mmap_file() which
Timo Sirainen <tss@iki.fi>
parents:
222
diff
changeset
|
8 void *mmap_file(int fd, size_t *length, int prot) |
0 | 9 { |
543
52fd3d82e59a
Removed mmap_aligned() which isn't used anywhere. Added mmap_file() which
Timo Sirainen <tss@iki.fi>
parents:
222
diff
changeset
|
10 struct stat st; |
43
526284657da7
Fail if we try to mmap() files larger than 2G fully to memory
Timo Sirainen <tss@iki.fi>
parents:
6
diff
changeset
|
11 |
543
52fd3d82e59a
Removed mmap_aligned() which isn't used anywhere. Added mmap_file() which
Timo Sirainen <tss@iki.fi>
parents:
222
diff
changeset
|
12 if (fstat(fd, &st) < 0) |
0 | 13 return MAP_FAILED; |
14 | |
20643
6428c91a9548
lib: Avoid compiler warning if off_t has the same size as ssize_t.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19750
diff
changeset
|
15 #if OFF_T_MAX > SSIZE_T_MAX |
543
52fd3d82e59a
Removed mmap_aligned() which isn't used anywhere. Added mmap_file() which
Timo Sirainen <tss@iki.fi>
parents:
222
diff
changeset
|
16 if (st.st_size > SSIZE_T_MAX) { |
43
526284657da7
Fail if we try to mmap() files larger than 2G fully to memory
Timo Sirainen <tss@iki.fi>
parents:
6
diff
changeset
|
17 /* too large file to map into memory */ |
526284657da7
Fail if we try to mmap() files larger than 2G fully to memory
Timo Sirainen <tss@iki.fi>
parents:
6
diff
changeset
|
18 errno = EFBIG; |
526284657da7
Fail if we try to mmap() files larger than 2G fully to memory
Timo Sirainen <tss@iki.fi>
parents:
6
diff
changeset
|
19 return MAP_FAILED; |
526284657da7
Fail if we try to mmap() files larger than 2G fully to memory
Timo Sirainen <tss@iki.fi>
parents:
6
diff
changeset
|
20 } |
20643
6428c91a9548
lib: Avoid compiler warning if off_t has the same size as ssize_t.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19750
diff
changeset
|
21 #endif |
43
526284657da7
Fail if we try to mmap() files larger than 2G fully to memory
Timo Sirainen <tss@iki.fi>
parents:
6
diff
changeset
|
22 |
543
52fd3d82e59a
Removed mmap_aligned() which isn't used anywhere. Added mmap_file() which
Timo Sirainen <tss@iki.fi>
parents:
222
diff
changeset
|
23 *length = (size_t)st.st_size; |
0 | 24 if (*length == 0) |
25 return NULL; | |
26 | |
183
4a7ab9e94f25
size_t fixes for lib/. Changed OFF_T_FORMAT to PRIuOFF_T which is more
Timo Sirainen <tss@iki.fi>
parents:
43
diff
changeset
|
27 i_assert(*length > 0 && *length < SSIZE_T_MAX); |
0 | 28 |
543
52fd3d82e59a
Removed mmap_aligned() which isn't used anywhere. Added mmap_file() which
Timo Sirainen <tss@iki.fi>
parents:
222
diff
changeset
|
29 return mmap(NULL, *length, prot, MAP_SHARED, fd, 0); |
0 | 30 } |
31 | |
32 void *mmap_ro_file(int fd, size_t *length) | |
33 { | |
34 return mmap_file(fd, length, PROT_READ); | |
35 } | |
36 | |
37 void *mmap_rw_file(int fd, size_t *length) | |
38 { | |
39 return mmap_file(fd, length, PROT_READ | PROT_WRITE); | |
40 } | |
41 | |
19750
ac29347cf81e
lib: Ignore ENOSYS errors from madvise() calls.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
42 #undef madvise |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
2998
diff
changeset
|
43 int my_madvise(void *start ATTR_UNUSED, size_t length ATTR_UNUSED, |
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
2998
diff
changeset
|
44 int advice ATTR_UNUSED) |
0 | 45 { |
19750
ac29347cf81e
lib: Ignore ENOSYS errors from madvise() calls.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
46 #ifdef HAVE_MADVISE |
ac29347cf81e
lib: Ignore ENOSYS errors from madvise() calls.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
47 /* Ignore ENOSYS errors, which happen if the kernel hasn't implemented |
ac29347cf81e
lib: Ignore ENOSYS errors from madvise() calls.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
48 the syscall even if libc has. */ |
ac29347cf81e
lib: Ignore ENOSYS errors from madvise() calls.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
49 if (madvise(start, length, advice) < 0 && errno != ENOSYS) |
ac29347cf81e
lib: Ignore ENOSYS errors from madvise() calls.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
50 return -1; |
ac29347cf81e
lib: Ignore ENOSYS errors from madvise() calls.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
51 #endif |
2998
7e1fdbdaf465
my_madvise() wasn't returning anything.
Timo Sirainen <tss@iki.fi>
parents:
2439
diff
changeset
|
52 return 0; |
0 | 53 } |
2439
7d6ca38c8c37
Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents:
1793
diff
changeset
|
54 |
7d6ca38c8c37
Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents:
1793
diff
changeset
|
55 size_t mmap_get_page_size(void) |
7d6ca38c8c37
Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents:
1793
diff
changeset
|
56 { |
7d6ca38c8c37
Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents:
1793
diff
changeset
|
57 static size_t size = 0; |
7d6ca38c8c37
Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents:
1793
diff
changeset
|
58 |
7d6ca38c8c37
Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents:
1793
diff
changeset
|
59 if (size != 0) |
7d6ca38c8c37
Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents:
1793
diff
changeset
|
60 return size; |
7d6ca38c8c37
Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents:
1793
diff
changeset
|
61 size = getpagesize(); |
7d6ca38c8c37
Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents:
1793
diff
changeset
|
62 return size; |
7d6ca38c8c37
Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents:
1793
diff
changeset
|
63 } |