From 45f757dc60e5c6c74e92cdddb6d91819ffe7127b Mon Sep 17 00:00:00 2001 From: Antonio SJ Musumeci Date: Mon, 1 Aug 2016 17:26:55 -0400 Subject: [PATCH] add osx version of fallocate --- src/fs_fallocate.cpp | 29 +++------------- src/fs_fallocate_linux.icpp | 32 +++++++++++++++++ src/fs_fallocate_osx.icpp | 57 +++++++++++++++++++++++++++++++ src/fs_fallocate_posix.icpp | 34 ++++++++++++++++++ src/fs_fallocate_unsupported.icpp | 31 +++++++++++++++++ 5 files changed, 159 insertions(+), 24 deletions(-) create mode 100644 src/fs_fallocate_linux.icpp create mode 100644 src/fs_fallocate_osx.icpp create mode 100644 src/fs_fallocate_posix.icpp create mode 100644 src/fs_fallocate_unsupported.icpp diff --git a/src/fs_fallocate.cpp b/src/fs_fallocate.cpp index 32ea9e31..98d3bb35 100644 --- a/src/fs_fallocate.cpp +++ b/src/fs_fallocate.cpp @@ -14,31 +14,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include -#include - -#include "fs_fallocate.hpp" - -namespace fs -{ - int - fallocate(const int fd, - const int mode, - const off_t offset, - const off_t len) - { - int rv; - #ifdef __linux__ - rv = ::fallocate(fd,mode,offset,len); +# include "fs_fallocate_linux.icpp" #elif _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L - rv = (mode ? - (errno=EOPNOTSUPP,-1) : - (::posix_fallocate(fd,offset,len))); +# include "fs_fallocate_posix.icpp" +#elif __APPLE__ +# include "fs_fallocate_osx.icpp" #else - rv = (errno=EOPNOTSUPP,-1); +# include "fs_fallocate_unsupported.icpp" #endif - - return rv; - } -} diff --git a/src/fs_fallocate_linux.icpp b/src/fs_fallocate_linux.icpp new file mode 100644 index 00000000..c851ae1b --- /dev/null +++ b/src/fs_fallocate_linux.icpp @@ -0,0 +1,32 @@ +/* + Copyright (c) 2016, Antonio SJ Musumeci + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include +#include + +#include "fs_fallocate.hpp" + +namespace fs +{ + int + fallocate(const int fd, + const int mode, + const off_t offset, + const off_t len) + { + return ::fallocate(fd,mode,offset,len); + } +} diff --git a/src/fs_fallocate_osx.icpp b/src/fs_fallocate_osx.icpp new file mode 100644 index 00000000..af2447e4 --- /dev/null +++ b/src/fs_fallocate_osx.icpp @@ -0,0 +1,57 @@ +/* + Copyright (c) 2016, Antonio SJ Musumeci + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include +#include + +#include "fs_fallocate.hpp" + +namespace fs +{ + static + int + _fallocate_core(const int fd, + const off_t offset, + const off_t len) + { + int rv; + fstore_t store = {F_ALLOCATECONTIG,F_PEOFPOSMODE,offset,len,0}; + + rv = ::fcntl(fd,F_PREALLOCATE,&store); + if(rv == -1) + { + store.fst_flags = F_ALLOCATEALL; + rv = ::fcntl(fd,F_PREALLOCATE,&store); + } + + if(rv == -1) + return rv; + + return ::ftruncate(fd,(offset+len)); + } + + int + fallocate(const int fd, + const int mode, + const off_t offset, + const off_t len) + { + if(mode) + return (errno=EOPNOTSUPP,-1); + + return ::_fallocate_core(fd,offset,len); + } +} diff --git a/src/fs_fallocate_posix.icpp b/src/fs_fallocate_posix.icpp new file mode 100644 index 00000000..759acd9d --- /dev/null +++ b/src/fs_fallocate_posix.icpp @@ -0,0 +1,34 @@ +/* + Copyright (c) 2016, Antonio SJ Musumeci + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include +#include + +#include "fs_fallocate.hpp" + +namespace fs +{ + int + fallocate(const int fd, + const int mode, + const off_t offset, + const off_t len) + { + return (mode ? + (errno=EOPNOTSUPP,-1) : + (::posix_fallocate(fd,offset,len))); + } +} diff --git a/src/fs_fallocate_unsupported.icpp b/src/fs_fallocate_unsupported.icpp new file mode 100644 index 00000000..50c92f11 --- /dev/null +++ b/src/fs_fallocate_unsupported.icpp @@ -0,0 +1,31 @@ +/* + Copyright (c) 2016, Antonio SJ Musumeci + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include + +#include "fs_fallocate.hpp" + +namespace fs +{ + int + fallocate(const int fd, + const int mode, + const off_t offset, + const off_t len) + { + return (errno=EOPNOTSUPP,-1); + } +}