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