diff options
author | Timo Teräs <timo.teras@iki.fi> | 2015-09-03 13:15:18 +0300 |
---|---|---|
committer | Timo Teräs <timo.teras@iki.fi> | 2015-09-03 13:15:18 +0300 |
commit | 9ffa38222b9ee5e105f72f705c4449d548f3eb7b (patch) | |
tree | 93848e3b39fa84bc3cf1a2a18d7cc534f42e9cb4 | |
parent | 0e87d08d2d603a09169be9211602b10a158a2928 (diff) | |
download | apk-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.
-rw-r--r-- | src/io.c | 11 |
1 files changed, 8 insertions, 3 deletions
@@ -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; |