xref: /minix3/lib/librefuse/fuse.h (revision 490e0de5481bce02ba3d268b472a024f76d2416b)
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