Blob


4 /*
5 This file defines the kernel interface of FUSE
6 Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
9 This -- and only this -- header file may also be distributed under
10 the terms of the BSD Licence as follows:
12 Copyright (C) 2001-2007 Miklos Szeredi. All rights reserved.
14 Redistribution and use in source and binary forms, with or without
15 modification, are permitted provided that the following conditions
16 are met:
17 1. Redistributions of source code must retain the above copyright
18 notice, this list of conditions and the following disclaimer.
19 2. Redistributions in binary form must reproduce the above copyright
20 notice, this list of conditions and the following disclaimer in the
21 documentation and/or other materials provided with the distribution.
23 THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
24 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
27 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 SUCH DAMAGE.
34 */
36 /* RSC changed these lines */
37 #include <inttypes.h>
38 #define __u64 uint64_t
39 #define __u32 uint32_t
40 #define __s32 int32_t
42 /** Version number of this interface */
43 #define FUSE_KERNEL_VERSION 7
45 /** Minor version number of this interface */
46 #define FUSE_KERNEL_MINOR_VERSION 8
48 /** The node ID of the root inode */
49 #define FUSE_ROOT_ID 1
51 /** The major number of the fuse character device */
52 #define FUSE_MAJOR MISC_MAJOR
54 /** The minor number of the fuse character device */
55 #define FUSE_MINOR 229
57 /* Make sure all structures are padded to 64bit boundary, so 32bit
58 userspace works under 64bit kernels */
60 struct fuse_attr {
61 __u64 ino;
62 __u64 size;
63 __u64 blocks;
64 __u64 atime;
65 __u64 mtime;
66 __u64 ctime;
67 #if (__FreeBSD__ >= 10 && OSX_VERSION >= 100500)
68 __u64 crtime;
69 #endif /* __FreeBSD__ >= 10 */
70 __u32 atimensec;
71 __u32 mtimensec;
72 __u32 ctimensec;
73 #if (__FreeBSD__ >= 10 && OSX_VERSION >= 100500)
74 __u32 crtimensec;
75 #endif /* __FreeBSD__ >= 10 */
76 __u32 mode;
77 __u32 nlink;
78 __u32 uid;
79 __u32 gid;
80 __u32 rdev;
81 #if (__FreeBSD__ >= 10)
82 __u32 flags; /* file flags; see chflags(2) */
83 #if OSX_VERSION < 100500
84 __u32 padding;
85 #endif /* __OSX_VERSION__ < 100500 */
86 #endif /* __FreeBSD__ >= 10 */
87 };
89 struct fuse_kstatfs {
90 __u64 blocks;
91 __u64 bfree;
92 __u64 bavail;
93 __u64 files;
94 __u64 ffree;
95 __u32 bsize;
96 __u32 namelen;
97 __u32 frsize;
98 __u32 padding;
99 __u32 spare[6];
100 };
102 struct fuse_file_lock {
103 __u64 start;
104 __u64 end;
105 __u32 type;
106 __u32 pid; /* tgid */
107 };
109 /**
110 * Bitmasks for fuse_setattr_in.valid
111 */
112 #define FATTR_MODE (1 << 0)
113 #define FATTR_UID (1 << 1)
114 #define FATTR_GID (1 << 2)
115 #define FATTR_SIZE (1 << 3)
116 #define FATTR_ATIME (1 << 4)
117 #define FATTR_MTIME (1 << 5)
118 #define FATTR_FH (1 << 6)
119 #if (__FreeBSD__ >= 10)
120 #define FATTR_CRTIME (1 << 28)
121 #define FATTR_CHGTIME (1 << 29)
122 #define FATTR_BKUPTIME (1 << 30)
123 #define FATTR_FLAGS (1 << 31)
124 #endif /* __FreeBSD__ >= 10 */
126 /**
127 * Flags returned by the OPEN request
129 * FOPEN_DIRECT_IO: bypass page cache for this open file
130 * FOPEN_KEEP_CACHE: don't invalidate the data cache on open
131 */
132 #define FOPEN_DIRECT_IO (1 << 0)
133 #define FOPEN_KEEP_CACHE (1 << 1)
134 #if (__FreeBSD__ >= 10)
135 #define FOPEN_PURGE_ATTR (1 << 30)
136 #define FOPEN_PURGE_UBC (1 << 31)
137 #endif
139 /**
140 * INIT request/reply flags
141 */
142 #define FUSE_ASYNC_READ (1 << 0)
143 #define FUSE_POSIX_LOCKS (1 << 1)
144 #if (__FreeBSD__ >= 10)
145 #define FUSE_CASE_INSENSITIVE (1 << 29)
146 #define FUSE_VOL_RENAME (1 << 30)
147 #define FUSE_XTIMES (1 << 31)
148 #endif /* __FreeBSD__ >= 10 */
150 /**
151 * Release flags
152 */
153 #define FUSE_RELEASE_FLUSH (1 << 0)
155 enum fuse_opcode {
156 FUSE_LOOKUP = 1,
157 FUSE_FORGET = 2, /* no reply */
158 FUSE_GETATTR = 3,
159 FUSE_SETATTR = 4,
160 FUSE_READLINK = 5,
161 FUSE_SYMLINK = 6,
162 FUSE_MKNOD = 8,
163 FUSE_MKDIR = 9,
164 FUSE_UNLINK = 10,
165 FUSE_RMDIR = 11,
166 FUSE_RENAME = 12,
167 FUSE_LINK = 13,
168 FUSE_OPEN = 14,
169 FUSE_READ = 15,
170 FUSE_WRITE = 16,
171 FUSE_STATFS = 17,
172 FUSE_RELEASE = 18,
173 FUSE_FSYNC = 20,
174 FUSE_SETXATTR = 21,
175 FUSE_GETXATTR = 22,
176 FUSE_LISTXATTR = 23,
177 FUSE_REMOVEXATTR = 24,
178 FUSE_FLUSH = 25,
179 FUSE_INIT = 26,
180 FUSE_OPENDIR = 27,
181 FUSE_READDIR = 28,
182 FUSE_RELEASEDIR = 29,
183 FUSE_FSYNCDIR = 30,
184 FUSE_GETLK = 31,
185 FUSE_SETLK = 32,
186 FUSE_SETLKW = 33,
187 FUSE_ACCESS = 34,
188 FUSE_CREATE = 35,
189 FUSE_INTERRUPT = 36,
190 FUSE_BMAP = 37,
191 FUSE_DESTROY = 38,
192 #if (__FreeBSD__ >= 10)
193 FUSE_SETVOLNAME = 61,
194 FUSE_GETXTIMES = 62,
195 FUSE_EXCHANGE = 63,
196 #endif /* __FreeBSD__ >= 10 */
197 };
199 /* The read buffer is required to be at least 8k, but may be much larger */
200 #define FUSE_MIN_READ_BUFFER 8192
202 struct fuse_entry_out {
203 __u64 nodeid; /* Inode ID */
204 __u64 generation; /* Inode generation: nodeid:gen must
205 be unique for the fs's lifetime */
206 __u64 entry_valid; /* Cache timeout for the name */
207 __u64 attr_valid; /* Cache timeout for the attributes */
208 __u32 entry_valid_nsec;
209 __u32 attr_valid_nsec;
210 struct fuse_attr attr;
211 };
213 struct fuse_forget_in {
214 __u64 nlookup;
215 };
217 struct fuse_attr_out {
218 __u64 attr_valid; /* Cache timeout for the attributes */
219 __u32 attr_valid_nsec;
220 __u32 dummy;
221 struct fuse_attr attr;
222 };
224 #if (__FreeBSD__ >= 10)
225 struct fuse_getxtimes_out {
226 __u64 bkuptime;
227 __u64 crtime;
228 __u32 bkuptimensec;
229 __u32 crtimensec;
230 };
231 #endif /* __FreeBSD__ >= 10 */
233 struct fuse_mknod_in {
234 __u32 mode;
235 __u32 rdev;
236 };
238 struct fuse_mkdir_in {
239 __u32 mode;
240 __u32 padding;
241 };
243 struct fuse_rename_in {
244 __u64 newdir;
245 };
247 #if (__FreeBSD__ >= 10)
248 struct fuse_exchange_in {
249 __u64 olddir;
250 __u64 newdir;
251 __u64 options;
252 };
253 #endif /* __FreeBSD__ >= 10 */
255 struct fuse_link_in {
256 __u64 oldnodeid;
257 };
259 struct fuse_setattr_in {
260 __u32 valid;
261 __u32 padding;
262 __u64 fh;
263 __u64 size;
264 __u64 unused1;
265 __u64 atime;
266 __u64 mtime;
267 __u64 unused2;
268 __u32 atimensec;
269 __u32 mtimensec;
270 __u32 unused3;
271 __u32 mode;
272 __u32 unused4;
273 __u32 uid;
274 __u32 gid;
275 __u32 unused5;
276 #if (__FreeBSD__ >= 10)
277 __u64 bkuptime;
278 __u64 chgtime;
279 __u64 crtime;
280 __u32 bkuptimensec;
281 __u32 chgtimensec;
282 __u32 crtimensec;
283 __u32 flags; /* file flags; see chflags(2) */
284 #endif /* __FreeBSD__ >= 10 */
285 };
287 struct fuse_open_in {
288 __u32 flags;
289 __u32 mode;
290 };
292 struct fuse_open_out {
293 __u64 fh;
294 __u32 open_flags;
295 __u32 padding;
296 };
298 struct fuse_release_in {
299 __u64 fh;
300 __u32 flags;
301 __u32 release_flags;
302 __u64 lock_owner;
303 };
305 struct fuse_flush_in {
306 __u64 fh;
307 __u32 flush_flags;
308 __u32 padding;
309 __u64 lock_owner;
310 };
312 struct fuse_read_in {
313 __u64 fh;
314 __u64 offset;
315 __u32 size;
316 __u32 padding;
317 };
319 struct fuse_write_in {
320 __u64 fh;
321 __u64 offset;
322 __u32 size;
323 __u32 write_flags;
324 };
326 struct fuse_write_out {
327 __u32 size;
328 __u32 padding;
329 };
331 #define FUSE_COMPAT_STATFS_SIZE 48
333 struct fuse_statfs_out {
334 struct fuse_kstatfs st;
335 };
337 struct fuse_fsync_in {
338 __u64 fh;
339 __u32 fsync_flags;
340 __u32 padding;
341 };
343 struct fuse_setxattr_in {
344 __u32 size;
345 __u32 flags;
346 #if (__FreeBSD__ >= 10)
347 __u32 position;
348 __u32 padding;
349 #endif /* __FreeBSD__ >= 10 */
350 };
352 struct fuse_getxattr_in {
353 __u32 size;
354 __u32 padding;
355 #if (__FreeBSD__ >= 10)
356 __u32 position;
357 __u32 padding2;
358 #endif /* __FreeBSD__ >= 10 */
359 };
361 struct fuse_getxattr_out {
362 __u32 size;
363 __u32 padding;
364 };
366 struct fuse_lk_in {
367 __u64 fh;
368 __u64 owner;
369 struct fuse_file_lock lk;
370 };
372 struct fuse_lk_out {
373 struct fuse_file_lock lk;
374 };
376 struct fuse_access_in {
377 __u32 mask;
378 __u32 padding;
379 };
381 struct fuse_init_in {
382 __u32 major;
383 __u32 minor;
384 __u32 max_readahead;
385 __u32 flags;
386 };
388 struct fuse_init_out {
389 __u32 major;
390 __u32 minor;
391 __u32 max_readahead;
392 __u32 flags;
393 __u32 unused;
394 __u32 max_write;
395 };
397 struct fuse_interrupt_in {
398 __u64 unique;
399 };
401 struct fuse_bmap_in {
402 __u64 block;
403 __u32 blocksize;
404 __u32 padding;
405 };
407 struct fuse_bmap_out {
408 __u64 block;
409 };
411 struct fuse_in_header {
412 __u32 len;
413 __u32 opcode;
414 __u64 unique;
415 __u64 nodeid;
416 __u32 uid;
417 __u32 gid;
418 __u32 pid;
419 __u32 padding;
420 };
422 struct fuse_out_header {
423 __u32 len;
424 __s32 error;
425 __u64 unique;
426 };
428 /* RSC changed name[0] to name[1] for old C compilers */
429 struct fuse_dirent {
430 __u64 ino;
431 __u64 off;
432 __u32 namelen;
433 __u32 type;
434 char name[1];
435 };
437 #define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)
438 #define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(__u64) - 1) & ~(sizeof(__u64) - 1))
439 #define FUSE_DIRENT_SIZE(d) \
440 FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)