From 34ee3707a56c4c845a143d5fba6f7cc032d438ca Mon Sep 17 00:00:00 2001 From: Antonio SJ Musumeci Date: Sun, 1 Dec 2024 13:53:32 -0600 Subject: [PATCH] fuse_lowlevel.cpp --- libfuse/include/fuse_kernel.h | 2 +- libfuse/include/fuse_lowlevel.h | 3 + libfuse/lib/{debug.c => debug.cpp} | 265 +++++++++--------- libfuse/lib/{debug.h => debug.hpp} | 0 .../{fuse_lowlevel.c => fuse_lowlevel.cpp} | 178 +++++++----- 5 files changed, 244 insertions(+), 204 deletions(-) rename libfuse/lib/{debug.c => debug.cpp} (83%) rename libfuse/lib/{debug.h => debug.hpp} (100%) rename libfuse/lib/{fuse_lowlevel.c => fuse_lowlevel.cpp} (90%) diff --git a/libfuse/include/fuse_kernel.h b/libfuse/include/fuse_kernel.h index e7418d15..d3c634bc 100644 --- a/libfuse/include/fuse_kernel.h +++ b/libfuse/include/fuse_kernel.h @@ -442,7 +442,7 @@ struct fuse_file_lock { #define FUSE_HANDLE_KILLPRIV_V2 (1 << 28) #define FUSE_SETXATTR_EXT (1 << 29) #define FUSE_INIT_EXT (1 << 30) -#define FUSE_INIT_RESERVED (1 << 31) +#define FUSE_INIT_RESERVED (1ULL << 31) /* bits 32..63 get shifted down 32 bits into the flags2 field */ #define FUSE_SECURITY_CTX (1ULL << 32) #define FUSE_HAS_INODE_DAX (1ULL << 33) diff --git a/libfuse/include/fuse_lowlevel.h b/libfuse/include/fuse_lowlevel.h index f9e09122..b1485aa6 100644 --- a/libfuse/include/fuse_lowlevel.h +++ b/libfuse/include/fuse_lowlevel.h @@ -151,6 +151,7 @@ struct fuse_lowlevel_ops void (*link)(fuse_req_t req, struct fuse_in_header *hdr); void (*listxattr)(fuse_req_t req, struct fuse_in_header *hdr); void (*lookup)(fuse_req_t req, struct fuse_in_header *hdr); + void (*lseek)(fuse_req_t req, struct fuse_in_header *hdr); void (*mkdir)(fuse_req_t req, struct fuse_in_header *hdr); void (*mknod)(fuse_req_t req, struct fuse_in_header *hdr); void (*open)(fuse_req_t req, struct fuse_in_header *hdr); @@ -165,6 +166,7 @@ struct fuse_lowlevel_ops void (*removemapping)(fuse_req_t req, const struct fuse_in_header *hdr); void (*removexattr)(fuse_req_t req, const struct fuse_in_header *hdr); void (*rename)(fuse_req_t req, struct fuse_in_header *hdr); + void (*rename2)(fuse_req_t req, struct fuse_in_header *hdr); void (*retrieve_reply)(fuse_req_t req, void *cookie, uint64_t ino, off_t offset); void (*rmdir)(fuse_req_t req, struct fuse_in_header *hdr); void (*setattr)(fuse_req_t req, struct fuse_in_header *hdr); @@ -172,6 +174,7 @@ struct fuse_lowlevel_ops void (*setupmapping)(fuse_req_t req, const struct fuse_in_header *hdr); void (*setxattr)(fuse_req_t req, struct fuse_in_header *hdr); void (*statfs)(fuse_req_t req, struct fuse_in_header *hdr); + void (*statx)(fuse_req_t req, struct fuse_in_header *hdr); void (*symlink)(fuse_req_t req, struct fuse_in_header *hdr); void (*syncfs)(fuse_req_t req, const struct fuse_in_header *hdr); void (*tmpfile)(fuse_req_t req, const struct fuse_in_header *hdr); diff --git a/libfuse/lib/debug.c b/libfuse/lib/debug.cpp similarity index 83% rename from libfuse/lib/debug.c rename to libfuse/lib/debug.cpp index ddb53155..34ccf7c0 100644 --- a/libfuse/lib/debug.c +++ b/libfuse/lib/debug.cpp @@ -16,7 +16,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#ifndef _GNU_SOURCE #define _GNU_SOURCE +#endif #include "fuse_kernel.h" @@ -211,7 +213,7 @@ void debug_open_flags(const uint32_t flags_) { fprintf(stderr,"%s, ",open_accmode_to_str(flags_)); - for(int i = 0; i < (sizeof(flags_) * 8); i++) + for(size_t i = 0; i < (sizeof(flags_) * 8); i++) { const char *str; @@ -252,11 +254,11 @@ debug_fuse_open_out(const struct fuse_open_out *arg_) { fprintf(stderr, "fuse_open_out:" - " fh=0x%"PRIx64";" + " fh=0x%" PRIx64 ";" " open_flags=0x%X (", arg_->fh, arg_->open_flags); - for(int i = 0; i < (sizeof(arg_->open_flags) * 8); i++) + for(size_t i = 0; i < (sizeof(arg_->open_flags) * 8); i++) { const char *str; @@ -276,7 +278,7 @@ static void debug_fuse_lookup(const void *arg_) { - const char *name = arg_; + const char *name = (const char*)arg_; fprintf(g_OUTPUT, "fuse_lookup:" @@ -290,12 +292,12 @@ static void debug_fuse_getattr_in(const void *arg_) { - const struct fuse_getattr_in *arg = arg_; + const struct fuse_getattr_in *arg = (const fuse_getattr_in*)arg_; fprintf(g_OUTPUT, "fuse_getattr_in:" " getattr_flags=0x%08X;" - " fh=0x%"PRIx64";\n", + " fh=0x%" PRIx64 ";\n", arg->getattr_flags, arg->fh); } @@ -304,12 +306,12 @@ static void debug_fuse_setattr_in(const void *arg_) { - const struct fuse_setattr_in *arg = arg_; + const struct fuse_setattr_in *arg = (const fuse_setattr_in*)arg_; fprintf(g_OUTPUT, "fuse_setattr_in:" " valid=%u;" - " fh=0x%"PRIx64";" + " fh=0x%" PRIx64 ";" " size=%zu;" " lock_owner=%zu;" " atime=%zu;" @@ -342,7 +344,7 @@ static void debug_fuse_access_in(const void *arg_) { - const struct fuse_access_in *arg = arg_; + const struct fuse_access_in *arg = (const fuse_access_in*)arg_; fprintf(g_OUTPUT, "fuse_access_in:" @@ -356,7 +358,7 @@ static void debug_fuse_mknod_in(const void *arg_) { - const struct fuse_mknod_in *arg = arg_; + const struct fuse_mknod_in *arg = (const fuse_mknod_in*)arg_; fprintf(g_OUTPUT, "fuse_mknod_in:" @@ -374,7 +376,7 @@ static void debug_fuse_mkdir_in(const void *arg_) { - const struct fuse_mkdir_in *arg = arg_; + const struct fuse_mkdir_in *arg = (const fuse_mkdir_in*)arg_; fprintf(g_OUTPUT, "fuse_mkdir_in:" @@ -392,7 +394,7 @@ static void debug_fuse_unlink(const void *arg_) { - const char *name = arg_; + const char *name = (const char*)arg_; fprintf(g_OUTPUT, "fuse_unlink:" @@ -406,7 +408,7 @@ static void debug_fuse_rmdir(const void *arg_) { - const char *name = arg_; + const char *name = (const char*)arg_; fprintf(g_OUTPUT, "fuse_mkdir:" @@ -423,7 +425,7 @@ debug_fuse_symlink(const void *arg_) const char *name; const char *linkname; - name = arg_; + name = (const char*)arg_; linkname = (name + (strlen(name) + 1)); fprintf(g_OUTPUT, @@ -442,7 +444,7 @@ debug_fuse_rename_in(const void *arg_) { const char *oldname; const char *newname; - const struct fuse_rename_in *arg = arg_; + const struct fuse_rename_in *arg = (const fuse_rename_in*)arg_; oldname = PARAM(arg); newname = (oldname + strlen(oldname) + 1); @@ -464,7 +466,7 @@ void debug_fuse_link_in(const void *arg_) { const char *name; - const struct fuse_link_in *arg = arg_; + const struct fuse_link_in *arg = (const fuse_link_in*)arg_; name = PARAM(arg); @@ -483,7 +485,7 @@ void debug_fuse_create_in(const void *arg_) { const char *name; - const struct fuse_create_in *arg = arg_; + const struct fuse_create_in *arg = (const fuse_create_in*)arg_; name = PARAM(arg); @@ -505,7 +507,7 @@ static void debug_fuse_open_in(const void *arg_) { - const struct fuse_open_in *arg = arg_; + const struct fuse_open_in *arg = (const fuse_open_in*)arg_; fprintf(g_OUTPUT, "fuse_open_in:" @@ -519,15 +521,15 @@ static void debug_fuse_read_in(const void *arg_) { - const struct fuse_read_in *arg = arg_; + const struct fuse_read_in *arg = (const fuse_read_in*)arg_; fprintf(g_OUTPUT, "fuse_read_in:" - " fh=0x%"PRIx64";" + " fh=0x%" PRIx64 ";" " offset=%zu;" " size=%u;" " read_flags=%X;" - " lock_owner=0x%"PRIx64";" + " lock_owner=0x%" PRIx64 ";" " flags=0x%X (" , arg->fh, @@ -544,14 +546,14 @@ static void debug_fuse_write_in(const void *arg_) { - const struct fuse_write_in *arg = arg_; + const struct fuse_write_in *arg = (const fuse_write_in*)arg_; fprintf(g_OUTPUT, "fuse_write_in:" - " fh=0x%"PRIx64";" + " fh=0x%" PRIx64 ";" " offset=%zu;" " size=%u;" - " lock_owner=0x%"PRIx64";" + " lock_owner=0x%" PRIx64 ";" " flags=0x%X (" , arg->fh, @@ -563,7 +565,7 @@ debug_fuse_write_in(const void *arg_) fprintf(g_OUTPUT, "); write_flags=0x%X (", arg->write_flags); - for(int i = 0; i < (sizeof(arg->write_flags) * 8); i++) + for(size_t i = 0; i < (sizeof(arg->write_flags) * 8); i++) { const char *str; @@ -583,12 +585,12 @@ static void debug_fuse_flush_in(const void *arg_) { - const struct fuse_flush_in *arg = arg_; + const struct fuse_flush_in *arg = (const fuse_flush_in*)arg_; fprintf(g_OUTPUT, "fuse_flush_in:" - " fh=0x%"PRIx64";" - " lock_owner=0x%"PRIx64";" + " fh=0x%" PRIx64 ";" + " lock_owner=0x%" PRIx64 ";" "\n" , arg->fh, @@ -599,13 +601,13 @@ static void debug_fuse_release_in(const void *arg_) { - const struct fuse_release_in *arg = arg_; + const struct fuse_release_in *arg = (const fuse_release_in*)arg_; fprintf(g_OUTPUT, "fuse_release_in:" - " fh=0x%"PRIx64";" + " fh=0x%" PRIx64 ";" " release_flags=0x%X;" - " lock_owner=0x%"PRIx64";" + " lock_owner=0x%" PRIx64 ";" " flags=0x%X (" , arg->fh, @@ -620,11 +622,11 @@ static void debug_fuse_fsync_in(const void *arg_) { - const struct fuse_fsync_in *arg = arg_; + const struct fuse_fsync_in *arg = (const fuse_fsync_in*)arg_; fprintf(g_OUTPUT, "fuse_fsync_in:" - " fh=0x%"PRIx64";" + " fh=0x%" PRIx64 ";" " fsync_flags=0x%X;" "\n" , @@ -638,7 +640,7 @@ debug_fuse_setxattr_in(const void *arg_) { const char *name; const char *value; - const struct fuse_setxattr_in *arg = arg_; + const struct fuse_setxattr_in *arg = (const fuse_setxattr_in*)arg_; name = PARAM(arg); value = (name + strlen(name) + 1); @@ -662,7 +664,7 @@ void debug_fuse_getxattr_in(const void *arg_) { const char *name; - const struct fuse_getxattr_in *arg = arg_; + const struct fuse_getxattr_in *arg = (const fuse_getxattr_in*)arg_; name = PARAM(arg); @@ -680,7 +682,7 @@ static void debug_fuse_listxattr(const void *arg_) { - const struct fuse_getxattr_in *arg = arg_; + const struct fuse_getxattr_in *arg = (const fuse_getxattr_in*)arg_; fprintf(g_OUTPUT, "fuse_listxattr:" @@ -694,7 +696,7 @@ static void debug_fuse_removexattr(const void *arg_) { - const char *name = arg_; + const char *name = (const char*)arg_; fprintf(g_OUTPUT, "fuse_removexattr:" @@ -708,11 +710,11 @@ static void debug_fuse_fallocate_in(const void *arg_) { - const struct fuse_fallocate_in *arg = arg_; + const struct fuse_fallocate_in *arg = (const fuse_fallocate_in*)arg_; fprintf(g_OUTPUT, "fuse_fallocate_in:" - " fh=0x%"PRIx64";" + " fh=0x%" PRIx64 ";" " offset=%zu;" " length=%zu;" " mode=%o;" @@ -766,10 +768,10 @@ debug_fuse_init_out(const uint64_t unique_, flags = (((uint64_t)arg->flags) | ((uint64_t)arg->flags2) << 32); fprintf(g_OUTPUT, - /* "unique=0x%016"PRIx64";" */ + /* "unique=0x%016" PRIx64 ";" */ /* " opcode=RESPONSE;" */ /* " error=0 (Success);" */ - /* " len=%"PRIu64"; || " */ + /* " len=%" PRIu64 "; || " */ "FUSE_INIT_OUT:" " major=%u;" " minor=%u;" @@ -819,14 +821,14 @@ debug_fuse_attr(const struct fuse_attr *attr_) { fprintf(g_OUTPUT, "attr:" - " ino=0x%016"PRIx64";" - " size=%"PRIu64";" - " blocks=%"PRIu64";" - " atime=%"PRIu64";" + " ino=0x%016" PRIx64 ";" + " size=%" PRIu64 ";" + " blocks=%" PRIu64 ";" + " atime=%" PRIu64 ";" " atimensec=%u;" - " mtime=%"PRIu64";" + " mtime=%" PRIu64 ";" " mtimensec=%u;" - " ctime=%"PRIu64";" + " ctime=%" PRIu64 ";" " ctimesec=%u;" " mode=%o;" " nlink=%u;" @@ -858,11 +860,11 @@ debug_fuse_entry(const struct fuse_entry_out *entry_) { fprintf(g_OUTPUT, " fuse_entry_out:" - " nodeid=0x%016"PRIx64";" - " generation=0x%016"PRIx64";" - " entry_valid=%"PRIu64";" + " nodeid=0x%016" PRIx64 ";" + " generation=0x%016" PRIx64 ";" + " entry_valid=%" PRIu64 ";" " entry_valid_nsec=%u;" - " attr_valid=%"PRIu64";" + " attr_valid=%" PRIu64 ";" " attr_valid_nsec=%u;" " ", entry_->nodeid, @@ -880,10 +882,10 @@ debug_fuse_entry_out(const uint64_t unique_, const uint64_t argsize_) { fprintf(g_OUTPUT, - "unique=0x%016"PRIx64";" + "unique=0x%016" PRIx64 ";" " opcode=RESPONSE;" " error=0 (Success);" - " len=%"PRIu64"; || " + " len=%" PRIu64 "; || " , unique_, sizeof(struct fuse_out_header) + argsize_); @@ -897,10 +899,10 @@ debug_fuse_attr_out(const uint64_t unique_, const uint64_t argsize_) { fprintf(g_OUTPUT, - "unique=0x%016"PRIx64";" + "unique=0x%016" PRIx64 ";" " opcode=RESPONSE;" " error=0 (Success);" - " len=%"PRIu64"; || " + " len=%" PRIu64 "; || " "fuse_attr_out:" " attr_valid=%zu;" " attr_valid_nsec=%u;" @@ -945,11 +947,11 @@ static void debug_fuse_interrupt_in(const void *arg_) { - const struct fuse_interrupt_in *arg = arg_; + const struct fuse_interrupt_in *arg = (const fuse_interrupt_in*)arg_; fprintf(g_OUTPUT, "fuse_interrupt_in:" - " unique=0x%016"PRIx64";" + " unique=0x%016" PRIx64 ";" "\n" , arg->unique); @@ -962,53 +964,54 @@ opcode_name(enum fuse_opcode op_) { static const char *names[] = { - [FUSE_LOOKUP] = "LOOKUP", - [FUSE_FORGET] = "FORGET", - [FUSE_GETATTR] = "GETATTR", - [FUSE_SETATTR] = "SETATTR", - [FUSE_READLINK] = "READLINK", - [FUSE_SYMLINK] = "SYMLINK", - [FUSE_MKNOD] = "MKNOD", - [FUSE_MKDIR] = "MKDIR", - [FUSE_UNLINK] = "UNLINK", - [FUSE_RMDIR] = "RMDIR", - [FUSE_RENAME] = "RENAME", - [FUSE_LINK] = "LINK", - [FUSE_OPEN] = "OPEN", - [FUSE_READ] = "READ", - [FUSE_WRITE] = "WRITE", - [FUSE_STATFS] = "STATFS", - [FUSE_RELEASE] = "RELEASE", - [FUSE_FSYNC] = "FSYNC", - [FUSE_SETXATTR] = "SETXATTR", - [FUSE_GETXATTR] = "GETXATTR", - [FUSE_LISTXATTR] = "LISTXATTR", - [FUSE_REMOVEXATTR] = "REMOVEXATTR", - [FUSE_FLUSH] = "FLUSH", - [FUSE_INIT] = "INIT", - [FUSE_OPENDIR] = "OPENDIR", - [FUSE_READDIR] = "READDIR", - [FUSE_RELEASEDIR] = "RELEASEDIR", - [FUSE_FSYNCDIR] = "FSYNCDIR", - [FUSE_GETLK] = "GETLK", - [FUSE_SETLK] = "SETLK", - [FUSE_SETLKW] = "SETLKW", - [FUSE_ACCESS] = "ACCESS", - [FUSE_CREATE] = "CREATE", - [FUSE_INTERRUPT] = "INTERRUPT", - [FUSE_BMAP] = "BMAP", - [FUSE_DESTROY] = "DESTROY", - [FUSE_IOCTL] = "IOCTL", - [FUSE_POLL] = "POLL", - [FUSE_NOTIFY_REPLY] = "NOTIFY_REPLY", - [FUSE_BATCH_FORGET] = "BATCH_FORGET", - [FUSE_FALLOCATE] = "FALLOCATE", - [FUSE_READDIRPLUS] = "READDIRPLUS", - [FUSE_RENAME2] = "RENAME2", - [FUSE_LSEEK] = "LSEEK", - [FUSE_COPY_FILE_RANGE] = "COPY_FILE_RANGE", - [FUSE_SETUPMAPPING] = "SETUPMAPPING", - [FUSE_REMOVEMAPPING] = "REMOVEMAPPING" + "INVALID", + "LOOKUP", + "FORGET", + "GETATTR", + "SETATTR", + "READLINK", + "SYMLINK", + "MKNOD", + "MKDIR", + "UNLINK", + "RMDIR", + "RENAME", + "LINK", + "OPEN", + "READ", + "WRITE", + "STATFS", + "RELEASE", + "FSYNC", + "SETXATTR", + "GETXATTR", + "LISTXATTR", + "REMOVEXATTR", + "FLUSH", + "INIT", + "OPENDIR", + "READDIR", + "RELEASEDIR", + "FSYNCDIR", + "GETLK", + "SETLK", + "SETLKW", + "ACCESS", + "CREATE", + "INTERRUPT", + "BMAP", + "DESTROY", + "IOCTL", + "POLL", + "NOTIFY_REPLY", + "BATCH_FORGET", + "FALLOCATE", + "READDIRPLUS", + "RENAME2", + "LSEEK", + "COPY_FILE_RANGE", + "SETUPMAPPING", + "REMOVEMAPPING" }; if(op_ >= (sizeof(names) / sizeof(names[0]))) @@ -1023,14 +1026,14 @@ debug_fuse_in_header(const struct fuse_in_header *hdr_) const void *arg = &hdr_[1]; fprintf(stderr, - "unique=0x%016"PRIx64";" + "unique=0x%016" PRIx64 ";" " opcode=%s (%u);" " nodeid=%zu;" " uid=%u;" " gid=%u;" " pid=%u; || ", hdr_->unique, - opcode_name(hdr_->opcode), + opcode_name((fuse_opcode)hdr_->opcode), hdr_->opcode, hdr_->nodeid, hdr_->uid, @@ -1043,7 +1046,7 @@ debug_fuse_in_header(const struct fuse_in_header *hdr_) debug_fuse_lookup(arg); break; case FUSE_INIT: - debug_fuse_init_in(arg); + debug_fuse_init_in((const fuse_init_in*)arg); break; case FUSE_GETATTR: debug_fuse_getattr_in(arg); @@ -1136,10 +1139,10 @@ void debug_fuse_out_header(const struct fuse_out_header *hdr_) { fprintf(g_OUTPUT, - "unique=0x%016"PRIx64";" + "unique=0x%016" PRIx64 ";" " opcode=RESPONSE;" " error=%d (%s);" - " len=%"PRIu64";" + " len=%" PRIu64 ";" , hdr_->unique, hdr_->error, @@ -1153,10 +1156,10 @@ debug_fuse_entry_open_out(const uint64_t unique_, const struct fuse_open_out *open_) { fprintf(g_OUTPUT, - "unique=0x%016"PRIx64";" + "unique=0x%016" PRIx64 ";" " opcode=RESPONSE;" " error=0 (Success);" - " len=%"PRIu64"; || " + " len=%" PRIu64 "; || " , unique_, sizeof(struct fuse_entry_out) + sizeof(struct fuse_open_out)); @@ -1169,10 +1172,10 @@ debug_fuse_readlink(const uint64_t unique_, const char *linkname_) { fprintf(g_OUTPUT, - "unique=0x%016"PRIx64";" + "unique=0x%016" PRIx64 ";" " opcode=RESPONSE;" " error=0 (Success);" - " len=%"PRIu64"; || " + " len=%" PRIu64 "; || " "readlink: linkname=%s" "\n" , @@ -1186,10 +1189,10 @@ debug_fuse_write_out(const uint64_t unique_, const struct fuse_write_out *arg_) { fprintf(g_OUTPUT, - "unique=0x%016"PRIx64";" + "unique=0x%016" PRIx64 ";" " opcode=RESPONSE;" " error=0 (Success);" - " len=%"PRIu64"; || " + " len=%" PRIu64 "; || " " fuse_write_out:" " size=%u" "\n" @@ -1204,16 +1207,16 @@ debug_fuse_statfs_out(const uint64_t unique_, const struct fuse_statfs_out *arg_) { fprintf(g_OUTPUT, - "unique=0x%016"PRIx64";" + "unique=0x%016" PRIx64 ";" " opcode=RESPONSE;" " error=0 (Success);" - " len=%"PRIu64"; || " + " len=%" PRIu64 "; || " " fuse_statfs_out:" - " blocks=%"PRIu64";" - " bfree=%"PRIu64";" - " bavail=%"PRIu64";" - " files=%"PRIu64";" - " ffree=%"PRIu64";" + " blocks=%" PRIu64 ";" + " bfree=%" PRIu64 ";" + " bavail=%" PRIu64 ";" + " files=%" PRIu64 ";" + " ffree=%" PRIu64 ";" " bsize=%u;" " namelen=%u;" " frsize=%u;" @@ -1236,10 +1239,10 @@ debug_fuse_getxattr_out(const uint64_t unique_, const struct fuse_getxattr_out *arg_) { fprintf(g_OUTPUT, - "unique=0x%016"PRIx64";" + "unique=0x%016" PRIx64 ";" " opcode=RESPONSE;" " error=0 (Success);" - " len=%"PRIu64"; || " + " len=%" PRIu64 "; || " " fuse_getxattr_out:" " size=%u;" "\n" @@ -1255,13 +1258,13 @@ debug_fuse_lk_out(const uint64_t unique_, const struct fuse_lk_out *arg_) { fprintf(g_OUTPUT, - "unique=0x%016"PRIx64";" + "unique=0x%016" PRIx64 ";" " opcode=RESPONSE;" " error=0 (Success);" - " len=%"PRIu64"; || " + " len=%" PRIu64 "; || " " fuse_file_lock:" - " start=%"PRIu64";" - " end=%"PRIu64";" + " start=%" PRIu64 ";" + " end=%" PRIu64 ";" " type=%u;" " pid=%u;" "\n" @@ -1279,12 +1282,12 @@ debug_fuse_bmap_out(const uint64_t unique_, const struct fuse_bmap_out *arg_) { fprintf(g_OUTPUT, - "unique=0x%016"PRIx64";" + "unique=0x%016" PRIx64 ";" " opcode=RESPONSE;" " error=0 (Success);" - " len=%"PRIu64"; || " + " len=%" PRIu64 "; || " " fuse_bmap_out:" - " block=%"PRIu64";" + " block=%" PRIu64 ";" "\n" , unique_, diff --git a/libfuse/lib/debug.h b/libfuse/lib/debug.hpp similarity index 100% rename from libfuse/lib/debug.h rename to libfuse/lib/debug.hpp diff --git a/libfuse/lib/fuse_lowlevel.c b/libfuse/lib/fuse_lowlevel.cpp similarity index 90% rename from libfuse/lib/fuse_lowlevel.c rename to libfuse/lib/fuse_lowlevel.cpp index 9dca4c93..f3cf5e4f 100644 --- a/libfuse/lib/fuse_lowlevel.c +++ b/libfuse/lib/fuse_lowlevel.cpp @@ -6,12 +6,14 @@ See the file COPYING.LIB */ +#ifndef _GNU_SOURCE #define _GNU_SOURCE +#endif #include "lfmp.h" #include "config.h" -#include "debug.h" +#include "debug.hpp" #include "fuse_i.h" #include "fuse_kernel.h" #include "fuse_opt.h" @@ -41,7 +43,7 @@ #define OFFSET_MAX 0x7fffffffffffffffLL #define container_of(ptr, type, member) ({ \ - const typeof( ((type*)0)->member ) *__mptr = (ptr); \ + const decltype( ((type*)0)->member ) *__mptr = (ptr); \ (type *)( (char*)__mptr - offsetof(type,member) );}) static size_t pagesize; @@ -135,7 +137,7 @@ fuse_send_msg(struct fuse_ll *f, int count) { int rv; - struct fuse_out_header *out = iov[0].iov_base; + struct fuse_out_header *out = (fuse_out_header*)iov[0].iov_base; out->len = iov_length(iov, count); @@ -410,7 +412,7 @@ fuse_send_data_iov_fallback(struct fuse_ll *f, return -ENOMEM; mem_buf.buf[0].mem = msgbuf->mem; - res = fuse_buf_copy(&mem_buf, buf, 0); + res = fuse_buf_copy(&mem_buf, buf, (fuse_buf_copy_flags)0); if(res < 0) { msgbuf_free(msgbuf); @@ -550,7 +552,7 @@ fuse_ioctl_iovec_copy(const struct iovec *iov, struct fuse_ioctl_iovec *fiov; size_t i; - fiov = malloc(sizeof(fiov[0]) * count); + fiov = (fuse_ioctl_iovec*)malloc(sizeof(fiov[0]) * count); if(!fiov) return NULL; @@ -683,7 +685,7 @@ fuse_reply_ioctl_iov(fuse_req_t req, struct fuse_ioctl_out arg = {0}; int res; - padded_iov = malloc((count + 2) * sizeof(struct iovec)); + padded_iov = (iovec*)malloc((count + 2) * sizeof(struct iovec)); if(padded_iov == NULL) return fuse_reply_err(req, ENOMEM); @@ -896,8 +898,8 @@ do_readdir(fuse_req_t req, static void -do_readdir_plus(fuse_req_t req_, - struct fuse_in_header *hdr_) +do_readdirplus(fuse_req_t req_, + struct fuse_in_header *hdr_) { req_->f->op.readdir_plus(req_,hdr_); } @@ -1403,6 +1405,33 @@ do_tmpfile(fuse_req_t req_, req_->f->op.tmpfile(req_,hdr_); } +static +void +do_statx(fuse_req_t req_, + struct fuse_in_header *hdr_) +{ + printf("statx\n"); + req_->f->op.statx(req_,hdr_); +} + +static +void +do_rename2(fuse_req_t req_, + struct fuse_in_header *hdr_) +{ + printf("rename2\n"); + req_->f->op.rename2(req_,hdr_); +} + +static +void +do_lseek(fuse_req_t req_, + struct fuse_in_header *hdr_) +{ + printf("lseek\n"); + req_->f->op.lseek(req_,hdr_); +} + static int send_notify_iov(struct fuse_ll *f, @@ -1624,7 +1653,7 @@ fuse_lowlevel_notify_retrieve(struct fuse_chan *ch, if(f->conn.proto_minor < 15) return -ENOSYS; - rreq = malloc(sizeof(*rreq)); + rreq = (fuse_retrieve_req*)malloc(sizeof(*rreq)); if(rreq == NULL) return -ENOMEM; @@ -1668,61 +1697,66 @@ fuse_req_ctx(fuse_req_t req) return &req->ctx; } -static struct { - void (*func)(fuse_req_t, struct fuse_in_header *); - const char *name; -} fuse_ll_ops[] = + +typedef void (*fuse_ll_func)(fuse_req_t, struct fuse_in_header *); +const +fuse_ll_func +fuse_ll_funcs[] = { - [FUSE_LOOKUP] = { do_lookup, "LOOKUP" }, - [FUSE_FORGET] = { do_forget, "FORGET" }, - [FUSE_GETATTR] = { do_getattr, "GETATTR" }, - [FUSE_SETATTR] = { do_setattr, "SETATTR" }, - [FUSE_READLINK] = { do_readlink, "READLINK" }, - [FUSE_SYMLINK] = { do_symlink, "SYMLINK" }, - [FUSE_MKNOD] = { do_mknod, "MKNOD" }, - [FUSE_MKDIR] = { do_mkdir, "MKDIR" }, - [FUSE_UNLINK] = { do_unlink, "UNLINK" }, - [FUSE_RMDIR] = { do_rmdir, "RMDIR" }, - [FUSE_RENAME] = { do_rename, "RENAME" }, - [FUSE_LINK] = { do_link, "LINK" }, - [FUSE_OPEN] = { do_open, "OPEN" }, - [FUSE_READ] = { do_read, "READ" }, - [FUSE_WRITE] = { do_write, "WRITE" }, - [FUSE_STATFS] = { do_statfs, "STATFS" }, - [FUSE_RELEASE] = { do_release, "RELEASE" }, - [FUSE_FSYNC] = { do_fsync, "FSYNC" }, - [FUSE_SETXATTR] = { do_setxattr, "SETXATTR" }, - [FUSE_GETXATTR] = { do_getxattr, "GETXATTR" }, - [FUSE_LISTXATTR] = { do_listxattr, "LISTXATTR" }, - [FUSE_REMOVEXATTR] = { do_removexattr, "REMOVEXATTR" }, - [FUSE_FLUSH] = { do_flush, "FLUSH" }, - [FUSE_INIT] = { do_init, "INIT" }, - [FUSE_OPENDIR] = { do_opendir, "OPENDIR" }, - [FUSE_READDIR] = { do_readdir, "READDIR" }, - [FUSE_READDIRPLUS] = { do_readdir_plus, "READDIR_PLUS" }, - [FUSE_RELEASEDIR] = { do_releasedir, "RELEASEDIR" }, - [FUSE_FSYNCDIR] = { do_fsyncdir, "FSYNCDIR" }, - [FUSE_GETLK] = { do_getlk, "GETLK" }, - [FUSE_SETLK] = { do_setlk, "SETLK" }, - [FUSE_SETLKW] = { do_setlkw, "SETLKW" }, - [FUSE_ACCESS] = { do_access, "ACCESS" }, - [FUSE_CREATE] = { do_create, "CREATE" }, - [FUSE_INTERRUPT] = { do_interrupt, "INTERRUPT" }, - [FUSE_BMAP] = { do_bmap, "BMAP" }, - [FUSE_IOCTL] = { do_ioctl, "IOCTL" }, - [FUSE_POLL] = { do_poll, "POLL" }, - [FUSE_FALLOCATE] = { do_fallocate, "FALLOCATE" }, - [FUSE_DESTROY] = { do_destroy, "DESTROY" }, - [FUSE_NOTIFY_REPLY] = { do_notify_reply, "NOTIFY_REPLY" }, - [FUSE_BATCH_FORGET] = { do_batch_forget, "BATCH_FORGET" }, - [FUSE_COPY_FILE_RANGE] = { do_copy_file_range, "COPY_FILE_RANGE" }, - [FUSE_SETUPMAPPING] = { do_setupmapping, "SETUPMAPPING" }, - [FUSE_REMOVEMAPPING] = { do_removemapping, "REMOVEMAPPING" }, - [FUSE_SYNCFS] = { do_syncfs, "SYNCFS" }, - [FUSE_TMPFILE] = { do_tmpfile, "TMPFILE" } + NULL, + do_lookup, + do_forget, + do_getattr, + do_setattr, + do_readlink, + do_symlink, + do_mknod, + do_mkdir, + do_unlink, + do_rmdir, + do_rename, + do_link, + do_open, + do_read, + do_write, + do_statfs, + do_release, + do_fsync, + do_setxattr, + do_getxattr, + do_listxattr, + do_removexattr, + do_flush, + do_init, + do_opendir, + do_readdir, + do_releasedir, + do_fsyncdir, + do_getlk, + do_setlk, + do_setlkw, + do_access, + do_create, + do_interrupt, + do_bmap, + do_destroy, + do_ioctl, + do_poll, + do_notify_reply, + do_batch_forget, + do_fallocate, + do_readdirplus, + do_rename2, + do_lseek, + do_copy_file_range, + do_setupmapping, + do_removemapping, + do_syncfs, + do_tmpfile, + do_statx }; -#define FUSE_MAXOP (sizeof(fuse_ll_ops) / sizeof(fuse_ll_ops[0])) +#define FUSE_MAXOPS (sizeof(fuse_ll_funcs) / sizeof(fuse_ll_funcs[0])) enum { KEY_HELP, @@ -1816,7 +1850,7 @@ fuse_ll_destroy(void *data) f->op.destroy(f->userdata); } - llp = pthread_getspecific(f->pipe_key); + llp = (fuse_ll_pipe*)pthread_getspecific(f->pipe_key); if(llp != NULL) fuse_ll_pipe_free(llp); pthread_key_delete(f->pipe_key); @@ -1830,7 +1864,7 @@ static void fuse_ll_pipe_destructor(void *data) { - struct fuse_ll_pipe *llp = data; + struct fuse_ll_pipe *llp = (fuse_ll_pipe*)data; fuse_ll_pipe_free(llp); } @@ -1872,7 +1906,7 @@ fuse_ll_buf_receive_read(struct fuse_session *se_, if(rv == -1) return -errno; - if(rv < sizeof(struct fuse_in_header)) + if(rv < (int)sizeof(struct fuse_in_header)) { fprintf(stderr, "short read from fuse device\n"); return -EIO; @@ -1905,12 +1939,12 @@ fuse_ll_buf_process_read(struct fuse_session *se_, req->ch = se_->ch; err = ENOSYS; - if(in->opcode >= FUSE_MAXOP) + if(in->opcode >= FUSE_MAXOPS) goto reply_err; - if(fuse_ll_ops[in->opcode].func == NULL) + if(fuse_ll_funcs[in->opcode] == NULL) goto reply_err; - fuse_ll_ops[in->opcode].func(req, in); + fuse_ll_funcs[in->opcode](req, in); return; @@ -1943,12 +1977,12 @@ fuse_ll_buf_process_read_init(struct fuse_session *se_, err = EIO; if(in->opcode != FUSE_INIT) goto reply_err; - if(fuse_ll_ops[in->opcode].func == NULL) + if(fuse_ll_funcs[in->opcode] == NULL) goto reply_err; se_->process_buf = fuse_ll_buf_process_read; - fuse_ll_ops[in->opcode].func(req, in); + fuse_ll_funcs[in->opcode](req, in); return; @@ -2007,9 +2041,9 @@ fuse_lowlevel_new_common(struct fuse_args *args, f->userdata = userdata; se = fuse_session_new(f, - fuse_ll_buf_receive_read, - fuse_ll_buf_process_read_init, - fuse_ll_destroy); + (void*)fuse_ll_buf_receive_read, + (void*)fuse_ll_buf_process_read_init, + (void*)fuse_ll_destroy); if(!se) goto out_key_destroy;