From 3d36f92b85be7ef0ac2c0994cf78d8d45c1d337f Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Mon, 12 Apr 2021 18:55:32 +0200 Subject: [PATCH] Add `user.dwarfs.driver.pid` xattr to toplevel entry This helps identify the dwarfs driver process associated with a mounted filesystem. --- src/dwarfs.cpp | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/dwarfs.cpp b/src/dwarfs.cpp index 02ed485d..2b22e85a 100644 --- a/src/dwarfs.cpp +++ b/src/dwarfs.cpp @@ -419,6 +419,38 @@ void op_statfs(fuse_req_t req, fuse_ino_t /*ino*/) { fuse_reply_err(req, err); } +template +void op_getxattr(fuse_req_t req, fuse_ino_t ino, char const* name, + size_t size) { + dUSERDATA; + LOG_PROXY(LoggerPolicy, userdata->lgr); + + LOG_DEBUG << __func__ << "(" << ino << ", " << name << ", " << size << ")"; + + static constexpr std::string_view pid_xattr{"user.dwarfs.driver.pid"}; + int err = ENODATA; + + try { + if (ino == FUSE_ROOT_ID && name == pid_xattr) { + auto pidstr = std::to_string(::getpid()); + if (size > 0) { + fuse_reply_buf(req, pidstr.data(), pidstr.size()); + } else { + fuse_reply_xattr(req, pidstr.size()); + } + return; + } + } catch (dwarfs::system_error const& e) { + LOG_ERROR << e.what(); + err = e.get_errno(); + } catch (std::exception const& e) { + LOG_ERROR << e.what(); + err = EIO; + } + + fuse_reply_err(req, err); +} + void usage(const char* progname) { std::cerr << "dwarfs (" << PRJ_GIT_ID << ", fuse version " << FUSE_USE_VERSION @@ -495,7 +527,7 @@ void init_lowlevel_ops(struct fuse_lowlevel_ops& ops) { ops.read = &op_read; ops.readdir = &op_readdir; ops.statfs = &op_statfs; - // ops.getxattr = &op_getxattr; + ops.getxattr = &op_getxattr; // ops.listxattr = &op_listxattr; }