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 /src | |
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.
Diffstat (limited to 'src')
-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; |