summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2015-09-03 13:15:18 +0300
committerTimo Teräs <timo.teras@iki.fi>2015-09-03 13:15:18 +0300
commit9ffa38222b9ee5e105f72f705c4449d548f3eb7b (patch)
tree93848e3b39fa84bc3cf1a2a18d7cc534f42e9cb4 /src
parent0e87d08d2d603a09169be9211602b10a158a2928 (diff)
downloadapk-tools-9ffa38222b9ee5e105f72f705c4449d548f3eb7b.tar.gz
apk-tools-9ffa38222b9ee5e105f72f705c4449d548f3eb7b.tar.bz2
apk-tools-9ffa38222b9ee5e105f72f705c4449d548f3eb7b.tar.xz
apk-tools-9ffa38222b9ee5e105f72f705c4449d548f3eb7b.zip
io: use posix_fallocate to allocate disk space
ftruncate does not allocate it, and subsequent access to mmaped file will result in SIGBUS. this fixes to properly report disk full errors.
Diffstat (limited to 'src')
-rw-r--r--src/io.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/io.c b/src/io.c
index a62ef36..a321c0c 100644
--- a/src/io.c
+++ b/src/io.c
@@ -144,9 +144,14 @@ size_t apk_istream_splice(void *stream, int fd, size_t size,
bufsz = size;
if (size > 128 * 1024) {
- if (size != APK_SPLICE_ALL && ftruncate(fd, size) == 0)
- mmapbase = mmap(NULL, size, PROT_READ | PROT_WRITE,
- MAP_SHARED, fd, 0);
+ if (size != APK_SPLICE_ALL) {
+ r = posix_fallocate(fd, 0, size);
+ if (r == 0)
+ mmapbase = mmap(NULL, size, PROT_READ | PROT_WRITE,
+ MAP_SHARED, fd, 0);
+ else if (r != ENOSYS)
+ return -r;
+ }
if (bufsz > 2*1024*1024)
bufsz = 2*1024*1024;
buf = mmapbase;