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 | |
parent | cb3d852ca08ec5fbd9f1d9e3f366d378b357655e (diff) | |
download | toybox-c0bb071b4bc47c74e229ef84cdbaf374e1c2a581.tar.gz |
macOS: implement posix_fallocate().
-rw-r--r-- | lib/portability.c | 17 | ||||
-rw-r--r-- | lib/portability.h | 3 |
2 files changed, 19 insertions, 1 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: diff --git a/lib/portability.h b/lib/portability.h index fb4e0383..896fba34 100644 --- a/lib/portability.h +++ b/lib/portability.h @@ -201,9 +201,10 @@ ssize_t xattr_lset(const char*, const char*, const void*, size_t, int); ssize_t xattr_fset(int, const char*, const void*, size_t, int); #endif -// macOS doesn't have mknodat, but we can fake it. +// macOS doesn't have these functions, but we can fake them. #ifdef __APPLE__ int mknodat(int, const char*, mode_t, dev_t); +int posix_fallocate(int, off_t, off_t); #endif // Android is missing some headers and functions |