From 1f3de3f0e20d20e8f388f07339630090edaba56c Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Fri, 16 Mar 2018 10:07:07 +0100 Subject: [SERVER] Make sparse file mode actually work --- src/server/fileutil.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'src/server/fileutil.c') diff --git a/src/server/fileutil.c b/src/server/fileutil.c index d41dc85..336ab68 100644 --- a/src/server/fileutil.c +++ b/src/server/fileutil.c @@ -58,11 +58,18 @@ bool file_alloc(int fd, uint64_t offset, uint64_t size) #elif defined(__FreeBSD__) if ( posix_fallocate( fd, offset, size ) == 0 ) return true; // slow way #endif + return false; +} + +bool file_setSize(int fd, uint64_t size) +{ + if ( ftruncate( fd, size ) == 0 ) return true; - /* This doesn't make any sense, AFAIK - if ( lseek( fd, offset + size - 1, SEEK_SET ) != (off_t)offset ) return false; // dumb way - if ( write( fd, "", 1 ) != 1 ) return false; - */ + // Try really hard... image loading logic relies on the file + // having the proper apparent size + uint8_t byte = 0; + pread( fd, &byte, 1, size - 1 ); + if ( pwrite( fd, &byte, 1, size - 1 ) == 1 ) return true; return false; } -- cgit v1.2.3-55-g7522