aboutsummaryrefslogtreecommitdiff
path: root/include/fuse.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/fuse.h')
-rw-r--r--include/fuse.h92
1 files changed, 90 insertions, 2 deletions
diff --git a/include/fuse.h b/include/fuse.h
index 4edb0c7..4cddaaf 100644
--- a/include/fuse.h
+++ b/include/fuse.h
@@ -12,16 +12,56 @@
#include <sys/stat.h>
#include <utime.h>
+/** Handle for a FUSE filesystem */
struct fuse;
+
+/** Handle for a getdir() operation */
typedef struct fuse_dirhandle *fuse_dirh_t;
+/** Function to add an entry in a getdir() operation */
typedef int (*fuse_dirfil_t) (fuse_dirh_t, const char *, int type);
+/** Credentials for an operation, these are determined by the fsuid
+ and fsgid of the calling process */
struct fuse_cred {
uid_t uid;
gid_t gid;
+ /* FIXME: supplementary groups should also be included */
};
+/**
+ * The file system operations:
+ *
+ * Most of these should work very similarly to the well known UNIX
+ * file system operations. Exceptions are:
+ *
+ * - All operations get a fuse_cred structure by which the filesystem
+ * implementation can check, whether the operation is permitted or
+ * not.
+ *
+ * - All operations should return the negated error value (-errno) on
+ * error.
+ *
+ * - readlink() should fill the buffer with a null terminated string.
+ * The buffer size argument includes the space for the terminating
+ * null character. If the linkname is too long to fit in the buffer,
+ * it should be truncated. The return value should be 0 for success.
+ *
+ * - getdir() is the opendir(), readdir(), ..., closedir() sequence
+ * in one call. For each directory entry the filldir parameter should
+ * be called.
+ *
+ * - There is no create() operation, mknod() will be called for
+ * creation of all non directory, non symlink nodes.
+ *
+ * - open() should not return a filehandle, but 0 on success. No
+ * creation, or trunctation flags (O_CREAT, O_EXCL, O_TRUNC) will be
+ * passed to open(). Open should only check if the operation is
+ * permitted for the given flags.
+ *
+ * - read(), write() are not passed a filehandle, but rather a
+ * pathname. The offset of the read and write is passed as the last
+ * argument, like the pread() and pwrite() system calls. */
struct fuse_operations {
int (*getattr) (struct fuse_cred *, const char *, struct stat *);
int (*readlink) (struct fuse_cred *, const char *, char *, size_t);
@@ -42,16 +82,64 @@ struct fuse_operations {
int (*write) (struct fuse_cred *, const char *, const char *, size_t, off_t);
};
+/* FUSE flags: */
#define FUSE_MULTITHREAD (1 << 0)
-struct fuse *fuse_new(int flags);
+/**
+ * Create a new FUSE filesystem. The filesystem is not yet mounted
+ *
+ * @param flags any combination of the FUSE flags defined above, or 0
+ * @param root the file type of the root node. 0 is the default (directory).
+ * @return the created FUSE handle
+ */
+struct fuse *fuse_new(int flags, mode_t root);
-int fuse_mount(struct fuse *f, const char *dir);
+/**
+ * Connect to the kernel and mount the filesystem.
+ *
+ * @param f the FUSE handle
+ * @param mnt the mount point
+ * @return 0 on success -1 on failure
+ */
+int fuse_mount(struct fuse *f, const char *mnt);
+/**
+ * Set the filesystem operations.
+ *
+ * Operations which are initialised to NULL will return ENOSYS to the
+ * calling process. This function can be called anytime after
+ * fuse_new() and before fuse_loop().
+ *
+ * @param f the FUSE handle
+ * @param op the operations
+ */
void fuse_set_operations(struct fuse *f, const struct fuse_operations *op);
+/**
+ * FUSE event loop.
+ *
+ * Requests from the kernel are processed, and the apropriate
+ * operations are called.
+ *
+ * @param f the FUSE handle
+ */
void fuse_loop(struct fuse *f);
+/**
+ * Disconnect from the kernel and unmount the filesystem
+ *
+ * @param f the FUSE handle
+ */
int fuse_unmount(struct fuse *f);
+/**
+ * Destroy the filesystem.
+ *
+ * The filesystem is not unmounted (call fuse_unmount() for that).
+ * After a fork() system call it is possible to call fuse_destroy() in
+ * one process, and leave the other process to service the filesystem
+ * requests.
+ *
+ * @param f the FUSE handle
+ */
void fuse_destroy(struct fuse *f);