a whole lot of crap
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
index 4e5c2ac..3cc49f0 100644
--- a/lib/fuse_lowlevel.c
+++ b/lib/fuse_lowlevel.c
@@ -188,6 +188,7 @@
struct fuse_kstatfs *kstatfs)
{
kstatfs->bsize = stbuf->f_bsize;
+ kstatfs->frsize = stbuf->f_frsize;
kstatfs->blocks = stbuf->f_blocks;
kstatfs->bfree = stbuf->f_bfree;
kstatfs->bavail = stbuf->f_bavail;
@@ -258,6 +259,11 @@
{
struct fuse_entry_out arg;
+ /* before ABI 7.4 e->ino == 0 was invalid, only ENOENT meant
+ negative entry */
+ if (!e->ino && req->f->minor < 4)
+ return fuse_reply_err(req, ENOENT);
+
memset(&arg, 0, sizeof(arg));
fill_entry(&arg, e);
return send_reply_ok(req, &arg, sizeof(arg));
@@ -322,11 +328,12 @@
int fuse_reply_statfs(fuse_req_t req, const struct statvfs *stbuf)
{
struct fuse_statfs_out arg;
+ size_t size = req->f->minor < 4 ? FUSE_COMPAT_STATFS_SIZE : sizeof(arg);
memset(&arg, 0, sizeof(arg));
convert_statfs(stbuf, &arg.st);
- return send_reply_ok(req, &arg, sizeof(arg));
+ return send_reply_ok(req, &arg, size);
}
int fuse_reply_xattr(fuse_req_t req, size_t count)
@@ -690,11 +697,11 @@
f->op.init(f->userdata);
f->major = FUSE_KERNEL_VERSION;
- f->minor = FUSE_KERNEL_MINOR_VERSION;
+ f->minor = arg->minor;
memset(&outarg, 0, sizeof(outarg));
outarg.major = f->major;
- outarg.minor = f->minor;
+ outarg.minor = FUSE_KERNEL_MINOR_VERSION;
if (f->debug) {
printf(" INIT: %u.%u\n", outarg.major, outarg.minor);
@@ -976,16 +983,16 @@
arg->open_flags |= FOPEN_KEEP_CACHE;
}
-static void convert_statfs_compat(const struct statfs *stbuf,
- struct fuse_kstatfs *kstatfs)
+static void convert_statfs_compat(const struct statfs *compatbuf,
+ struct statvfs *buf)
{
- kstatfs->bsize = stbuf->f_bsize;
- kstatfs->blocks = stbuf->f_blocks;
- kstatfs->bfree = stbuf->f_bfree;
- kstatfs->bavail = stbuf->f_bavail;
- kstatfs->files = stbuf->f_files;
- kstatfs->ffree = stbuf->f_ffree;
- kstatfs->namelen = stbuf->f_namelen;
+ buf->f_bsize = compatbuf->f_bsize;
+ buf->f_blocks = compatbuf->f_blocks;
+ buf->f_bfree = compatbuf->f_bfree;
+ buf->f_bavail = compatbuf->f_bavail;
+ buf->f_files = compatbuf->f_files;
+ buf->f_ffree = compatbuf->f_ffree;
+ buf->f_namemax = compatbuf->f_namelen;
}
int fuse_reply_open_compat(fuse_req_t req,
@@ -1000,16 +1007,16 @@
int fuse_reply_statfs_compat(fuse_req_t req, const struct statfs *stbuf)
{
- struct fuse_statfs_out arg;
+ struct statvfs newbuf;
- memset(&arg, 0, sizeof(arg));
- convert_statfs_compat(stbuf, &arg.st);
+ memset(&newbuf, 0, sizeof(newbuf));
+ convert_statfs_compat(stbuf, &newbuf);
- return send_reply_ok(req, &arg, sizeof(arg));
+ return fuse_reply_statfs(req, &newbuf);
}
__asm__(".symver fuse_reply_statfs_compat,fuse_reply_statfs@FUSE_2.4");
__asm__(".symver fuse_reply_open_compat,fuse_reply_open@FUSE_2.4");
-#endif __FreeBSD__
+#endif /* __FreeBSD__ */