From 652a299ac1711a3db44348077d25ca3497d53cb5 Mon Sep 17 00:00:00 2001 From: Antonio SJ Musumeci Date: Wed, 28 May 2014 06:03:06 -0400 Subject: [PATCH] add fgetattr. closes #5 --- README.md | 2 +- src/fgetattr.cpp | 68 ++++++++++++++++++++++++++++++++++++++++++++++++ src/fgetattr.hpp | 38 +++++++++++++++++++++++++++ src/mergerfs.cpp | 3 ++- 4 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 src/fgetattr.cpp create mode 100644 src/fgetattr.hpp diff --git a/README.md b/README.md index cb5daa56..8e93fc34 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Filesystem calls are broken up into 4 functional categories: search, action, cre | search | access, getattr, getxattr, listxattr, open, readlink | | action | chmod, link, removexattr, rmdir, setxattr, truncate, unlink, utimens | | create | create, mkdir, mknod | -| none | fallocate, fsync, ftruncate, ioctl, read, readdir, rename, statfs, symlink, write, release | +| none | fallocate, fgetattr, fsync, ftruncate, ioctl, read, readdir, rename, statfs, symlink, write, release | #### Policy descriptions #### | Policy | Description | diff --git a/src/fgetattr.cpp b/src/fgetattr.cpp new file mode 100644 index 00000000..2e82a46b --- /dev/null +++ b/src/fgetattr.cpp @@ -0,0 +1,68 @@ +/* + The MIT License (MIT) + + Copyright (c) 2014 Antonio SJ Musumeci + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#include + +#include +#include +#include +#include + +#include "config.hpp" +#include "ugid.hpp" +#include "fileinfo.hpp" + +static +int +_fgetattr(const int fd, + struct stat &st) +{ + int rv; + + rv = ::fstat(fd,&st); + + return ((rv == -1) ? -errno : 0); +} + +namespace mergerfs +{ + namespace fgetattr + { + int + fgetattr(const char *fusepath, + struct stat *st, + struct fuse_file_info *ffi) + { + const ugid::SetResetGuard ugid; + const config::Config &config = config::get(); + const FileInfo *fileinfo = (FileInfo*)ffi->fh; + + if(fusepath == config.controlfile) + return (*st = config.controlfilestat,0); + + return _fgetattr(fileinfo->fd, + *st); + } + } +} diff --git a/src/fgetattr.hpp b/src/fgetattr.hpp new file mode 100644 index 00000000..85264757 --- /dev/null +++ b/src/fgetattr.hpp @@ -0,0 +1,38 @@ +/* + The MIT License (MIT) + + Copyright (c) 2014 Antonio SJ Musumeci + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#include +#include +#include + +namespace mergerfs +{ + namespace fgetattr + { + int + fgetattr(const char *fusepath, + struct stat *st, + struct fuse_file_info *fileinfo); + } +} diff --git a/src/mergerfs.cpp b/src/mergerfs.cpp index f42a6faa..df7d732e 100644 --- a/src/mergerfs.cpp +++ b/src/mergerfs.cpp @@ -39,6 +39,7 @@ #include "chown.hpp" #include "create.hpp" #include "fallocate.hpp" +#include "fgetattr.hpp" #include "fsync.hpp" #include "ftruncate.hpp" #include "getattr.hpp" @@ -80,7 +81,7 @@ get_fuse_operations() ops.create = mergerfs::create::create; ops.destroy = NULL; ops.fallocate = mergerfs::fallocate::fallocate; - ops.fgetattr = NULL; + ops.fgetattr = mergerfs::fgetattr::fgetattr; ops.flock = NULL; ops.flush = NULL; /* called on close() of fd */ ops.fsync = mergerfs::fsync::fsync;