plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

fuse_kernel.h (8996B)


      1 
      2 
      3 
      4 /*
      5     This file defines the kernel interface of FUSE
      6     Copyright (C) 2001-2007  Miklos Szeredi <miklos@szeredi.hu>
      7 
      8 
      9     This -- and only this -- header file may also be distributed under
     10     the terms of the BSD Licence as follows:
     11 
     12     Copyright (C) 2001-2007 Miklos Szeredi. All rights reserved.
     13 
     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.
     22 
     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 */
     35 
     36 /* RSC changed these lines */
     37 #include <inttypes.h>
     38 #define __u64 uint64_t
     39 #define __u32 uint32_t
     40 #define __s32 int32_t
     41 
     42 /** Version number of this interface */
     43 #define FUSE_KERNEL_VERSION 7
     44 
     45 /** Minor version number of this interface */
     46 #define FUSE_KERNEL_MINOR_VERSION 8
     47 
     48 /** The node ID of the root inode */
     49 #define FUSE_ROOT_ID 1
     50 
     51 /** The major number of the fuse character device */
     52 #define FUSE_MAJOR MISC_MAJOR
     53 
     54 /** The minor number of the fuse character device */
     55 #define FUSE_MINOR 229
     56 
     57 /* Make sure all structures are padded to 64bit boundary, so 32bit
     58    userspace works under 64bit kernels */
     59 
     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 };
     88 
     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 };
    101 
    102 struct fuse_file_lock {
    103 	__u64	start;
    104 	__u64	end;
    105 	__u32	type;
    106 	__u32	pid; /* tgid */
    107 };
    108 
    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 */
    125 
    126 /**
    127  * Flags returned by the OPEN request
    128  *
    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
    138 
    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 */
    149 
    150 /**
    151  * Release flags
    152  */
    153 #define FUSE_RELEASE_FLUSH	(1 << 0)
    154 
    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 };
    198 
    199 /* The read buffer is required to be at least 8k, but may be much larger */
    200 #define FUSE_MIN_READ_BUFFER 8192
    201 
    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 };
    212 
    213 struct fuse_forget_in {
    214 	__u64	nlookup;
    215 };
    216 
    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 };
    223 
    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 */
    232 
    233 struct fuse_mknod_in {
    234 	__u32	mode;
    235 	__u32	rdev;
    236 };
    237 
    238 struct fuse_mkdir_in {
    239 	__u32	mode;
    240 	__u32	padding;
    241 };
    242 
    243 struct fuse_rename_in {
    244 	__u64	newdir;
    245 };
    246 
    247 #if (__FreeBSD__ >= 10)
    248 struct fuse_exchange_in {
    249 	__u64	olddir;
    250 	__u64	newdir;
    251 	__u64	options;
    252 };
    253 #endif /* __FreeBSD__ >= 10 */
    254 
    255 struct fuse_link_in {
    256 	__u64	oldnodeid;
    257 };
    258 
    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 };
    286 
    287 struct fuse_open_in {
    288 	__u32	flags;
    289 	__u32	mode;
    290 };
    291 
    292 struct fuse_open_out {
    293 	__u64	fh;
    294 	__u32	open_flags;
    295 	__u32	padding;
    296 };
    297 
    298 struct fuse_release_in {
    299 	__u64	fh;
    300 	__u32	flags;
    301 	__u32	release_flags;
    302 	__u64	lock_owner;
    303 };
    304 
    305 struct fuse_flush_in {
    306 	__u64	fh;
    307 	__u32	flush_flags;
    308 	__u32	padding;
    309 	__u64	lock_owner;
    310 };
    311 
    312 struct fuse_read_in {
    313 	__u64	fh;
    314 	__u64	offset;
    315 	__u32	size;
    316 	__u32	padding;
    317 };
    318 
    319 struct fuse_write_in {
    320 	__u64	fh;
    321 	__u64	offset;
    322 	__u32	size;
    323 	__u32	write_flags;
    324 };
    325 
    326 struct fuse_write_out {
    327 	__u32	size;
    328 	__u32	padding;
    329 };
    330 
    331 #define FUSE_COMPAT_STATFS_SIZE 48
    332 
    333 struct fuse_statfs_out {
    334 	struct fuse_kstatfs st;
    335 };
    336 
    337 struct fuse_fsync_in {
    338 	__u64	fh;
    339 	__u32	fsync_flags;
    340 	__u32	padding;
    341 };
    342 
    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 };
    351 
    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 };
    360 
    361 struct fuse_getxattr_out {
    362 	__u32	size;
    363 	__u32	padding;
    364 };
    365 
    366 struct fuse_lk_in {
    367 	__u64	fh;
    368 	__u64	owner;
    369 	struct fuse_file_lock lk;
    370 };
    371 
    372 struct fuse_lk_out {
    373 	struct fuse_file_lock lk;
    374 };
    375 
    376 struct fuse_access_in {
    377 	__u32	mask;
    378 	__u32	padding;
    379 };
    380 
    381 struct fuse_init_in {
    382 	__u32	major;
    383 	__u32	minor;
    384 	__u32	max_readahead;
    385 	__u32	flags;
    386 };
    387 
    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 };
    396 
    397 struct fuse_interrupt_in {
    398 	__u64	unique;
    399 };
    400 
    401 struct fuse_bmap_in {
    402 	__u64	block;
    403 	__u32	blocksize;
    404 	__u32	padding;
    405 };
    406 
    407 struct fuse_bmap_out {
    408 	__u64	block;
    409 };
    410 
    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 };
    421 
    422 struct fuse_out_header {
    423 	__u32	len;
    424 	__s32	error;
    425 	__u64	unique;
    426 };
    427 
    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 };
    436 
    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)