summaryrefslogtreecommitdiffstats
path: root/src/server/fileutil.c
diff options
context:
space:
mode:
authorSimon Rettberg2018-03-16 10:07:07 +0100
committerSimon Rettberg2018-03-16 10:07:07 +0100
commit1f3de3f0e20d20e8f388f07339630090edaba56c (patch)
tree9bf99629a878019b55fa907852b19eedebc2fd37 /src/server/fileutil.c
parent[SERVER] Experimental support for sparse files in proxy mode (diff)
downloaddnbd3-1f3de3f0e20d20e8f388f07339630090edaba56c.tar.gz
dnbd3-1f3de3f0e20d20e8f388f07339630090edaba56c.tar.xz
dnbd3-1f3de3f0e20d20e8f388f07339630090edaba56c.zip
[SERVER] Make sparse file mode actually work
Diffstat (limited to 'src/server/fileutil.c')
-rw-r--r--src/server/fileutil.c15
1 files changed, 11 insertions, 4 deletions
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;
}