1/* $NetBSD: fuse.h,v 1.20 2008/01/14 20:46:11 pooka Exp $ */ 2 3/* 4 * Copyright � 2007 Alistair Crooks. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. The name of the author may not be used to endorse or promote 15 * products derived from this software without specific prior written 16 * permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 19 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 24 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 26 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30#ifndef FUSE_H_ 31#define FUSE_H_ 20070123 32 33/* set the default version to use for the fuse interface */ 34/* this value determines the API to be used */ 35#ifndef FUSE_USE_VERSION 36#define FUSE_USE_VERSION 26 37#endif 38 39#include <sys/types.h> 40 41#include <puffs.h> 42#include <utime.h> 43 44#ifdef __cplusplus 45extern "C" { 46#endif 47 48struct fuse; 49struct fuse_args; /* XXXsupportme */ 50 51struct fuse_file_info { 52 int32_t flags; 53 uint32_t fh_old; 54 int32_t writepage; 55 uint32_t direct_io:1; 56 uint32_t keep_cache:1; 57 uint32_t flush:1; 58 uint32_t padding:29; 59 uint64_t fh; 60 uint64_t lock_owner; 61}; 62 63struct fuse_conn_info { 64 uint32_t proto_major; 65 uint32_t proto_minor; 66 uint32_t async_read; 67 uint32_t max_write; 68 uint32_t max_readahead; 69 uint32_t reserved[27]; 70}; 71 72/* equivalent'ish of puffs_cc */ 73struct fuse_context { 74 struct fuse *fuse; 75 uid_t uid; 76 gid_t gid; 77 pid_t pid; 78 void *private_data; 79}; 80 81/** 82 * Argument list 83 */ 84struct fuse_args { 85 int argc; 86 char **argv; 87 int allocated; 88}; 89 90/** 91 * Initializer for 'struct fuse_args' 92 */ 93#define FUSE_ARGS_INIT(argc, argv) { argc, argv, 0 } 94 95typedef struct puffs_fuse_dirh *fuse_dirh_t; 96 97typedef int (*fuse_fill_dir_t)(void *, const char *, const struct stat *, off_t); 98typedef int (*fuse_dirfil_t)(fuse_dirh_t, const char *, int, ino_t); 99 100#define FUSE_VERSION 26 101#define FUSE_MAJOR_VERSION 2 102#define FUSE_MINOR_VERSION 6 103 104/* 105 * These operations shadow those in puffs_usermount, and are used 106 * as a table of callbacks to make when file system requests come 107 * in. 108 * 109 * NOTE: keep same order as fuse 110 */ 111struct fuse_operations { 112 int (*getattr)(const char *, struct stat *); 113 int (*readlink)(const char *, char *, size_t); 114 int (*getdir)(const char *, fuse_dirh_t, fuse_dirfil_t); 115 int (*mknod)(const char *, mode_t, dev_t); 116 int (*mkdir)(const char *, mode_t); 117 int (*unlink)(const char *); 118 int (*rmdir)(const char *); 119 int (*symlink)(const char *, const char *); 120 int (*rename)(const char *, const char *); 121 int (*link)(const char *, const char *); 122 int (*chmod)(const char *, mode_t); 123 int (*chown)(const char *, uid_t, gid_t); 124 int (*truncate)(const char *, off_t); 125 int (*utime)(const char *, struct utimbuf *); 126 int (*open)(const char *, struct fuse_file_info *); 127 int (*read)(const char *, char *, size_t, off_t, struct fuse_file_info *); 128 int (*write)(const char *, const char *, size_t, off_t, struct fuse_file_info *); 129 int (*statfs)(const char *, struct statvfs *); 130 int (*flush)(const char *, struct fuse_file_info *); 131 int (*release)(const char *, struct fuse_file_info *); 132 int (*fsync)(const char *, int, struct fuse_file_info *); 133 int (*setxattr)(const char *, const char *, const char *, size_t, int); 134 int (*getxattr)(const char *, const char *, char *, size_t); 135 int (*listxattr)(const char *, char *, size_t); 136 int (*removexattr)(const char *, const char *); 137 int (*opendir)(const char *, struct fuse_file_info *); 138 int (*readdir)(const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info *); 139 int (*releasedir)(const char *, struct fuse_file_info *); 140 int (*fsyncdir)(const char *, int, struct fuse_file_info *); 141 void *(*init)(struct fuse_conn_info *); 142 void (*destroy)(void *); 143 int (*access)(const char *, int); 144 int (*create)(const char *, mode_t, struct fuse_file_info *); 145 int (*ftruncate)(const char *, off_t, struct fuse_file_info *); 146 int (*fgetattr)(const char *, struct stat *, struct fuse_file_info *); 147 int (*lock)(const char *, struct fuse_file_info *, int, struct flock *); 148 int (*utimens)(const char *, const struct timespec *); 149 int (*bmap)(const char *, size_t , uint64_t *); 150}; 151 152 153struct fuse_chan *fuse_mount(const char *, struct fuse_args *); 154struct fuse *fuse_new(struct fuse_chan *, struct fuse_args *, 155 const struct fuse_operations *, size_t, void *); 156 157int fuse_main_real(int, char **, const struct fuse_operations *, size_t, void *); 158int fuse_loop(struct fuse *); 159struct fuse_context *fuse_get_context(void); 160void fuse_exit(struct fuse *); 161void fuse_destroy(struct fuse *); 162 163void fuse_unmount(const char *, struct fuse_chan *); 164 165struct fuse *fuse_setup(int, char **, const struct fuse_operations *, 166 size_t, char **, int *, int *); 167void fuse_teardown(struct fuse *, char *); 168 169#if FUSE_USE_VERSION == 22 170#define fuse_unmount fuse_unmount_compat22 171#endif 172 173void fuse_unmount_compat22(const char *); 174 175#if FUSE_USE_VERSION >= 26 176#define fuse_main(argc, argv, op, arg) \ 177 fuse_main_real(argc, argv, op, sizeof(*(op)), arg) 178#define fuse_setup fuse_setup26 179#else 180#define fuse_main(argc, argv, op) \ 181 fuse_main_real(argc, argv, op, sizeof(*(op)), NULL) 182#endif 183 184struct fuse *fuse_setup26(int, char **, const struct fuse_operations *, 185 size_t, char **, int *, void *); 186 187#ifdef __cplusplus 188} 189#endif 190 191#include <fuse_opt.h> 192 193#endif 194