+2006-09-22 Miklos Szeredi <miklos@szeredi.hu>
+
+ * Fix compatibility bugs in low level interface. Reported by
+ Ricardo Correia
+
+ * Add workaround for ARM caching bug
+
2006-09-16 Miklos Szeredi <miklos@szeredi.hu>
* Rename new utimes() method to more logical utimens()
# define fuse_new fuse_new_compat22
# define fuse_setup fuse_setup_compat22
# define fuse_operations fuse_operations_compat22
-# define fuse_file_info fuse_file_info_compat22
+# define fuse_file_info fuse_file_info_compat
# elif FUSE_USE_VERSION == 24
# error Compatibility with high-level API version 24 not supported
# else
/* these definitions provide source compatibility to prior versions.
Do not include this file directly! */
+struct fuse_file_info_compat {
+ int flags;
+ unsigned long fh;
+ int writepage;
+ unsigned int direct_io : 1;
+ unsigned int keep_cache : 1;
+};
+
int fuse_mount_compat25(const char *mountpoint, struct fuse_args *args);
int fuse_mount_compat22(const char *mountpoint, const char *opts);
#ifndef __FreeBSD__
#include <sys/statfs.h>
-struct fuse_file_info_compat22 {
- int flags;
- unsigned long fh;
- int writepage;
- unsigned int direct_io : 1;
- unsigned int keep_cache : 1;
-};
-
struct fuse_operations_compat22 {
int (*getattr) (const char *, struct stat *);
int (*readlink) (const char *, char *, size_t);
int (*chown) (const char *, uid_t, gid_t);
int (*truncate) (const char *, off_t);
int (*utime) (const char *, struct utimbuf *);
- int (*open) (const char *, struct fuse_file_info_compat22 *);
+ int (*open) (const char *, struct fuse_file_info_compat *);
int (*read) (const char *, char *, size_t, off_t,
- struct fuse_file_info_compat22 *);
+ struct fuse_file_info_compat *);
int (*write) (const char *, const char *, size_t, off_t,
- struct fuse_file_info_compat22 *);
+ struct fuse_file_info_compat *);
int (*statfs) (const char *, struct statfs *);
- int (*flush) (const char *, struct fuse_file_info_compat22 *);
- int (*release) (const char *, struct fuse_file_info_compat22 *);
- int (*fsync) (const char *, int, struct fuse_file_info_compat22 *);
+ int (*flush) (const char *, struct fuse_file_info_compat *);
+ int (*release) (const char *, struct fuse_file_info_compat *);
+ int (*fsync) (const char *, int, struct fuse_file_info_compat *);
int (*setxattr) (const char *, const char *, const char *, size_t, int);
int (*getxattr) (const char *, const char *, char *, size_t);
int (*listxattr) (const char *, char *, size_t);
int (*removexattr) (const char *, const char *);
- int (*opendir) (const char *, struct fuse_file_info_compat22 *);
+ int (*opendir) (const char *, struct fuse_file_info_compat *);
int (*readdir) (const char *, void *, fuse_fill_dir_t, off_t,
- struct fuse_file_info_compat22 *);
- int (*releasedir) (const char *, struct fuse_file_info_compat22 *);
- int (*fsyncdir) (const char *, int, struct fuse_file_info_compat22 *);
+ struct fuse_file_info_compat *);
+ int (*releasedir) (const char *, struct fuse_file_info_compat *);
+ int (*fsyncdir) (const char *, int, struct fuse_file_info_compat *);
void *(*init) (void);
void (*destroy) (void *);
};
#if FUSE_USE_VERSION < 26
# include "fuse_lowlevel_compat.h"
-# undef FUSE_MINOR_VERSION
+# define fuse_chan_ops fuse_chan_ops_compat24
+# define fuse_chan_new fuse_chan_new_compat24
# if FUSE_USE_VERSION == 25
# define fuse_lowlevel_ops fuse_lowlevel_ops_compat25
# define fuse_lowlevel_new fuse_lowlevel_new_compat25
-# define fuse_chan_ops fuse_chan_ops_compat25
-# define fuse_chan_new fuse_chan_new_compat25
# elif FUSE_USE_VERSION == 24
+# define fuse_lowlevel_ops fuse_lowlevel_ops_compat
+# define fuse_lowlevel_new fuse_lowlevel_new_compat
# define fuse_file_info fuse_file_info_compat
# define fuse_reply_statfs fuse_reply_statfs_compat
# define fuse_reply_open fuse_reply_open_compat
-# else
+# else
# error Compatibility with low-level API version < 24 not supported
# endif
#endif
#include <sys/statfs.h>
-struct fuse_file_info_compat {
- int flags;
- unsigned long fh;
- int writepage;
- unsigned int direct_io : 1;
- unsigned int keep_cache : 1;
+struct fuse_lowlevel_ops_compat {
+ void (*init) (void *userdata);
+ void (*destroy) (void *userdata);
+ void (*lookup) (fuse_req_t req, fuse_ino_t parent, const char *name);
+ void (*forget) (fuse_req_t req, fuse_ino_t ino, unsigned long nlookup);
+ void (*getattr) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info_compat *fi);
+ void (*setattr) (fuse_req_t req, fuse_ino_t ino, struct stat *attr,
+ int to_set, struct fuse_file_info_compat *fi);
+ void (*readlink) (fuse_req_t req, fuse_ino_t ino);
+ void (*mknod) (fuse_req_t req, fuse_ino_t parent, const char *name,
+ mode_t mode, dev_t rdev);
+ void (*mkdir) (fuse_req_t req, fuse_ino_t parent, const char *name,
+ mode_t mode);
+ void (*unlink) (fuse_req_t req, fuse_ino_t parent, const char *name);
+ void (*rmdir) (fuse_req_t req, fuse_ino_t parent, const char *name);
+ void (*symlink) (fuse_req_t req, const char *link, fuse_ino_t parent,
+ const char *name);
+ void (*rename) (fuse_req_t req, fuse_ino_t parent, const char *name,
+ fuse_ino_t newparent, const char *newname);
+ void (*link) (fuse_req_t req, fuse_ino_t ino, fuse_ino_t newparent,
+ const char *newname);
+ void (*open) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info_compat *fi);
+ void (*read) (fuse_req_t req, fuse_ino_t ino, size_t size, off_t off,
+ struct fuse_file_info_compat *fi);
+ void (*write) (fuse_req_t req, fuse_ino_t ino, const char *buf,
+ size_t size, off_t off, struct fuse_file_info_compat *fi);
+ void (*flush) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info_compat *fi);
+ void (*release) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info_compat *fi);
+ void (*fsync) (fuse_req_t req, fuse_ino_t ino, int datasync,
+ struct fuse_file_info_compat *fi);
+ void (*opendir) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info_compat *fi);
+ void (*readdir) (fuse_req_t req, fuse_ino_t ino, size_t size, off_t off,
+ struct fuse_file_info_compat *fi);
+ void (*releasedir) (fuse_req_t req, fuse_ino_t ino,
+ struct fuse_file_info_compat *fi);
+ void (*fsyncdir) (fuse_req_t req, fuse_ino_t ino, int datasync,
+ struct fuse_file_info_compat *fi);
+ void (*statfs) (fuse_req_t req);
+ void (*setxattr) (fuse_req_t req, fuse_ino_t ino, const char *name,
+ const char *value, size_t size, int flags);
+ void (*getxattr) (fuse_req_t req, fuse_ino_t ino, const char *name,
+ size_t size);
+ void (*listxattr) (fuse_req_t req, fuse_ino_t ino, size_t size);
+ void (*removexattr) (fuse_req_t req, fuse_ino_t ino, const char *name);
+ void (*access) (fuse_req_t req, fuse_ino_t ino, int mask);
+ void (*create) (fuse_req_t req, fuse_ino_t parent, const char *name,
+ mode_t mode, struct fuse_file_info_compat *fi);
};
int fuse_reply_statfs_compat(fuse_req_t req, const struct statfs *stbuf);
const struct fuse_file_info_compat *fi);
struct fuse_session *fuse_lowlevel_new_compat(const char *opts,
- const struct fuse_lowlevel_ops *op,
- size_t op_size, void *userdata);
+ const struct fuse_lowlevel_ops_compat *op,
+ size_t op_size, void *userdata);
#endif /* __FreeBSD__ */
int fd, size_t bufsize, void *data);
int fuse_chan_receive(struct fuse_chan *ch, char *buf, size_t size);
-
+struct fuse_chan *fuse_kern_chan_new(int fd);
fuse_delete_context_key();
}
+#include "fuse_common_compat.h"
#include "fuse_compat.h"
static struct fuse *fuse_new_common_compat25(int fd, struct fuse_args *args,
if (!f->compat || f->compat >= 25)
err = fuse_do_open(f, req, path, fi);
else if (f->compat == 22) {
- struct fuse_file_info_compat22 tmp;
+ struct fuse_file_info_compat tmp;
memcpy(&tmp, fi, sizeof(tmp));
fuse_prepare_interrupt(f, req, &d);
err = ((struct fuse_operations_compat22 *) &f->op)->open(path, &tmp);
return fuse_do_opendir(f, req, path, fi);
} else {
int err;
- struct fuse_file_info_compat22 tmp;
+ struct fuse_file_info_compat tmp;
struct fuse_intr_data d;
memcpy(&tmp, fi, sizeof(tmp));
fuse_prepare_interrupt(f, req, &d);
}
+#include "fuse_common_compat.h"
#include "fuse_lowlevel_compat.h"
#ifndef __FreeBSD__
}
struct fuse_session *fuse_lowlevel_new_compat(const char *opts,
- const struct fuse_lowlevel_ops *op,
- size_t op_size, void *userdata)
+ const struct fuse_lowlevel_ops_compat *op,
+ size_t op_size, void *userdata)
{
struct fuse_session *se;
struct fuse_args args = FUSE_ARGS_INIT(0, NULL);
fuse_opt_free_args(&args);
return NULL;
}
- se = fuse_lowlevel_new(&args, op, op_size, userdata);
+ se = fuse_lowlevel_new(&args, (const struct fuse_lowlevel_ops *) op,
+ op_size, userdata);
fuse_opt_free_args(&args);
return se;
*/
#include "fuse_lowlevel.h"
+#include "fuse_common_compat.h"
#include "fuse_lowlevel_compat.h"
#include <stdio.h>