diff --git a/src/dll/fuse/fuse.c b/src/dll/fuse/fuse.c index b3b522f7..d742642d 100644 --- a/src/dll/fuse/fuse.c +++ b/src/dll/fuse/fuse.c @@ -376,6 +376,15 @@ static NTSTATUS fsp_fuse_svcstart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv) &f->VolumeParams.VolumeCreationTime); } } + if (0 != f->ops.readlink) + { + char buf[FSP_FSCTL_TRANSACT_PATH_SIZEMAX / sizeof(WCHAR)]; + int err; + + /* this should always fail with ENOSYS or EINVAL */ + err = f->ops.readlink("/", buf, sizeof buf); + f->has_symlinks = -ENOSYS != err; + } /* the FSD does not currently limit these VolumeParams fields; do so here! */ if (f->VolumeParams.SectorSize < FSP_FUSE_SECTORSIZE_MIN || diff --git a/src/dll/fuse/library.h b/src/dll/fuse/library.h index 12474be7..96e7c962 100644 --- a/src/dll/fuse/library.h +++ b/src/dll/fuse/library.h @@ -29,7 +29,7 @@ #define FSP_FUSE_CONTEXT_FROM_HDR(h) \ (struct fuse_context *)((PUINT8)(h) + sizeof(struct fsp_fuse_context_header)) -#define FSP_FUSE_HAS_SYMLINKS(f) (0 != (f)->ops.readlink) +#define FSP_FUSE_HAS_SYMLINKS(f) ((f)->has_symlinks) struct fuse { @@ -44,6 +44,7 @@ struct fuse void *data; unsigned conn_want; BOOLEAN fsinit; + BOOLEAN has_symlinks; UINT32 DebugLog; FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY OpGuardStrategy; FSP_FSCTL_VOLUME_PARAMS VolumeParams;