#include "fuse_i.h"
#include "fuse_lowlevel.h"
-#include "fuse_compat.h"
#include <stdio.h>
#include <string.h>
static struct fuse_context *(*fuse_getcontext)(void) = NULL;
+static int fuse_do_open(struct fuse *, char *, struct fuse_file_info *);
+static void fuse_do_release(struct fuse *, char *, struct fuse_file_info *);
+static int fuse_do_opendir(struct fuse *, char *, struct fuse_file_info *);
+static int fuse_do_statfs(struct fuse *, char *, struct statvfs *);
+
#ifndef USE_UCLIBC
#define mutex_init(mut) pthread_mutex_init(mut, NULL)
#else
if (f->op.open) {
err = -ENOENT;
path = get_path(f, ino);
- if (path != NULL) {
- if (!f->compat)
- err = f->op.open(path, fi);
- else if (f->compat == 22) {
- struct fuse_file_info_compat22 tmp;
- memcpy(&tmp, fi, sizeof(tmp));
- err = ((struct fuse_operations_compat22 *) &f->op)->open(path, &tmp);
- memcpy(fi, &tmp, sizeof(tmp));
- fi->fh = tmp.fh;
- } else
- err = ((struct fuse_operations_compat2 *) &f->op)->open(path, fi->flags);
- }
+ if (path != NULL)
+ err = fuse_do_open(f, path, fi);
}
if (!err) {
if (f->flags & FUSE_DEBUG) {
pthread_mutex_lock(&f->lock);
if (fuse_reply_open(req, fi) == -ENOENT) {
/* The open syscall was interrupted, so it must be cancelled */
- if(f->op.release && path != NULL) {
- if (!f->compat || f->compat >= 22)
- f->op.release(path, fi);
- else
- ((struct fuse_operations_compat2 *) &f->op)->release(path, fi->flags);
- }
+ if(f->op.release && path != NULL)
+ fuse_do_release(f, path, fi);
} else {
struct node *node = get_node(f, ino);
node->open_count ++;
fi->flags);
fflush(stdout);
}
- if (f->op.release) {
- if (!f->compat || f->compat >= 22)
- f->op.release(path ? path : "-", fi);
- else if (path)
- ((struct fuse_operations_compat2 *) &f->op)->release(path, fi->flags);
- }
+ if (f->op.release)
+ fuse_do_release(f, path, fi);
if(unlink_hidden && path)
f->op.unlink(path);
pthread_rwlock_rdlock(&f->tree_lock);
path = get_path(f, ino);
if (path != NULL) {
- if (!f->compat) {
- err = f->op.opendir(path, &fi);
- dh->fh = fi.fh;
- } else {
- struct fuse_file_info_compat22 tmp;
- memcpy(&tmp, &fi, sizeof(tmp));
- err = ((struct fuse_operations_compat22 *) &f->op)->opendir(path, &tmp);
- dh->fh = tmp.fh;
- }
+ err = fuse_do_opendir(f, path, &fi);
+ dh->fh = fi.fh;
}
if (!err) {
pthread_mutex_lock(&f->lock);
return 0;
}
-static void convert_statfs_compat(struct fuse_statfs_compat1 *compatbuf,
- struct statvfs *stbuf)
-{
- stbuf->f_bsize = compatbuf->block_size;
- stbuf->f_blocks = compatbuf->blocks;
- stbuf->f_bfree = compatbuf->blocks_free;
- stbuf->f_bavail = compatbuf->blocks_free;
- stbuf->f_files = compatbuf->files;
- stbuf->f_ffree = compatbuf->files_free;
- stbuf->f_namemax = compatbuf->namelen;
-}
-
-static void convert_statfs_old(struct statfs *oldbuf, struct statvfs *stbuf)
-{
- stbuf->f_bsize = oldbuf->f_bsize;
- stbuf->f_blocks = oldbuf->f_blocks;
- stbuf->f_bfree = oldbuf->f_bfree;
- stbuf->f_bavail = oldbuf->f_bavail;
- stbuf->f_files = oldbuf->f_files;
- stbuf->f_ffree = oldbuf->f_ffree;
- stbuf->f_namemax = oldbuf->f_namelen;
-}
-
static void fuse_statfs(fuse_req_t req)
{
struct fuse *f = req_fuse_prepare(req);
memset(&buf, 0, sizeof(buf));
if (f->op.statfs) {
- if (!f->compat) {
- err = f->op.statfs("/", &buf);
- } else if (f->compat > 11) {
- struct statfs oldbuf;
- err = ((struct fuse_operations_compat22 *) &f->op)->statfs("/", &oldbuf);
- if (!err)
- convert_statfs_old(&oldbuf, &buf);
- } else {
- struct fuse_statfs_compat1 compatbuf;
- memset(&compatbuf, 0, sizeof(struct fuse_statfs_compat1));
- err = ((struct fuse_operations_compat1 *) &f->op)->statfs(&compatbuf);
- if (!err)
- convert_statfs_compat(&compatbuf, &buf);
- }
+ err = fuse_do_statfs(f, "/", &buf);
} else
err = default_statfs(&buf);
return fuse_new_common(fd, opts, op, op_size, 0);
}
-struct fuse *fuse_new_compat22(int fd, const char *opts,
- const struct fuse_operations_compat22 *op,
- size_t op_size)
-{
- return fuse_new_common(fd, opts, (struct fuse_operations *) op,
- op_size, 22);
-}
-
-struct fuse *fuse_new_compat2(int fd, const char *opts,
- const struct fuse_operations_compat2 *op)
-{
- return fuse_new_common(fd, opts, (struct fuse_operations *) op,
- sizeof(struct fuse_operations_compat2), 21);
-}
-
-struct fuse *fuse_new_compat1(int fd, int flags,
- const struct fuse_operations_compat1 *op)
-{
- const char *opts = NULL;
- if (flags & FUSE_DEBUG_COMPAT1)
- opts = "debug";
- return fuse_new_common(fd, opts, (struct fuse_operations *) op,
- sizeof(struct fuse_operations_compat1), 11);
-}
-
void fuse_destroy(struct fuse *f)
{
size_t i;
free(f);
}
+#ifndef __FreeBSD__
+
+#include "fuse_compat.h"
+
+static int fuse_do_open(struct fuse *f, char *path, struct fuse_file_info *fi)
+{
+ if (!f->compat)
+ return f->op.open(path, fi);
+ else if (f->compat == 22) {
+ int err;
+ struct fuse_file_info_compat22 tmp;
+ memcpy(&tmp, fi, sizeof(tmp));
+ err = ((struct fuse_operations_compat22 *) &f->op)->open(path, &tmp);
+ memcpy(fi, &tmp, sizeof(tmp));
+ fi->fh = tmp.fh;
+ return err;
+ } else
+ return
+ ((struct fuse_operations_compat2 *) &f->op)->open(path, fi->flags);
+}
+
+static void fuse_do_release(struct fuse *f, char *path,
+ struct fuse_file_info *fi)
+{
+ if (!f->compat || f->compat >= 22)
+ f->op.release(path ? path : "-", fi);
+ else if (path)
+ ((struct fuse_operations_compat2 *) &f->op)->release(path, fi->flags);
+}
+
+static int fuse_do_opendir(struct fuse *f, char *path,
+ struct fuse_file_info *fi)
+{
+ if (!f->compat) {
+ return f->op.opendir(path, fi);
+ } else {
+ int err;
+ struct fuse_file_info_compat22 tmp;
+ memcpy(&tmp, fi, sizeof(tmp));
+ err = ((struct fuse_operations_compat22 *) &f->op)->opendir(path, &tmp);
+ memcpy(fi, &tmp, sizeof(tmp));
+ fi->fh = tmp.fh;
+ return err;
+ }
+}
+
+static void convert_statfs_compat(struct fuse_statfs_compat1 *compatbuf,
+ struct statvfs *stbuf)
+{
+ stbuf->f_bsize = compatbuf->block_size;
+ stbuf->f_blocks = compatbuf->blocks;
+ stbuf->f_bfree = compatbuf->blocks_free;
+ stbuf->f_bavail = compatbuf->blocks_free;
+ stbuf->f_files = compatbuf->files;
+ stbuf->f_ffree = compatbuf->files_free;
+ stbuf->f_namemax = compatbuf->namelen;
+}
+
+static void convert_statfs_old(struct statfs *oldbuf, struct statvfs *stbuf)
+{
+ stbuf->f_bsize = oldbuf->f_bsize;
+ stbuf->f_blocks = oldbuf->f_blocks;
+ stbuf->f_bfree = oldbuf->f_bfree;
+ stbuf->f_bavail = oldbuf->f_bavail;
+ stbuf->f_files = oldbuf->f_files;
+ stbuf->f_ffree = oldbuf->f_ffree;
+ stbuf->f_namemax = oldbuf->f_namelen;
+}
+
+static int fuse_do_statfs(struct fuse *f, char *path, struct statvfs *buf)
+{
+ int err;
+
+ if (!f->compat) {
+ err = f->op.statfs(path, buf);
+ } else if (f->compat > 11) {
+ struct statfs oldbuf;
+ err = ((struct fuse_operations_compat22 *) &f->op)->statfs("/", &oldbuf);
+ if (!err)
+ convert_statfs_old(&oldbuf, buf);
+ } else {
+ struct fuse_statfs_compat1 compatbuf;
+ memset(&compatbuf, 0, sizeof(struct fuse_statfs_compat1));
+ err = ((struct fuse_operations_compat1 *) &f->op)->statfs(&compatbuf);
+ if (!err)
+ convert_statfs_compat(&compatbuf, buf);
+ }
+ return err;
+}
+
+struct fuse *fuse_new_compat22(int fd, const char *opts,
+ const struct fuse_operations_compat22 *op,
+ size_t op_size)
+{
+ return fuse_new_common(fd, opts, (struct fuse_operations *) op,
+ op_size, 22);
+}
+
+struct fuse *fuse_new_compat2(int fd, const char *opts,
+ const struct fuse_operations_compat2 *op)
+{
+ return fuse_new_common(fd, opts, (struct fuse_operations *) op,
+ sizeof(struct fuse_operations_compat2), 21);
+}
+
+struct fuse *fuse_new_compat1(int fd, int flags,
+ const struct fuse_operations_compat1 *op)
+{
+ const char *opts = NULL;
+ if (flags & FUSE_DEBUG_COMPAT1)
+ opts = "debug";
+ return fuse_new_common(fd, opts, (struct fuse_operations *) op,
+ sizeof(struct fuse_operations_compat1), 11);
+}
+
__asm__(".symver fuse_exited,__fuse_exited@");
__asm__(".symver fuse_process_cmd,__fuse_process_cmd@");
__asm__(".symver fuse_read_cmd,__fuse_read_cmd@");
__asm__(".symver fuse_set_getcontext_func,__fuse_set_getcontext_func@");
__asm__(".symver fuse_new_compat2,fuse_new@");
__asm__(".symver fuse_new_compat22,fuse_new@FUSE_2.2");
+
+#else /* __FreeBSD__ */
+
+static int fuse_do_open(struct fuse *f, char *path, struct fuse_file_info *fi)
+{
+ return f->op.open(path, fi);
+}
+
+static void fuse_do_release(struct fuse *f, char *path,
+ struct fuse_file_info *fi)
+{
+ f->op.release(path ? path : "-", fi);
+}
+
+static int fuse_do_opendir(struct fuse *f, char *path,
+ struct fuse_file_info *fi)
+{
+ return f->op.opendir(path, fi);
+}
+
+static int fuse_do_statfs(struct fuse *f, char *path, struct statvfs *buf)
+{
+ return f->op.statfs(path, buf);
+}
+
+#endif /* __FreeBSD__ */
#include <config.h>
#include "fuse_lowlevel.h"
-#include "fuse_lowlevel_compat.h"
#include "fuse_kernel.h"
#include <stdio.h>
#include <unistd.h>
#include <limits.h>
#include <errno.h>
-#include <sys/statfs.h>
#define PARAM(inarg) (((char *)(inarg)) + sizeof(*(inarg)))
kstatfs->namelen = stbuf->f_namemax;
}
-static void convert_statfs_compat(const struct statfs *stbuf,
- struct fuse_kstatfs *kstatfs)
-{
- 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;
-}
-
static int send_reply_ok(fuse_req_t req, const void *arg, size_t argsize)
{
return send_reply(req, 0, arg, argsize);
arg->open_flags |= FOPEN_KEEP_CACHE;
}
-static void fill_open_compat(struct fuse_open_out *arg,
- const struct fuse_file_info_compat *f)
-{
- arg->fh = f->fh;
- if (f->direct_io)
- arg->open_flags |= FOPEN_DIRECT_IO;
- if (f->keep_cache)
- arg->open_flags |= FOPEN_KEEP_CACHE;
-}
-
int fuse_reply_entry(fuse_req_t req, const struct fuse_entry_param *e)
{
struct fuse_entry_out arg;
return send_reply_ok(req, &arg, sizeof(arg));
}
-int fuse_reply_open_compat(fuse_req_t req,
- const struct fuse_file_info_compat *f)
-{
- struct fuse_open_out arg;
-
- memset(&arg, 0, sizeof(arg));
- fill_open_compat(&arg, f);
- return send_reply_ok(req, &arg, sizeof(arg));
-}
-
int fuse_reply_write(fuse_req_t req, size_t count)
{
struct fuse_write_out arg;
return send_reply_ok(req, &arg, sizeof(arg));
}
-int fuse_reply_statfs_compat(fuse_req_t req, const struct statfs *stbuf)
-{
- struct fuse_statfs_out arg;
-
- memset(&arg, 0, sizeof(arg));
- convert_statfs_compat(stbuf, &arg.st);
-
- return send_reply_ok(req, &arg, sizeof(arg));
-}
-
int fuse_reply_xattr(fuse_req_t req, size_t count)
{
struct fuse_getxattr_out arg;
return NULL;
}
+#ifndef __FreeBSD__
+
+#include "fuse_lowlevel_compat.h"
+
+static void fill_open_compat(struct fuse_open_out *arg,
+ const struct fuse_file_info_compat *f)
+{
+ arg->fh = f->fh;
+ if (f->direct_io)
+ arg->open_flags |= FOPEN_DIRECT_IO;
+ if (f->keep_cache)
+ arg->open_flags |= FOPEN_KEEP_CACHE;
+}
+
+static void convert_statfs_compat(const struct statfs *stbuf,
+ struct fuse_kstatfs *kstatfs)
+{
+ 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;
+}
+
+int fuse_reply_open_compat(fuse_req_t req,
+ const struct fuse_file_info_compat *f)
+{
+ struct fuse_open_out arg;
+
+ memset(&arg, 0, sizeof(arg));
+ fill_open_compat(&arg, f);
+ return send_reply_ok(req, &arg, sizeof(arg));
+}
+
+int fuse_reply_statfs_compat(fuse_req_t req, const struct statfs *stbuf)
+{
+ struct fuse_statfs_out arg;
+
+ memset(&arg, 0, sizeof(arg));
+ convert_statfs_compat(stbuf, &arg.st);
+
+ return send_reply_ok(req, &arg, sizeof(arg));
+}
+
+
__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__
*/
#include "fuse_i.h"
-#include "fuse_compat.h"
#include <stdio.h>
#include <stdlib.h>
multithreaded, fd, 0);
}
-struct fuse *fuse_setup_compat22(int argc, char *argv[],
- const struct fuse_operations_compat22 *op,
- size_t op_size, char **mountpoint,
- int *multithreaded, int *fd)
-{
- return fuse_setup_common(argc, argv, (struct fuse_operations *) op,
- op_size, mountpoint, multithreaded, fd, 22);
-}
-
-struct fuse *fuse_setup_compat2(int argc, char *argv[],
- const struct fuse_operations_compat2 *op,
- char **mountpoint, int *multithreaded,
- int *fd)
-{
- return fuse_setup_common(argc, argv, (struct fuse_operations *) op,
- sizeof(struct fuse_operations_compat2),
- mountpoint, multithreaded, fd, 21);
-}
-
void fuse_teardown(struct fuse *fuse, int fd, char *mountpoint)
{
(void) fd;
return fuse_main_common(argc, argv, op, op_size, 0);
}
+#undef fuse_main
+int fuse_main(void)
+{
+ fprintf(stderr, "fuse_main(): This function does not exist\n");
+ return -1;
+}
+
+#ifndef __FreeBSD__
+
+#include "fuse_compat.h"
+
+struct fuse *fuse_setup_compat22(int argc, char *argv[],
+ const struct fuse_operations_compat22 *op,
+ size_t op_size, char **mountpoint,
+ int *multithreaded, int *fd)
+{
+ return fuse_setup_common(argc, argv, (struct fuse_operations *) op,
+ op_size, mountpoint, multithreaded, fd, 22);
+}
+
+struct fuse *fuse_setup_compat2(int argc, char *argv[],
+ const struct fuse_operations_compat2 *op,
+ char **mountpoint, int *multithreaded,
+ int *fd)
+{
+ return fuse_setup_common(argc, argv, (struct fuse_operations *) op,
+ sizeof(struct fuse_operations_compat2),
+ mountpoint, multithreaded, fd, 21);
+}
+
int fuse_main_real_compat22(int argc, char *argv[],
const struct fuse_operations_compat22 *op,
size_t op_size)
op_size, 22);
}
-#undef fuse_main
-int fuse_main(void)
-{
- fprintf(stderr, "fuse_main(): This function does not exist\n");
- return -1;
-}
-
void fuse_main_compat1(int argc, char *argv[],
const struct fuse_operations_compat1 *op)
{
__asm__(".symver fuse_teardown,__fuse_teardown@");
__asm__(".symver fuse_main_compat2,fuse_main@");
__asm__(".symver fuse_main_real_compat22,fuse_main_real@FUSE_2.2");
+
+#endif /* __FreeBSD__ */