/*
  FUSE: Filesystem in Userspace
  Copyright (C) 2001-2007  Miklos Szeredi <miklos@szeredi.hu>

  This program can be distributed under the terms of the GNU LGPLv2.
  See the file COPYING.LIB.
*/

/* these definitions provide source compatibility to prior versions.
   Do not include this file directly! */

#include "fuse_common.h"

struct fuse_lowlevel_ops_compat25 {
	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 *fi);
	void (*setattr) (fuse_req_t req, fuse_ino_t ino, struct stat *attr,
			 int to_set, struct fuse_file_info *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 *fi);
	void (*read) (fuse_req_t req, fuse_ino_t ino, size_t size, loff_t off,
		      struct fuse_file_info *fi);
	void (*write) (fuse_req_t req, fuse_ino_t ino, const char *buf,
		       size_t size, loff_t off, struct fuse_file_info *fi);
	void (*flush) (fuse_req_t req, fuse_ino_t ino,
		       struct fuse_file_info *fi);
	void (*release) (fuse_req_t req, fuse_ino_t ino,
			 struct fuse_file_info *fi);
	void (*fsync) (fuse_req_t req, fuse_ino_t ino, int datasync,
		       struct fuse_file_info *fi);
	void (*opendir) (fuse_req_t req, fuse_ino_t ino,
			 struct fuse_file_info *fi);
	void (*readdir) (fuse_req_t req, fuse_ino_t ino, size_t size, loff_t off,
			 struct fuse_file_info *fi);
	void (*releasedir) (fuse_req_t req, fuse_ino_t ino,
			    struct fuse_file_info *fi);
	void (*fsyncdir) (fuse_req_t req, fuse_ino_t ino, int datasync,
			  struct fuse_file_info *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 *fi);
};

struct fuse_session *fuse_lowlevel_new_compat25(struct fuse_args *args,
				const struct fuse_lowlevel_ops_compat25 *op,
				size_t op_size, void *userdata);

size_t fuse_dirent_size(size_t namelen);

char *fuse_add_dirent(char *buf, const char *name, const struct stat *stbuf,
		      loff_t off);

#if !defined(__FreeBSD__) && !defined(__NetBSD__)

#include <sys/statfs.h>

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, loff_t off,
		      struct fuse_file_info_compat *fi);
	void (*write) (fuse_req_t req, fuse_ino_t ino, const char *buf,
		       size_t size, loff_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, loff_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);

int fuse_reply_open_compat(fuse_req_t req,
			   const struct fuse_file_info_compat *fi);

struct fuse_session *fuse_lowlevel_new_compat(const char *opts,
				const struct fuse_lowlevel_ops_compat *op,
				size_t op_size, void *userdata);

#endif /* __FreeBSD__ || __NetBSD__ */

struct fuse_chan_ops_compat24 {
	int (*receive)(struct fuse_chan *ch, char *buf, size_t size);
	int (*send)(struct fuse_chan *ch, const struct iovec iov[],
		    size_t count);
	void (*destroy)(struct fuse_chan *ch);
};

struct fuse_chan *fuse_chan_new_compat24(struct fuse_chan_ops_compat24 *op,
					 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);
