diff options
author | Elliott Hughes <enh@google.com> | 2019-10-22 16:04:55 -0700 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2019-10-27 17:46:18 -0500 |
commit | c0bb071b4bc47c74e229ef84cdbaf374e1c2a581 (patch) | |
tree | 8455e6fc848a29a0ee61342e46bc6de76b430152 /lib/portability.c | |
parent | cb3d852ca08ec5fbd9f1d9e3f366d378b357655e (diff) | |
download | toybox-c0bb071b4bc47c74e229ef84cdbaf374e1c2a581.tar.gz |
macOS: implement posix_fallocate().
Diffstat (limited to 'lib/portability.c')
-rw-r--r-- | lib/portability.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/portability.c b/lib/portability.c index d48a3b4d..0b5677cc 100644 --- a/lib/portability.c +++ b/lib/portability.c @@ -396,6 +396,23 @@ int mknodat(int dirfd, const char *path, mode_t mode, dev_t dev) if (fchdir(old_dirfd) == -1) perror_exit("mknodat couldn't return"); return result; } + +// As of 10.15, macOS offers an fcntl F_PREALLOCATE rather than fallocate() +// or posix_fallocate() calls. +int posix_fallocate(int fd, off_t offset, off_t length) +{ + int e = errno, result; + fstore_t f; + + f.fst_flags = F_ALLOCATEALL; + f.fst_posmode = F_PEOFPOSMODE; + f.fst_offset = offset; + f.fst_length = length; + if (fcntl(fd, F_PREALLOCATE, &f) == -1) result = errno; + else result = ftruncate(fd, length); + errno = e; + return result; +} #endif // Signals required by POSIX 2008: |