From 0d819eb8002e031bb1a8f245fe37fac9a413d115 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Wed, 25 Jul 2018 10:28:33 -0700 Subject: [PATCH] dll: fuse3: testing --- src/dll/fuse/fuse_intf.c | 3 ++- src/dll/fuse/library.h | 2 ++ src/dll/fuse3/fuse2to3.c | 20 ++++++++++++++++++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/dll/fuse/fuse_intf.c b/src/dll/fuse/fuse_intf.c index 084f7e55..c3fab0d5 100644 --- a/src/dll/fuse/fuse_intf.c +++ b/src/dll/fuse/fuse_intf.c @@ -1427,7 +1427,8 @@ static NTSTATUS fsp_fuse_intf_SetFileSize(FSP_FILE_SYSTEM *FileSystem, return STATUS_SUCCESS; } -static int fsp_fuse_intf_CanDeleteAddDirInfo(void *buf, const char *name, +/* !static: used by fuse2to3 */ +int fsp_fuse_intf_CanDeleteAddDirInfo(void *buf, const char *name, const struct fuse_stat *stbuf, fuse_off_t off) { struct fuse_dirhandle *dh = buf; diff --git a/src/dll/fuse/library.h b/src/dll/fuse/library.h index c7b544cb..03ef9c54 100644 --- a/src/dll/fuse/library.h +++ b/src/dll/fuse/library.h @@ -90,6 +90,8 @@ NTSTATUS fsp_fuse_op_enter(FSP_FILE_SYSTEM *FileSystem, NTSTATUS fsp_fuse_op_leave(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +int fsp_fuse_intf_CanDeleteAddDirInfo(void *buf, const char *name, + const struct fuse_stat *stbuf, fuse_off_t off); int fsp_fuse_intf_AddDirInfo(void *buf, const char *name, const struct fuse_stat *stbuf, fuse_off_t off); diff --git a/src/dll/fuse3/fuse2to3.c b/src/dll/fuse3/fuse2to3.c index ead8de3b..2ba6026f 100644 --- a/src/dll/fuse3/fuse2to3.c +++ b/src/dll/fuse3/fuse2to3.c @@ -235,6 +235,13 @@ static int fuse2to3_opendir(const char *path, struct fuse_file_info *fi) return res; } +static int fuse2to3_candel_filldir(void *buf, const char *name, + const struct fuse_stat *stbuf, fuse_off_t off, + enum fuse3_fill_dir_flags flags) +{ + return fsp_fuse_intf_CanDeleteAddDirInfo(buf, name, 0, off); +} + static int fuse2to3_filldir(void *buf, const char *name, const struct fuse_stat *stbuf, fuse_off_t off, enum fuse3_fill_dir_flags flags) @@ -251,8 +258,17 @@ static int fuse2to3_readdir(const char *path, void *buf, fuse_fill_dir_t filler, struct fuse_dirhandle *dh = buf; struct fuse3_file_info fi3; fuse2to3_fi3from2(&fi3, fi); - int res = f3->ops.readdir(path, buf, &fuse2to3_filldir, off, &fi3, - dh->ReaddirPlus ? FUSE_READDIR_PLUS : 0); + int res; + if (fsp_fuse_intf_CanDeleteAddDirInfo == filler) + res = f3->ops.readdir(path, buf, &fuse2to3_candel_filldir, off, &fi3, 0); + else if (fsp_fuse_intf_AddDirInfo == filler) + res = f3->ops.readdir(path, buf, &fuse2to3_filldir, off, &fi3, + dh->ReaddirPlus ? FUSE_READDIR_PLUS : 0); + else + { + FspDebugLog("fuse2to3_readdir = -ENOSYS (internal error: unknown filler)\n"); + res = -ENOSYS_(f3->fuse->env); + } fuse2to3_fi2from3(fi, &fi3); return res; }