1987da915Sopenharmony_ci/* 2987da915Sopenharmony_ci FUSE: Filesystem in Userspace 3987da915Sopenharmony_ci Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu> 4987da915Sopenharmony_ci 5987da915Sopenharmony_ci This program can be distributed under the terms of the GNU LGPLv2. 6987da915Sopenharmony_ci See the file COPYING.LIB. 7987da915Sopenharmony_ci*/ 8987da915Sopenharmony_ci 9987da915Sopenharmony_ci#ifndef _FUSE_H_ 10987da915Sopenharmony_ci#define _FUSE_H_ 11987da915Sopenharmony_ci 12987da915Sopenharmony_ci/** @file 13987da915Sopenharmony_ci * 14987da915Sopenharmony_ci * This file defines the library interface of FUSE 15987da915Sopenharmony_ci */ 16987da915Sopenharmony_ci 17987da915Sopenharmony_ci#include "fuse_common.h" 18987da915Sopenharmony_ci 19987da915Sopenharmony_ci#include <fcntl.h> 20987da915Sopenharmony_ci#include <time.h> 21987da915Sopenharmony_ci#include <utime.h> 22987da915Sopenharmony_ci#include <sys/types.h> 23987da915Sopenharmony_ci#include <sys/stat.h> 24987da915Sopenharmony_ci#include <sys/statvfs.h> 25987da915Sopenharmony_ci 26987da915Sopenharmony_ci#ifdef __cplusplus 27987da915Sopenharmony_ciextern "C" { 28987da915Sopenharmony_ci#endif 29987da915Sopenharmony_ci 30987da915Sopenharmony_ci/* ----------------------------------------------------------- * 31987da915Sopenharmony_ci * Basic FUSE API * 32987da915Sopenharmony_ci * ----------------------------------------------------------- */ 33987da915Sopenharmony_ci 34987da915Sopenharmony_ci/** Handle for a FUSE filesystem */ 35987da915Sopenharmony_cistruct fuse; 36987da915Sopenharmony_ci 37987da915Sopenharmony_ci/** Structure containing a raw command */ 38987da915Sopenharmony_cistruct fuse_cmd; 39987da915Sopenharmony_ci 40987da915Sopenharmony_ci/** Function to add an entry in a readdir() operation 41987da915Sopenharmony_ci * 42987da915Sopenharmony_ci * @param buf the buffer passed to the readdir() operation 43987da915Sopenharmony_ci * @param name the file name of the directory entry 44987da915Sopenharmony_ci * @param stat file attributes, can be NULL 45987da915Sopenharmony_ci * @param off offset of the next entry or zero 46987da915Sopenharmony_ci * @return 1 if buffer is full, zero otherwise 47987da915Sopenharmony_ci */ 48987da915Sopenharmony_citypedef int (*fuse_fill_dir_t) (void *buf, const char *name, 49987da915Sopenharmony_ci const struct stat *stbuf, off_t off); 50987da915Sopenharmony_ci 51987da915Sopenharmony_ci/** 52987da915Sopenharmony_ci * The file system operations: 53987da915Sopenharmony_ci * 54987da915Sopenharmony_ci * Most of these should work very similarly to the well known UNIX 55987da915Sopenharmony_ci * file system operations. A major exception is that instead of 56987da915Sopenharmony_ci * returning an error in 'errno', the operation should return the 57987da915Sopenharmony_ci * negated error value (-errno) directly. 58987da915Sopenharmony_ci * 59987da915Sopenharmony_ci * All methods are optional, but some are essential for a useful 60987da915Sopenharmony_ci * filesystem (e.g. getattr). Open, flush, release, fsync, opendir, 61987da915Sopenharmony_ci * releasedir, fsyncdir, access, create, ftruncate, fgetattr, lock, 62987da915Sopenharmony_ci * init and destroy are special purpose methods, without which a full 63987da915Sopenharmony_ci * featured filesystem can still be implemented. 64987da915Sopenharmony_ci * 65987da915Sopenharmony_ci * Almost all operations take a path which can be of any length. 66987da915Sopenharmony_ci * 67987da915Sopenharmony_ci * Changed in fuse 2.8.0 (regardless of API version) 68987da915Sopenharmony_ci * Previously, paths were limited to a length of PATH_MAX. 69987da915Sopenharmony_ci */ 70987da915Sopenharmony_ci 71987da915Sopenharmony_cistruct fuse_operations { 72987da915Sopenharmony_ci /** Get file attributes. 73987da915Sopenharmony_ci * 74987da915Sopenharmony_ci * Similar to stat(). The 'st_dev' and 'st_blksize' fields are 75987da915Sopenharmony_ci * ignored. The 'st_ino' field is ignored except if the 'use_ino' 76987da915Sopenharmony_ci * mount option is given. 77987da915Sopenharmony_ci */ 78987da915Sopenharmony_ci int (*getattr) (const char *, struct stat *); 79987da915Sopenharmony_ci 80987da915Sopenharmony_ci /** Read the target of a symbolic link 81987da915Sopenharmony_ci * 82987da915Sopenharmony_ci * The buffer should be filled with a null terminated string. The 83987da915Sopenharmony_ci * buffer size argument includes the space for the terminating 84987da915Sopenharmony_ci * null character. If the linkname is too long to fit in the 85987da915Sopenharmony_ci * buffer, it should be truncated. The return value should be 0 86987da915Sopenharmony_ci * for success. 87987da915Sopenharmony_ci */ 88987da915Sopenharmony_ci int (*readlink) (const char *, char *, size_t); 89987da915Sopenharmony_ci 90987da915Sopenharmony_ci /** Create a file node 91987da915Sopenharmony_ci * 92987da915Sopenharmony_ci * This is called for creation of all non-directory, non-symlink 93987da915Sopenharmony_ci * nodes. If the filesystem defines a create() method, then for 94987da915Sopenharmony_ci * regular files that will be called instead. 95987da915Sopenharmony_ci */ 96987da915Sopenharmony_ci int (*mknod) (const char *, mode_t, dev_t); 97987da915Sopenharmony_ci 98987da915Sopenharmony_ci /** Create a directory 99987da915Sopenharmony_ci * 100987da915Sopenharmony_ci * Note that the mode argument may not have the type specification 101987da915Sopenharmony_ci * bits set, i.e. S_ISDIR(mode) can be false. To obtain the 102987da915Sopenharmony_ci * correct directory type bits use mode|S_IFDIR 103987da915Sopenharmony_ci * */ 104987da915Sopenharmony_ci int (*mkdir) (const char *, mode_t); 105987da915Sopenharmony_ci 106987da915Sopenharmony_ci /** Remove a file */ 107987da915Sopenharmony_ci int (*unlink) (const char *); 108987da915Sopenharmony_ci 109987da915Sopenharmony_ci /** Remove a directory */ 110987da915Sopenharmony_ci int (*rmdir) (const char *); 111987da915Sopenharmony_ci 112987da915Sopenharmony_ci /** Create a symbolic link */ 113987da915Sopenharmony_ci int (*symlink) (const char *, const char *); 114987da915Sopenharmony_ci 115987da915Sopenharmony_ci /** Rename a file */ 116987da915Sopenharmony_ci int (*rename) (const char *, const char *); 117987da915Sopenharmony_ci 118987da915Sopenharmony_ci /** Create a hard link to a file */ 119987da915Sopenharmony_ci int (*link) (const char *, const char *); 120987da915Sopenharmony_ci 121987da915Sopenharmony_ci /** Change the permission bits of a file */ 122987da915Sopenharmony_ci int (*chmod) (const char *, mode_t); 123987da915Sopenharmony_ci 124987da915Sopenharmony_ci /** Change the owner and group of a file */ 125987da915Sopenharmony_ci int (*chown) (const char *, uid_t, gid_t); 126987da915Sopenharmony_ci 127987da915Sopenharmony_ci /** Change the size of a file */ 128987da915Sopenharmony_ci int (*truncate) (const char *, off_t); 129987da915Sopenharmony_ci 130987da915Sopenharmony_ci /** Change the access and/or modification times of a file 131987da915Sopenharmony_ci * 132987da915Sopenharmony_ci * Deprecated, use utimens() instead. 133987da915Sopenharmony_ci */ 134987da915Sopenharmony_ci int (*utime) (const char *, struct utimbuf *); 135987da915Sopenharmony_ci 136987da915Sopenharmony_ci /** File open operation 137987da915Sopenharmony_ci * 138987da915Sopenharmony_ci * No creation (O_CREAT, O_EXCL) and by default also no 139987da915Sopenharmony_ci * truncation (O_TRUNC) flags will be passed to open(). If an 140987da915Sopenharmony_ci * application specifies O_TRUNC, fuse first calls truncate() 141987da915Sopenharmony_ci * and then open(). Only if 'atomic_o_trunc' has been 142987da915Sopenharmony_ci * specified and kernel version is 2.6.24 or later, O_TRUNC is 143987da915Sopenharmony_ci * passed on to open. 144987da915Sopenharmony_ci * 145987da915Sopenharmony_ci * Unless the 'default_permissions' mount option is given, 146987da915Sopenharmony_ci * open should check if the operation is permitted for the 147987da915Sopenharmony_ci * given flags. Optionally open may also return an arbitrary 148987da915Sopenharmony_ci * filehandle in the fuse_file_info structure, which will be 149987da915Sopenharmony_ci * passed to all file operations. 150987da915Sopenharmony_ci * 151987da915Sopenharmony_ci * Changed in version 2.2 152987da915Sopenharmony_ci */ 153987da915Sopenharmony_ci int (*open) (const char *, struct fuse_file_info *); 154987da915Sopenharmony_ci 155987da915Sopenharmony_ci /** Read data from an open file 156987da915Sopenharmony_ci * 157987da915Sopenharmony_ci * Read should return exactly the number of bytes requested except 158987da915Sopenharmony_ci * on EOF or error, otherwise the rest of the data will be 159987da915Sopenharmony_ci * substituted with zeroes. An exception to this is when the 160987da915Sopenharmony_ci * 'direct_io' mount option is specified, in which case the return 161987da915Sopenharmony_ci * value of the read system call will reflect the return value of 162987da915Sopenharmony_ci * this operation. 163987da915Sopenharmony_ci * 164987da915Sopenharmony_ci * Changed in version 2.2 165987da915Sopenharmony_ci */ 166987da915Sopenharmony_ci int (*read) (const char *, char *, size_t, off_t, 167987da915Sopenharmony_ci struct fuse_file_info *); 168987da915Sopenharmony_ci 169987da915Sopenharmony_ci /** Write data to an open file 170987da915Sopenharmony_ci * 171987da915Sopenharmony_ci * Write should return exactly the number of bytes requested 172987da915Sopenharmony_ci * except on error. An exception to this is when the 'direct_io' 173987da915Sopenharmony_ci * mount option is specified (see read operation). 174987da915Sopenharmony_ci * 175987da915Sopenharmony_ci * Changed in version 2.2 176987da915Sopenharmony_ci */ 177987da915Sopenharmony_ci int (*write) (const char *, const char *, size_t, off_t, 178987da915Sopenharmony_ci struct fuse_file_info *); 179987da915Sopenharmony_ci 180987da915Sopenharmony_ci /** Get file system statistics 181987da915Sopenharmony_ci * 182987da915Sopenharmony_ci * The 'f_frsize', 'f_favail', 'f_fsid' and 'f_flag' fields are ignored 183987da915Sopenharmony_ci * 184987da915Sopenharmony_ci * Replaced 'struct statfs' parameter with 'struct statvfs' in 185987da915Sopenharmony_ci * version 2.5 186987da915Sopenharmony_ci */ 187987da915Sopenharmony_ci int (*statfs) (const char *, struct statvfs *); 188987da915Sopenharmony_ci 189987da915Sopenharmony_ci /** Possibly flush cached data 190987da915Sopenharmony_ci * 191987da915Sopenharmony_ci * BIG NOTE: This is not equivalent to fsync(). It's not a 192987da915Sopenharmony_ci * request to sync dirty data. 193987da915Sopenharmony_ci * 194987da915Sopenharmony_ci * Flush is called on each close() of a file descriptor. So if a 195987da915Sopenharmony_ci * filesystem wants to return write errors in close() and the file 196987da915Sopenharmony_ci * has cached dirty data, this is a good place to write back data 197987da915Sopenharmony_ci * and return any errors. Since many applications ignore close() 198987da915Sopenharmony_ci * errors this is not always useful. 199987da915Sopenharmony_ci * 200987da915Sopenharmony_ci * NOTE: The flush() method may be called more than once for each 201987da915Sopenharmony_ci * open(). This happens if more than one file descriptor refers 202987da915Sopenharmony_ci * to an opened file due to dup(), dup2() or fork() calls. It is 203987da915Sopenharmony_ci * not possible to determine if a flush is final, so each flush 204987da915Sopenharmony_ci * should be treated equally. Multiple write-flush sequences are 205987da915Sopenharmony_ci * relatively rare, so this shouldn't be a problem. 206987da915Sopenharmony_ci * 207987da915Sopenharmony_ci * Filesystems shouldn't assume that flush will always be called 208987da915Sopenharmony_ci * after some writes, or that if will be called at all. 209987da915Sopenharmony_ci * 210987da915Sopenharmony_ci * Changed in version 2.2 211987da915Sopenharmony_ci */ 212987da915Sopenharmony_ci int (*flush) (const char *, struct fuse_file_info *); 213987da915Sopenharmony_ci 214987da915Sopenharmony_ci /** Release an open file 215987da915Sopenharmony_ci * 216987da915Sopenharmony_ci * Release is called when there are no more references to an open 217987da915Sopenharmony_ci * file: all file descriptors are closed and all memory mappings 218987da915Sopenharmony_ci * are unmapped. 219987da915Sopenharmony_ci * 220987da915Sopenharmony_ci * For every open() call there will be exactly one release() call 221987da915Sopenharmony_ci * with the same flags and file descriptor. It is possible to 222987da915Sopenharmony_ci * have a file opened more than once, in which case only the last 223987da915Sopenharmony_ci * release will mean, that no more reads/writes will happen on the 224987da915Sopenharmony_ci * file. The return value of release is ignored. 225987da915Sopenharmony_ci * 226987da915Sopenharmony_ci * Changed in version 2.2 227987da915Sopenharmony_ci */ 228987da915Sopenharmony_ci int (*release) (const char *, struct fuse_file_info *); 229987da915Sopenharmony_ci 230987da915Sopenharmony_ci /** Synchronize file contents 231987da915Sopenharmony_ci * 232987da915Sopenharmony_ci * If the datasync parameter is non-zero, then only the user data 233987da915Sopenharmony_ci * should be flushed, not the meta data. 234987da915Sopenharmony_ci * 235987da915Sopenharmony_ci * Changed in version 2.2 236987da915Sopenharmony_ci */ 237987da915Sopenharmony_ci int (*fsync) (const char *, int, struct fuse_file_info *); 238987da915Sopenharmony_ci 239987da915Sopenharmony_ci /** Set extended attributes */ 240987da915Sopenharmony_ci int (*setxattr) (const char *, const char *, const char *, size_t, int); 241987da915Sopenharmony_ci 242987da915Sopenharmony_ci /** Get extended attributes */ 243987da915Sopenharmony_ci int (*getxattr) (const char *, const char *, char *, size_t); 244987da915Sopenharmony_ci 245987da915Sopenharmony_ci /** List extended attributes */ 246987da915Sopenharmony_ci int (*listxattr) (const char *, char *, size_t); 247987da915Sopenharmony_ci 248987da915Sopenharmony_ci /** Remove extended attributes */ 249987da915Sopenharmony_ci int (*removexattr) (const char *, const char *); 250987da915Sopenharmony_ci 251987da915Sopenharmony_ci /** Open directory 252987da915Sopenharmony_ci * 253987da915Sopenharmony_ci * This method should check if the open operation is permitted for 254987da915Sopenharmony_ci * this directory 255987da915Sopenharmony_ci * 256987da915Sopenharmony_ci * Introduced in version 2.3 257987da915Sopenharmony_ci */ 258987da915Sopenharmony_ci int (*opendir) (const char *, struct fuse_file_info *); 259987da915Sopenharmony_ci 260987da915Sopenharmony_ci /** Read directory 261987da915Sopenharmony_ci * 262987da915Sopenharmony_ci * The filesystem may choose between two modes of operation: 263987da915Sopenharmony_ci * 264987da915Sopenharmony_ci * 1) The readdir implementation ignores the offset parameter, and 265987da915Sopenharmony_ci * passes zero to the filler function's offset. The filler 266987da915Sopenharmony_ci * function will not return '1' (unless an error happens), so the 267987da915Sopenharmony_ci * whole directory is read in a single readdir operation. 268987da915Sopenharmony_ci * 269987da915Sopenharmony_ci * 2) The readdir implementation keeps track of the offsets of the 270987da915Sopenharmony_ci * directory entries. It uses the offset parameter and always 271987da915Sopenharmony_ci * passes non-zero offset to the filler function. When the buffer 272987da915Sopenharmony_ci * is full (or an error happens) the filler function will return 273987da915Sopenharmony_ci * '1'. 274987da915Sopenharmony_ci * 275987da915Sopenharmony_ci * Introduced in version 2.3 276987da915Sopenharmony_ci */ 277987da915Sopenharmony_ci int (*readdir) (const char *, void *, fuse_fill_dir_t, off_t, 278987da915Sopenharmony_ci struct fuse_file_info *); 279987da915Sopenharmony_ci 280987da915Sopenharmony_ci /** Release directory 281987da915Sopenharmony_ci * 282987da915Sopenharmony_ci * Introduced in version 2.3 283987da915Sopenharmony_ci */ 284987da915Sopenharmony_ci int (*releasedir) (const char *, struct fuse_file_info *); 285987da915Sopenharmony_ci 286987da915Sopenharmony_ci /** Synchronize directory contents 287987da915Sopenharmony_ci * 288987da915Sopenharmony_ci * If the datasync parameter is non-zero, then only the user data 289987da915Sopenharmony_ci * should be flushed, not the meta data 290987da915Sopenharmony_ci * 291987da915Sopenharmony_ci * Introduced in version 2.3 292987da915Sopenharmony_ci */ 293987da915Sopenharmony_ci int (*fsyncdir) (const char *, int, struct fuse_file_info *); 294987da915Sopenharmony_ci 295987da915Sopenharmony_ci /** 296987da915Sopenharmony_ci * Initialize filesystem 297987da915Sopenharmony_ci * 298987da915Sopenharmony_ci * The return value will passed in the private_data field of 299987da915Sopenharmony_ci * fuse_context to all file operations and as a parameter to the 300987da915Sopenharmony_ci * destroy() method. 301987da915Sopenharmony_ci * 302987da915Sopenharmony_ci * Introduced in version 2.3 303987da915Sopenharmony_ci * Changed in version 2.6 304987da915Sopenharmony_ci */ 305987da915Sopenharmony_ci void *(*init) (struct fuse_conn_info *conn); 306987da915Sopenharmony_ci 307987da915Sopenharmony_ci /** 308987da915Sopenharmony_ci * Clean up filesystem 309987da915Sopenharmony_ci * 310987da915Sopenharmony_ci * Called on filesystem exit. 311987da915Sopenharmony_ci * 312987da915Sopenharmony_ci * Introduced in version 2.3 313987da915Sopenharmony_ci */ 314987da915Sopenharmony_ci void (*destroy) (void *); 315987da915Sopenharmony_ci 316987da915Sopenharmony_ci /** 317987da915Sopenharmony_ci * Check file access permissions 318987da915Sopenharmony_ci * 319987da915Sopenharmony_ci * This will be called for the access() system call. If the 320987da915Sopenharmony_ci * 'default_permissions' mount option is given, this method is not 321987da915Sopenharmony_ci * called. 322987da915Sopenharmony_ci * 323987da915Sopenharmony_ci * This method is not called under Linux kernel versions 2.4.x 324987da915Sopenharmony_ci * 325987da915Sopenharmony_ci * Introduced in version 2.5 326987da915Sopenharmony_ci */ 327987da915Sopenharmony_ci int (*access) (const char *, int); 328987da915Sopenharmony_ci 329987da915Sopenharmony_ci /** 330987da915Sopenharmony_ci * Create and open a file 331987da915Sopenharmony_ci * 332987da915Sopenharmony_ci * If the file does not exist, first create it with the specified 333987da915Sopenharmony_ci * mode, and then open it. 334987da915Sopenharmony_ci * 335987da915Sopenharmony_ci * If this method is not implemented or under Linux kernel 336987da915Sopenharmony_ci * versions earlier than 2.6.15, the mknod() and open() methods 337987da915Sopenharmony_ci * will be called instead. 338987da915Sopenharmony_ci * 339987da915Sopenharmony_ci * Introduced in version 2.5 340987da915Sopenharmony_ci */ 341987da915Sopenharmony_ci int (*create) (const char *, mode_t, struct fuse_file_info *); 342987da915Sopenharmony_ci 343987da915Sopenharmony_ci /** 344987da915Sopenharmony_ci * Change the size of an open file 345987da915Sopenharmony_ci * 346987da915Sopenharmony_ci * This method is called instead of the truncate() method if the 347987da915Sopenharmony_ci * truncation was invoked from an ftruncate() system call. 348987da915Sopenharmony_ci * 349987da915Sopenharmony_ci * If this method is not implemented or under Linux kernel 350987da915Sopenharmony_ci * versions earlier than 2.6.15, the truncate() method will be 351987da915Sopenharmony_ci * called instead. 352987da915Sopenharmony_ci * 353987da915Sopenharmony_ci * Introduced in version 2.5 354987da915Sopenharmony_ci */ 355987da915Sopenharmony_ci int (*ftruncate) (const char *, off_t, struct fuse_file_info *); 356987da915Sopenharmony_ci 357987da915Sopenharmony_ci /** 358987da915Sopenharmony_ci * Get attributes from an open file 359987da915Sopenharmony_ci * 360987da915Sopenharmony_ci * This method is called instead of the getattr() method if the 361987da915Sopenharmony_ci * file information is available. 362987da915Sopenharmony_ci * 363987da915Sopenharmony_ci * Currently this is only called after the create() method if that 364987da915Sopenharmony_ci * is implemented (see above). Later it may be called for 365987da915Sopenharmony_ci * invocations of fstat() too. 366987da915Sopenharmony_ci * 367987da915Sopenharmony_ci * Introduced in version 2.5 368987da915Sopenharmony_ci */ 369987da915Sopenharmony_ci int (*fgetattr) (const char *, struct stat *, struct fuse_file_info *); 370987da915Sopenharmony_ci 371987da915Sopenharmony_ci /** 372987da915Sopenharmony_ci * Perform POSIX file locking operation 373987da915Sopenharmony_ci * 374987da915Sopenharmony_ci * The cmd argument will be either F_GETLK, F_SETLK or F_SETLKW. 375987da915Sopenharmony_ci * 376987da915Sopenharmony_ci * For the meaning of fields in 'struct flock' see the man page 377987da915Sopenharmony_ci * for fcntl(2). The l_whence field will always be set to 378987da915Sopenharmony_ci * SEEK_SET. 379987da915Sopenharmony_ci * 380987da915Sopenharmony_ci * For checking lock ownership, the 'fuse_file_info->owner' 381987da915Sopenharmony_ci * argument must be used. 382987da915Sopenharmony_ci * 383987da915Sopenharmony_ci * For F_GETLK operation, the library will first check currently 384987da915Sopenharmony_ci * held locks, and if a conflicting lock is found it will return 385987da915Sopenharmony_ci * information without calling this method. This ensures, that 386987da915Sopenharmony_ci * for local locks the l_pid field is correctly filled in. The 387987da915Sopenharmony_ci * results may not be accurate in case of race conditions and in 388987da915Sopenharmony_ci * the presence of hard links, but it's unlikly that an 389987da915Sopenharmony_ci * application would rely on accurate GETLK results in these 390987da915Sopenharmony_ci * cases. If a conflicting lock is not found, this method will be 391987da915Sopenharmony_ci * called, and the filesystem may fill out l_pid by a meaningful 392987da915Sopenharmony_ci * value, or it may leave this field zero. 393987da915Sopenharmony_ci * 394987da915Sopenharmony_ci * For F_SETLK and F_SETLKW the l_pid field will be set to the pid 395987da915Sopenharmony_ci * of the process performing the locking operation. 396987da915Sopenharmony_ci * 397987da915Sopenharmony_ci * Note: if this method is not implemented, the kernel will still 398987da915Sopenharmony_ci * allow file locking to work locally. Hence it is only 399987da915Sopenharmony_ci * interesting for network filesystems and similar. 400987da915Sopenharmony_ci * 401987da915Sopenharmony_ci * Introduced in version 2.6 402987da915Sopenharmony_ci */ 403987da915Sopenharmony_ci int (*lock) (const char *, struct fuse_file_info *, int cmd, 404987da915Sopenharmony_ci struct flock *); 405987da915Sopenharmony_ci 406987da915Sopenharmony_ci /** 407987da915Sopenharmony_ci * Change the access and modification times of a file with 408987da915Sopenharmony_ci * nanosecond resolution 409987da915Sopenharmony_ci * 410987da915Sopenharmony_ci * Introduced in version 2.6 411987da915Sopenharmony_ci */ 412987da915Sopenharmony_ci int (*utimens) (const char *, const struct timespec tv[2]); 413987da915Sopenharmony_ci 414987da915Sopenharmony_ci /** 415987da915Sopenharmony_ci * Map block index within file to block index within device 416987da915Sopenharmony_ci * 417987da915Sopenharmony_ci * Note: This makes sense only for block device backed filesystems 418987da915Sopenharmony_ci * mounted with the 'blkdev' option 419987da915Sopenharmony_ci * 420987da915Sopenharmony_ci * Introduced in version 2.6 421987da915Sopenharmony_ci */ 422987da915Sopenharmony_ci int (*bmap) (const char *, size_t blocksize, uint64_t *idx); 423987da915Sopenharmony_ci 424987da915Sopenharmony_ci /** 425987da915Sopenharmony_ci * Ioctl 426987da915Sopenharmony_ci * 427987da915Sopenharmony_ci * flags will have FUSE_IOCTL_COMPAT set for 32bit ioctls in 428987da915Sopenharmony_ci * 64bit environment. The size and direction of data is 429987da915Sopenharmony_ci * determined by _IOC_*() decoding of cmd. For _IOC_NONE, 430987da915Sopenharmony_ci * data will be NULL, for _IOC_WRITE data is out area, for 431987da915Sopenharmony_ci * _IOC_READ in area and if both are set in/out area. In all 432987da915Sopenharmony_ci * non-NULL cases, the area is of _IOC_SIZE(cmd) bytes. 433987da915Sopenharmony_ci * 434987da915Sopenharmony_ci * Introduced in version 2.8 435987da915Sopenharmony_ci * 436987da915Sopenharmony_ci * Note : the unsigned long request submitted by the application 437987da915Sopenharmony_ci * is truncated to 32 bits, and forwarded as a signed int. 438987da915Sopenharmony_ci */ 439987da915Sopenharmony_ci int (*ioctl) (const char *, int cmd, void *arg, 440987da915Sopenharmony_ci struct fuse_file_info *, unsigned int flags, void *data); 441987da915Sopenharmony_ci 442987da915Sopenharmony_ci /* 443987da915Sopenharmony_ci * The flags below have been discarded, they should not be used 444987da915Sopenharmony_ci */ 445987da915Sopenharmony_ci unsigned int flag_nullpath_ok : 1; 446987da915Sopenharmony_ci /** 447987da915Sopenharmony_ci * Reserved flags, don't set 448987da915Sopenharmony_ci */ 449987da915Sopenharmony_ci unsigned int flag_reserved : 30; 450987da915Sopenharmony_ci 451987da915Sopenharmony_ci}; 452987da915Sopenharmony_ci 453987da915Sopenharmony_ci/** Extra context that may be needed by some filesystems 454987da915Sopenharmony_ci * 455987da915Sopenharmony_ci * The uid, gid and pid fields are not filled in case of a writepage 456987da915Sopenharmony_ci * operation. 457987da915Sopenharmony_ci */ 458987da915Sopenharmony_cistruct fuse_context { 459987da915Sopenharmony_ci /** Pointer to the fuse object */ 460987da915Sopenharmony_ci struct fuse *fuse; 461987da915Sopenharmony_ci 462987da915Sopenharmony_ci /** User ID of the calling process */ 463987da915Sopenharmony_ci uid_t uid; 464987da915Sopenharmony_ci 465987da915Sopenharmony_ci /** Group ID of the calling process */ 466987da915Sopenharmony_ci gid_t gid; 467987da915Sopenharmony_ci 468987da915Sopenharmony_ci /** Thread ID of the calling process */ 469987da915Sopenharmony_ci pid_t pid; 470987da915Sopenharmony_ci 471987da915Sopenharmony_ci /** Private filesystem data */ 472987da915Sopenharmony_ci void *private_data; 473987da915Sopenharmony_ci 474987da915Sopenharmony_ci /** Umask of the calling process (introduced in version 2.8) */ 475987da915Sopenharmony_ci mode_t umask; 476987da915Sopenharmony_ci}; 477987da915Sopenharmony_ci 478987da915Sopenharmony_ci/* ----------------------------------------------------------- * 479987da915Sopenharmony_ci * More detailed API * 480987da915Sopenharmony_ci * ----------------------------------------------------------- */ 481987da915Sopenharmony_ci 482987da915Sopenharmony_ci/** 483987da915Sopenharmony_ci * Create a new FUSE filesystem. 484987da915Sopenharmony_ci * 485987da915Sopenharmony_ci * @param ch the communication channel 486987da915Sopenharmony_ci * @param args argument vector 487987da915Sopenharmony_ci * @param op the filesystem operations 488987da915Sopenharmony_ci * @param op_size the size of the fuse_operations structure 489987da915Sopenharmony_ci * @param user_data user data supplied in the context during the init() method 490987da915Sopenharmony_ci * @return the created FUSE handle 491987da915Sopenharmony_ci */ 492987da915Sopenharmony_cistruct fuse *fuse_new(struct fuse_chan *ch, struct fuse_args *args, 493987da915Sopenharmony_ci const struct fuse_operations *op, size_t op_size, 494987da915Sopenharmony_ci void *user_data); 495987da915Sopenharmony_ci 496987da915Sopenharmony_ci/** 497987da915Sopenharmony_ci * Destroy the FUSE handle. 498987da915Sopenharmony_ci * 499987da915Sopenharmony_ci * The communication channel attached to the handle is also destroyed. 500987da915Sopenharmony_ci * 501987da915Sopenharmony_ci * NOTE: This function does not unmount the filesystem. If this is 502987da915Sopenharmony_ci * needed, call fuse_unmount() before calling this function. 503987da915Sopenharmony_ci * 504987da915Sopenharmony_ci * @param f the FUSE handle 505987da915Sopenharmony_ci */ 506987da915Sopenharmony_civoid fuse_destroy(struct fuse *f); 507987da915Sopenharmony_ci 508987da915Sopenharmony_ci/** 509987da915Sopenharmony_ci * FUSE event loop. 510987da915Sopenharmony_ci * 511987da915Sopenharmony_ci * Requests from the kernel are processed, and the appropriate 512987da915Sopenharmony_ci * operations are called. 513987da915Sopenharmony_ci * 514987da915Sopenharmony_ci * @param f the FUSE handle 515987da915Sopenharmony_ci * @return 0 if no error occurred, -1 otherwise 516987da915Sopenharmony_ci */ 517987da915Sopenharmony_ciint fuse_loop(struct fuse *f); 518987da915Sopenharmony_ci 519987da915Sopenharmony_ci/** 520987da915Sopenharmony_ci * Exit from event loop 521987da915Sopenharmony_ci * 522987da915Sopenharmony_ci * @param f the FUSE handle 523987da915Sopenharmony_ci */ 524987da915Sopenharmony_civoid fuse_exit(struct fuse *f); 525987da915Sopenharmony_ci 526987da915Sopenharmony_ci/** 527987da915Sopenharmony_ci * Get the current context 528987da915Sopenharmony_ci * 529987da915Sopenharmony_ci * The context is only valid for the duration of a filesystem 530987da915Sopenharmony_ci * operation, and thus must not be stored and used later. 531987da915Sopenharmony_ci * 532987da915Sopenharmony_ci * @return the context 533987da915Sopenharmony_ci */ 534987da915Sopenharmony_cistruct fuse_context *fuse_get_context(void); 535987da915Sopenharmony_ci 536987da915Sopenharmony_ci/** 537987da915Sopenharmony_ci * Check if a request has already been interrupted 538987da915Sopenharmony_ci * 539987da915Sopenharmony_ci * @param req request handle 540987da915Sopenharmony_ci * @return 1 if the request has been interrupted, 0 otherwise 541987da915Sopenharmony_ci */ 542987da915Sopenharmony_ciint fuse_interrupted(void); 543987da915Sopenharmony_ci 544987da915Sopenharmony_ci/* 545987da915Sopenharmony_ci * Stacking API 546987da915Sopenharmony_ci */ 547987da915Sopenharmony_ci 548987da915Sopenharmony_ci/** 549987da915Sopenharmony_ci * Fuse filesystem object 550987da915Sopenharmony_ci * 551987da915Sopenharmony_ci * This is opaque object represents a filesystem layer 552987da915Sopenharmony_ci */ 553987da915Sopenharmony_cistruct fuse_fs; 554987da915Sopenharmony_ci 555987da915Sopenharmony_ci/* 556987da915Sopenharmony_ci * These functions call the relevant filesystem operation, and return 557987da915Sopenharmony_ci * the result. 558987da915Sopenharmony_ci * 559987da915Sopenharmony_ci * If the operation is not defined, they return -ENOSYS, with the 560987da915Sopenharmony_ci * exception of fuse_fs_open, fuse_fs_release, fuse_fs_opendir, 561987da915Sopenharmony_ci * fuse_fs_releasedir and fuse_fs_statfs, which return 0. 562987da915Sopenharmony_ci */ 563987da915Sopenharmony_ci 564987da915Sopenharmony_ciint fuse_fs_getattr(struct fuse_fs *fs, const char *path, struct stat *buf); 565987da915Sopenharmony_ciint fuse_fs_fgetattr(struct fuse_fs *fs, const char *path, struct stat *buf, 566987da915Sopenharmony_ci struct fuse_file_info *fi); 567987da915Sopenharmony_ciint fuse_fs_rename(struct fuse_fs *fs, const char *oldpath, 568987da915Sopenharmony_ci const char *newpath); 569987da915Sopenharmony_ciint fuse_fs_unlink(struct fuse_fs *fs, const char *path); 570987da915Sopenharmony_ciint fuse_fs_rmdir(struct fuse_fs *fs, const char *path); 571987da915Sopenharmony_ciint fuse_fs_symlink(struct fuse_fs *fs, const char *linkname, 572987da915Sopenharmony_ci const char *path); 573987da915Sopenharmony_ciint fuse_fs_link(struct fuse_fs *fs, const char *oldpath, const char *newpath); 574987da915Sopenharmony_ciint fuse_fs_release(struct fuse_fs *fs, const char *path, 575987da915Sopenharmony_ci struct fuse_file_info *fi); 576987da915Sopenharmony_ciint fuse_fs_open(struct fuse_fs *fs, const char *path, 577987da915Sopenharmony_ci struct fuse_file_info *fi); 578987da915Sopenharmony_ciint fuse_fs_read(struct fuse_fs *fs, const char *path, char *buf, size_t size, 579987da915Sopenharmony_ci off_t off, struct fuse_file_info *fi); 580987da915Sopenharmony_ciint fuse_fs_write(struct fuse_fs *fs, const char *path, const char *buf, 581987da915Sopenharmony_ci size_t size, off_t off, struct fuse_file_info *fi); 582987da915Sopenharmony_ciint fuse_fs_fsync(struct fuse_fs *fs, const char *path, int datasync, 583987da915Sopenharmony_ci struct fuse_file_info *fi); 584987da915Sopenharmony_ciint fuse_fs_flush(struct fuse_fs *fs, const char *path, 585987da915Sopenharmony_ci struct fuse_file_info *fi); 586987da915Sopenharmony_ciint fuse_fs_statfs(struct fuse_fs *fs, const char *path, struct statvfs *buf); 587987da915Sopenharmony_ciint fuse_fs_opendir(struct fuse_fs *fs, const char *path, 588987da915Sopenharmony_ci struct fuse_file_info *fi); 589987da915Sopenharmony_ciint fuse_fs_readdir(struct fuse_fs *fs, const char *path, void *buf, 590987da915Sopenharmony_ci fuse_fill_dir_t filler, off_t off, 591987da915Sopenharmony_ci struct fuse_file_info *fi); 592987da915Sopenharmony_ciint fuse_fs_fsyncdir(struct fuse_fs *fs, const char *path, int datasync, 593987da915Sopenharmony_ci struct fuse_file_info *fi); 594987da915Sopenharmony_ciint fuse_fs_releasedir(struct fuse_fs *fs, const char *path, 595987da915Sopenharmony_ci struct fuse_file_info *fi); 596987da915Sopenharmony_ciint fuse_fs_create(struct fuse_fs *fs, const char *path, mode_t mode, 597987da915Sopenharmony_ci struct fuse_file_info *fi); 598987da915Sopenharmony_ciint fuse_fs_lock(struct fuse_fs *fs, const char *path, 599987da915Sopenharmony_ci struct fuse_file_info *fi, int cmd, struct flock *lock); 600987da915Sopenharmony_ciint fuse_fs_chmod(struct fuse_fs *fs, const char *path, mode_t mode); 601987da915Sopenharmony_ciint fuse_fs_chown(struct fuse_fs *fs, const char *path, uid_t uid, gid_t gid); 602987da915Sopenharmony_ciint fuse_fs_truncate(struct fuse_fs *fs, const char *path, off_t size); 603987da915Sopenharmony_ciint fuse_fs_ftruncate(struct fuse_fs *fs, const char *path, off_t size, 604987da915Sopenharmony_ci struct fuse_file_info *fi); 605987da915Sopenharmony_ciint fuse_fs_utimens(struct fuse_fs *fs, const char *path, 606987da915Sopenharmony_ci const struct timespec tv[2]); 607987da915Sopenharmony_ciint fuse_fs_access(struct fuse_fs *fs, const char *path, int mask); 608987da915Sopenharmony_ciint fuse_fs_readlink(struct fuse_fs *fs, const char *path, char *buf, 609987da915Sopenharmony_ci size_t len); 610987da915Sopenharmony_ciint fuse_fs_mknod(struct fuse_fs *fs, const char *path, mode_t mode, 611987da915Sopenharmony_ci dev_t rdev); 612987da915Sopenharmony_ciint fuse_fs_mkdir(struct fuse_fs *fs, const char *path, mode_t mode); 613987da915Sopenharmony_ciint fuse_fs_setxattr(struct fuse_fs *fs, const char *path, const char *name, 614987da915Sopenharmony_ci const char *value, size_t size, int flags); 615987da915Sopenharmony_ciint fuse_fs_getxattr(struct fuse_fs *fs, const char *path, const char *name, 616987da915Sopenharmony_ci char *value, size_t size); 617987da915Sopenharmony_ciint fuse_fs_listxattr(struct fuse_fs *fs, const char *path, char *list, 618987da915Sopenharmony_ci size_t size); 619987da915Sopenharmony_ciint fuse_fs_removexattr(struct fuse_fs *fs, const char *path, 620987da915Sopenharmony_ci const char *name); 621987da915Sopenharmony_ciint fuse_fs_bmap(struct fuse_fs *fs, const char *path, size_t blocksize, 622987da915Sopenharmony_ci uint64_t *idx); 623987da915Sopenharmony_ciint fuse_fs_ioctl(struct fuse_fs *fs, const char *path, int cmd, void *arg, 624987da915Sopenharmony_ci struct fuse_file_info *fi, unsigned int flags, void *data); 625987da915Sopenharmony_civoid fuse_fs_init(struct fuse_fs *fs, struct fuse_conn_info *conn); 626987da915Sopenharmony_civoid fuse_fs_destroy(struct fuse_fs *fs); 627987da915Sopenharmony_ci 628987da915Sopenharmony_ci/** 629987da915Sopenharmony_ci * Create a new fuse filesystem object 630987da915Sopenharmony_ci * 631987da915Sopenharmony_ci * This is usually called from the factory of a fuse module to create 632987da915Sopenharmony_ci * a new instance of a filesystem. 633987da915Sopenharmony_ci * 634987da915Sopenharmony_ci * @param op the filesystem operations 635987da915Sopenharmony_ci * @param op_size the size of the fuse_operations structure 636987da915Sopenharmony_ci * @param user_data user data supplied in the context during the init() method 637987da915Sopenharmony_ci * @return a new filesystem object 638987da915Sopenharmony_ci */ 639987da915Sopenharmony_cistruct fuse_fs *fuse_fs_new(const struct fuse_operations *op, size_t op_size, 640987da915Sopenharmony_ci void *user_data); 641987da915Sopenharmony_ci 642987da915Sopenharmony_ci#ifdef __SOLARIS__ 643987da915Sopenharmony_ci 644987da915Sopenharmony_ci/** 645987da915Sopenharmony_ci * Filesystem module 646987da915Sopenharmony_ci * 647987da915Sopenharmony_ci * Filesystem modules are registered with the FUSE_REGISTER_MODULE() 648987da915Sopenharmony_ci * macro. 649987da915Sopenharmony_ci * 650987da915Sopenharmony_ci * If the "-omodules=modname:..." option is present, filesystem 651987da915Sopenharmony_ci * objects are created and pushed onto the stack with the 'factory' 652987da915Sopenharmony_ci * function. 653987da915Sopenharmony_ci */ 654987da915Sopenharmony_cistruct fuse_module { 655987da915Sopenharmony_ci /** 656987da915Sopenharmony_ci * Name of filesystem 657987da915Sopenharmony_ci */ 658987da915Sopenharmony_ci const char *name; 659987da915Sopenharmony_ci 660987da915Sopenharmony_ci /** 661987da915Sopenharmony_ci * Factory for creating filesystem objects 662987da915Sopenharmony_ci * 663987da915Sopenharmony_ci * The function may use and remove options from 'args' that belong 664987da915Sopenharmony_ci * to this module. 665987da915Sopenharmony_ci * 666987da915Sopenharmony_ci * For now the 'fs' vector always contains exactly one filesystem. 667987da915Sopenharmony_ci * This is the filesystem which will be below the newly created 668987da915Sopenharmony_ci * filesystem in the stack. 669987da915Sopenharmony_ci * 670987da915Sopenharmony_ci * @param args the command line arguments 671987da915Sopenharmony_ci * @param fs NULL terminated filesystem object vector 672987da915Sopenharmony_ci * @return the new filesystem object 673987da915Sopenharmony_ci */ 674987da915Sopenharmony_ci struct fuse_fs *(*factory)(struct fuse_args *args, struct fuse_fs *fs[]); 675987da915Sopenharmony_ci 676987da915Sopenharmony_ci struct fuse_module *next; 677987da915Sopenharmony_ci struct fusemod_so *so; 678987da915Sopenharmony_ci int ctr; 679987da915Sopenharmony_ci}; 680987da915Sopenharmony_ci 681987da915Sopenharmony_ci#endif /* __SOLARIS__ */ 682987da915Sopenharmony_ci 683987da915Sopenharmony_ci/* ----------------------------------------------------------- * 684987da915Sopenharmony_ci * Advanced API for event handling, don't worry about this... * 685987da915Sopenharmony_ci * ----------------------------------------------------------- */ 686987da915Sopenharmony_ci 687987da915Sopenharmony_ci/* NOTE: the following functions are deprecated, and will be removed 688987da915Sopenharmony_ci from the 3.0 API. Use the lowlevel session functions instead */ 689987da915Sopenharmony_ci 690987da915Sopenharmony_ci/** Get session from fuse object */ 691987da915Sopenharmony_cistruct fuse_session *fuse_get_session(struct fuse *f); 692987da915Sopenharmony_ci 693987da915Sopenharmony_ci#ifdef __cplusplus 694987da915Sopenharmony_ci} 695987da915Sopenharmony_ci#endif 696987da915Sopenharmony_ci 697987da915Sopenharmony_ci#endif /* _FUSE_H_ */ 698