You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1857 lines
52 KiB

  1. /*
  2. FUSE: Filesystem in Userspace
  3. Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
  4. This program can be distributed under the terms of the GNU LGPLv2.
  5. See the file COPYING.LIB.
  6. */
  7. #ifndef _FUSE_LOWLEVEL_H_
  8. #define _FUSE_LOWLEVEL_H_
  9. /** @file
  10. *
  11. * Low level API
  12. *
  13. * IMPORTANT: you should define FUSE_USE_VERSION before including this
  14. * header. To use the newest API define it to 26 (recommended for any
  15. * new application), to use the old API define it to 24 (default) or
  16. * 25
  17. */
  18. #ifndef FUSE_USE_VERSION
  19. #define FUSE_USE_VERSION 24
  20. #endif
  21. #include "fuse_common.h"
  22. #include <fcntl.h>
  23. #include <stdint.h>
  24. #include <sys/stat.h>
  25. #include <sys/statvfs.h>
  26. #include <sys/types.h>
  27. #include <sys/uio.h>
  28. #include <utime.h>
  29. #ifdef __cplusplus
  30. extern "C" {
  31. #endif
  32. /* ----------------------------------------------------------- *
  33. * Miscellaneous definitions *
  34. * ----------------------------------------------------------- */
  35. /** The node ID of the root inode */
  36. #define FUSE_ROOT_ID 1
  37. /** Inode number type */
  38. typedef uint64_t fuse_ino_t;
  39. /** Request pointer type */
  40. typedef struct fuse_req *fuse_req_t;
  41. /**
  42. * Session
  43. *
  44. * This provides hooks for processing requests, and exiting
  45. */
  46. struct fuse_session;
  47. /**
  48. * Channel
  49. *
  50. * A communication channel, providing hooks for sending and receiving
  51. * messages
  52. */
  53. struct fuse_chan;
  54. /** Directory entry parameters supplied to fuse_reply_entry() */
  55. struct fuse_entry_param {
  56. /** Unique inode number
  57. *
  58. * In lookup, zero means negative entry (from version 2.5)
  59. * Returning ENOENT also means negative entry, but by setting zero
  60. * ino the kernel may cache negative entries for entry_timeout
  61. * seconds.
  62. */
  63. fuse_ino_t ino;
  64. /** Generation number for this entry.
  65. *
  66. * If the file system will be exported over NFS, the
  67. * ino/generation pairs need to be unique over the file
  68. * system's lifetime (rather than just the mount time). So if
  69. * the file system reuses an inode after it has been deleted,
  70. * it must assign a new, previously unused generation number
  71. * to the inode at the same time.
  72. *
  73. * The generation must be non-zero, otherwise FUSE will treat
  74. * it as an error.
  75. *
  76. */
  77. uint64_t generation;
  78. /** Inode attributes.
  79. *
  80. * Even if attr_timeout == 0, attr must be correct. For example,
  81. * for open(), FUSE uses attr.st_size from lookup() to determine
  82. * how many bytes to request. If this value is not correct,
  83. * incorrect data will be returned.
  84. */
  85. struct stat attr;
  86. fuse_timeouts_t timeout;
  87. };
  88. /** Additional context associated with requests */
  89. struct fuse_ctx {
  90. /** User ID of the calling process */
  91. uid_t uid;
  92. /** Group ID of the calling process */
  93. gid_t gid;
  94. /** Thread ID of the calling process */
  95. pid_t pid;
  96. /** Umask of the calling process (introduced in version 2.8) */
  97. mode_t umask;
  98. };
  99. struct fuse_forget_data {
  100. fuse_ino_t ino;
  101. uint64_t nlookup;
  102. };
  103. /* ----------------------------------------------------------- *
  104. * Request methods and replies *
  105. * ----------------------------------------------------------- */
  106. /**
  107. * Low level filesystem operations
  108. *
  109. * Most of the methods (with the exception of init and destroy)
  110. * receive a request handle (fuse_req_t) as their first argument.
  111. * This handle must be passed to one of the specified reply functions.
  112. *
  113. * This may be done inside the method invocation, or after the call
  114. * has returned. The request handle is valid until one of the reply
  115. * functions is called.
  116. *
  117. * Other pointer arguments (name, fuse_file_info, etc) are not valid
  118. * after the call has returned, so if they are needed later, their
  119. * contents have to be copied.
  120. *
  121. * The filesystem sometimes needs to handle a return value of -ENOENT
  122. * from the reply function, which means, that the request was
  123. * interrupted, and the reply discarded. For example if
  124. * fuse_reply_open() return -ENOENT means, that the release method for
  125. * this file will not be called.
  126. */
  127. struct fuse_lowlevel_ops {
  128. /**
  129. * Initialize filesystem
  130. *
  131. * Called before any other filesystem method
  132. *
  133. * There's no reply to this function
  134. *
  135. * @param userdata the user data passed to fuse_lowlevel_new()
  136. */
  137. void (*init) (void *userdata, struct fuse_conn_info *conn);
  138. /**
  139. * Clean up filesystem
  140. *
  141. * Called on filesystem exit
  142. *
  143. * There's no reply to this function
  144. *
  145. * @param userdata the user data passed to fuse_lowlevel_new()
  146. */
  147. void (*destroy) (void *userdata);
  148. /**
  149. * Look up a directory entry by name and get its attributes.
  150. *
  151. * Valid replies:
  152. * fuse_reply_entry
  153. * fuse_reply_err
  154. *
  155. * @param req request handle
  156. * @param parent inode number of the parent directory
  157. * @param name the name to look up
  158. */
  159. void (*lookup) (fuse_req_t req, fuse_ino_t parent, const char *name);
  160. /**
  161. * Forget about an inode
  162. *
  163. * This function is called when the kernel removes an inode
  164. * from its internal caches.
  165. *
  166. * The inode's lookup count increases by one for every call to
  167. * fuse_reply_entry and fuse_reply_create. The nlookup parameter
  168. * indicates by how much the lookup count should be decreased.
  169. *
  170. * Inodes with a non-zero lookup count may receive request from
  171. * the kernel even after calls to unlink, rmdir or (when
  172. * overwriting an existing file) rename. Filesystems must handle
  173. * such requests properly and it is recommended to defer removal
  174. * of the inode until the lookup count reaches zero. Calls to
  175. * unlink, remdir or rename will be followed closely by forget
  176. * unless the file or directory is open, in which case the
  177. * kernel issues forget only after the release or releasedir
  178. * calls.
  179. *
  180. * Note that if a file system will be exported over NFS the
  181. * inodes lifetime must extend even beyond forget. See the
  182. * generation field in struct fuse_entry_param above.
  183. *
  184. * On unmount the lookup count for all inodes implicitly drops
  185. * to zero. It is not guaranteed that the file system will
  186. * receive corresponding forget messages for the affected
  187. * inodes.
  188. *
  189. * Valid replies:
  190. * fuse_reply_none
  191. *
  192. * @param req request handle
  193. * @param ino the inode number
  194. * @param nlookup the number of lookups to forget
  195. */
  196. void (*forget) (fuse_req_t req, fuse_ino_t ino, uint64_t nlookup);
  197. /**
  198. * Get file attributes
  199. *
  200. * Valid replies:
  201. * fuse_reply_attr
  202. * fuse_reply_err
  203. *
  204. * @param req request handle
  205. * @param ino the inode number
  206. * @param fi for future use, currently always NULL
  207. */
  208. void (*getattr) (fuse_req_t req, fuse_ino_t ino,
  209. struct fuse_file_info *fi);
  210. /**
  211. * Set file attributes
  212. *
  213. * In the 'attr' argument only members indicated by the 'to_set'
  214. * bitmask contain valid values. Other members contain undefined
  215. * values.
  216. *
  217. * If the setattr was invoked from the ftruncate() system call
  218. * under Linux kernel versions 2.6.15 or later, the fi->fh will
  219. * contain the value set by the open method or will be undefined
  220. * if the open method didn't set any value. Otherwise (not
  221. * ftruncate call, or kernel version earlier than 2.6.15) the fi
  222. * parameter will be NULL.
  223. *
  224. * Valid replies:
  225. * fuse_reply_attr
  226. * fuse_reply_err
  227. *
  228. * @param req request handle
  229. * @param ino the inode number
  230. * @param attr the attributes
  231. * @param to_set bit mask of attributes which should be set
  232. * @param fi file information, or NULL
  233. *
  234. * Changed in version 2.5:
  235. * file information filled in for ftruncate
  236. */
  237. void (*setattr) (fuse_req_t req, fuse_ino_t ino, struct stat *attr,
  238. int to_set, struct fuse_file_info *fi);
  239. /**
  240. * Read symbolic link
  241. *
  242. * Valid replies:
  243. * fuse_reply_readlink
  244. * fuse_reply_err
  245. *
  246. * @param req request handle
  247. * @param ino the inode number
  248. */
  249. void (*readlink) (fuse_req_t req, fuse_ino_t ino);
  250. /**
  251. * Create file node
  252. *
  253. * Create a regular file, character device, block device, fifo or
  254. * socket node.
  255. *
  256. * Valid replies:
  257. * fuse_reply_entry
  258. * fuse_reply_err
  259. *
  260. * @param req request handle
  261. * @param parent inode number of the parent directory
  262. * @param name to create
  263. * @param mode file type and mode with which to create the new file
  264. * @param rdev the device number (only valid if created file is a device)
  265. */
  266. void (*mknod) (fuse_req_t req, fuse_ino_t parent, const char *name,
  267. mode_t mode, dev_t rdev);
  268. /**
  269. * Create a directory
  270. *
  271. * Valid replies:
  272. * fuse_reply_entry
  273. * fuse_reply_err
  274. *
  275. * @param req request handle
  276. * @param parent inode number of the parent directory
  277. * @param name to create
  278. * @param mode with which to create the new file
  279. */
  280. void (*mkdir) (fuse_req_t req, fuse_ino_t parent, const char *name,
  281. mode_t mode);
  282. /**
  283. * Remove a file
  284. *
  285. * If the file's inode's lookup count is non-zero, the file
  286. * system is expected to postpone any removal of the inode
  287. * until the lookup count reaches zero (see description of the
  288. * forget function).
  289. *
  290. * Valid replies:
  291. * fuse_reply_err
  292. *
  293. * @param req request handle
  294. * @param parent inode number of the parent directory
  295. * @param name to remove
  296. */
  297. void (*unlink) (fuse_req_t req, fuse_ino_t parent, const char *name);
  298. /**
  299. * Remove a directory
  300. *
  301. * If the directory's inode's lookup count is non-zero, the
  302. * file system is expected to postpone any removal of the
  303. * inode until the lookup count reaches zero (see description
  304. * of the forget function).
  305. *
  306. * Valid replies:
  307. * fuse_reply_err
  308. *
  309. * @param req request handle
  310. * @param parent inode number of the parent directory
  311. * @param name to remove
  312. */
  313. void (*rmdir) (fuse_req_t req, fuse_ino_t parent, const char *name);
  314. /**
  315. * Create a symbolic link
  316. *
  317. * Valid replies:
  318. * fuse_reply_entry
  319. * fuse_reply_err
  320. *
  321. * @param req request handle
  322. * @param link the contents of the symbolic link
  323. * @param parent inode number of the parent directory
  324. * @param name to create
  325. */
  326. void (*symlink) (fuse_req_t req, const char *link, fuse_ino_t parent,
  327. const char *name);
  328. /** Rename a file
  329. *
  330. * If the target exists it should be atomically replaced. If
  331. * the target's inode's lookup count is non-zero, the file
  332. * system is expected to postpone any removal of the inode
  333. * until the lookup count reaches zero (see description of the
  334. * forget function).
  335. *
  336. * Valid replies:
  337. * fuse_reply_err
  338. *
  339. * @param req request handle
  340. * @param parent inode number of the old parent directory
  341. * @param name old name
  342. * @param newparent inode number of the new parent directory
  343. * @param newname new name
  344. */
  345. void (*rename) (fuse_req_t req, fuse_ino_t parent, const char *name,
  346. fuse_ino_t newparent, const char *newname);
  347. /**
  348. * Create a hard link
  349. *
  350. * Valid replies:
  351. * fuse_reply_entry
  352. * fuse_reply_err
  353. *
  354. * @param req request handle
  355. * @param ino the old inode number
  356. * @param newparent inode number of the new parent directory
  357. * @param newname new name to create
  358. */
  359. void (*link) (fuse_req_t req, fuse_ino_t ino, fuse_ino_t newparent,
  360. const char *newname);
  361. /**
  362. * Open a file
  363. *
  364. * Open flags (with the exception of O_CREAT, O_EXCL, O_NOCTTY and
  365. * O_TRUNC) are available in fi->flags.
  366. *
  367. * Filesystem may store an arbitrary file handle (pointer, index,
  368. * etc) in fi->fh, and use this in other all other file operations
  369. * (read, write, flush, release, fsync).
  370. *
  371. * Filesystem may also implement stateless file I/O and not store
  372. * anything in fi->fh.
  373. *
  374. * There are also some flags (direct_io, keep_cache) which the
  375. * filesystem may set in fi, to change the way the file is opened.
  376. * See fuse_file_info structure in <fuse_common.h> for more details.
  377. *
  378. * Valid replies:
  379. * fuse_reply_open
  380. * fuse_reply_err
  381. *
  382. * @param req request handle
  383. * @param ino the inode number
  384. * @param fi file information
  385. */
  386. void (*open) (fuse_req_t req, fuse_ino_t ino,
  387. struct fuse_file_info *fi);
  388. /**
  389. * Read data
  390. *
  391. * Read should send exactly the number of bytes requested except
  392. * on EOF or error, otherwise the rest of the data will be
  393. * substituted with zeroes. An exception to this is when the file
  394. * has been opened in 'direct_io' mode, in which case the return
  395. * value of the read system call will reflect the return value of
  396. * this operation.
  397. *
  398. * fi->fh will contain the value set by the open method, or will
  399. * be undefined if the open method didn't set any value.
  400. *
  401. * Valid replies:
  402. * fuse_reply_buf
  403. * fuse_reply_iov
  404. * fuse_reply_data
  405. * fuse_reply_err
  406. *
  407. * @param req request handle
  408. * @param ino the inode number
  409. * @param size number of bytes to read
  410. * @param off offset to read from
  411. * @param fi file information
  412. */
  413. void (*read) (fuse_req_t req, fuse_ino_t ino, size_t size, off_t off,
  414. struct fuse_file_info *fi);
  415. /**
  416. * Write data
  417. *
  418. * Write should return exactly the number of bytes requested
  419. * except on error. An exception to this is when the file has
  420. * been opened in 'direct_io' mode, in which case the return value
  421. * of the write system call will reflect the return value of this
  422. * operation.
  423. *
  424. * fi->fh will contain the value set by the open method, or will
  425. * be undefined if the open method didn't set any value.
  426. *
  427. * Valid replies:
  428. * fuse_reply_write
  429. * fuse_reply_err
  430. *
  431. * @param req request handle
  432. * @param ino the inode number
  433. * @param buf data to write
  434. * @param size number of bytes to write
  435. * @param off offset to write to
  436. * @param fi file information
  437. */
  438. void (*write) (fuse_req_t req, fuse_ino_t ino, const char *buf,
  439. size_t size, off_t off, struct fuse_file_info *fi);
  440. /**
  441. * Flush method
  442. *
  443. * This is called on each close() of the opened file.
  444. *
  445. * Since file descriptors can be duplicated (dup, dup2, fork), for
  446. * one open call there may be many flush calls.
  447. *
  448. * Filesystems shouldn't assume that flush will always be called
  449. * after some writes, or that if will be called at all.
  450. *
  451. * fi->fh will contain the value set by the open method, or will
  452. * be undefined if the open method didn't set any value.
  453. *
  454. * NOTE: the name of the method is misleading, since (unlike
  455. * fsync) the filesystem is not forced to flush pending writes.
  456. * One reason to flush data, is if the filesystem wants to return
  457. * write errors.
  458. *
  459. * If the filesystem supports file locking operations (setlk,
  460. * getlk) it should remove all locks belonging to 'fi->owner'.
  461. *
  462. * Valid replies:
  463. * fuse_reply_err
  464. *
  465. * @param req request handle
  466. * @param ino the inode number
  467. * @param fi file information
  468. */
  469. void (*flush) (fuse_req_t req, fuse_ino_t ino,
  470. struct fuse_file_info *fi);
  471. /**
  472. * Release an open file
  473. *
  474. * Release is called when there are no more references to an open
  475. * file: all file descriptors are closed and all memory mappings
  476. * are unmapped.
  477. *
  478. * For every open call there will be exactly one release call.
  479. *
  480. * The filesystem may reply with an error, but error values are
  481. * not returned to close() or munmap() which triggered the
  482. * release.
  483. *
  484. * fi->fh will contain the value set by the open method, or will
  485. * be undefined if the open method didn't set any value.
  486. * fi->flags will contain the same flags as for open.
  487. *
  488. * Valid replies:
  489. * fuse_reply_err
  490. *
  491. * @param req request handle
  492. * @param ino the inode number
  493. * @param fi file information
  494. */
  495. void (*release) (fuse_req_t req, fuse_ino_t ino,
  496. struct fuse_file_info *fi);
  497. /**
  498. * Synchronize file contents
  499. *
  500. * If the datasync parameter is non-zero, then only the user data
  501. * should be flushed, not the meta data.
  502. *
  503. * Valid replies:
  504. * fuse_reply_err
  505. *
  506. * @param req request handle
  507. * @param ino the inode number
  508. * @param datasync flag indicating if only data should be flushed
  509. * @param fi file information
  510. */
  511. void (*fsync) (fuse_req_t req, fuse_ino_t ino, int datasync,
  512. struct fuse_file_info *fi);
  513. /**
  514. * Open a directory
  515. *
  516. * Filesystem may store an arbitrary file handle (pointer, index,
  517. * etc) in fi->fh, and use this in other all other directory
  518. * stream operations (readdir, releasedir, fsyncdir).
  519. *
  520. * Filesystem may also implement stateless directory I/O and not
  521. * store anything in fi->fh, though that makes it impossible to
  522. * implement standard conforming directory stream operations in
  523. * case the contents of the directory can change between opendir
  524. * and releasedir.
  525. *
  526. * Valid replies:
  527. * fuse_reply_open
  528. * fuse_reply_err
  529. *
  530. * @param req request handle
  531. * @param ino the inode number
  532. * @param fi file information
  533. */
  534. void (*opendir) (fuse_req_t req, fuse_ino_t ino,
  535. struct fuse_file_info *fi);
  536. /**
  537. * Read directory
  538. *
  539. * Send a buffer filled using fuse_add_direntry(), with size not
  540. * exceeding the requested size. Send an empty buffer on end of
  541. * stream.
  542. *
  543. * fi->fh will contain the value set by the opendir method, or
  544. * will be undefined if the opendir method didn't set any value.
  545. *
  546. * Valid replies:
  547. * fuse_reply_buf
  548. * fuse_reply_data
  549. * fuse_reply_err
  550. *
  551. * @param req request handle
  552. * @param ino the inode number
  553. * @param size maximum number of bytes to send
  554. * @param off offset to continue reading the directory stream
  555. * @param fi file information
  556. */
  557. void (*readdir) (fuse_req_t req, fuse_ino_t ino, size_t size, off_t off,
  558. struct fuse_file_info *llffi);
  559. void (*readdir_plus)(fuse_req_t req, fuse_ino_t ino,
  560. size_t size, off_t off,
  561. struct fuse_file_info *ffi);
  562. /**
  563. * Release an open directory
  564. *
  565. * For every opendir call there will be exactly one releasedir
  566. * call.
  567. *
  568. * fi->fh will contain the value set by the opendir method, or
  569. * will be undefined if the opendir method didn't set any value.
  570. *
  571. * Valid replies:
  572. * fuse_reply_err
  573. *
  574. * @param req request handle
  575. * @param ino the inode number
  576. * @param fi file information
  577. */
  578. void (*releasedir) (fuse_req_t req, fuse_ino_t ino,
  579. struct fuse_file_info *fi);
  580. /**
  581. * Synchronize directory contents
  582. *
  583. * If the datasync parameter is non-zero, then only the directory
  584. * contents should be flushed, not the meta data.
  585. *
  586. * fi->fh will contain the value set by the opendir method, or
  587. * will be undefined if the opendir method didn't set any value.
  588. *
  589. * Valid replies:
  590. * fuse_reply_err
  591. *
  592. * @param req request handle
  593. * @param ino the inode number
  594. * @param datasync flag indicating if only data should be flushed
  595. * @param fi file information
  596. */
  597. void (*fsyncdir) (fuse_req_t req, fuse_ino_t ino, int datasync,
  598. struct fuse_file_info *fi);
  599. /**
  600. * Get file system statistics
  601. *
  602. * Valid replies:
  603. * fuse_reply_statfs
  604. * fuse_reply_err
  605. *
  606. * @param req request handle
  607. * @param ino the inode number, zero means "undefined"
  608. */
  609. void (*statfs) (fuse_req_t req, fuse_ino_t ino);
  610. /**
  611. * Set an extended attribute
  612. *
  613. * Valid replies:
  614. * fuse_reply_err
  615. */
  616. void (*setxattr) (fuse_req_t req, fuse_ino_t ino, const char *name,
  617. const char *value, size_t size, int flags);
  618. /**
  619. * Get an extended attribute
  620. *
  621. * If size is zero, the size of the value should be sent with
  622. * fuse_reply_xattr.
  623. *
  624. * If the size is non-zero, and the value fits in the buffer, the
  625. * value should be sent with fuse_reply_buf.
  626. *
  627. * If the size is too small for the value, the ERANGE error should
  628. * be sent.
  629. *
  630. * Valid replies:
  631. * fuse_reply_buf
  632. * fuse_reply_data
  633. * fuse_reply_xattr
  634. * fuse_reply_err
  635. *
  636. * @param req request handle
  637. * @param ino the inode number
  638. * @param name of the extended attribute
  639. * @param size maximum size of the value to send
  640. */
  641. void (*getxattr) (fuse_req_t req, fuse_ino_t ino, const char *name,
  642. size_t size);
  643. /**
  644. * List extended attribute names
  645. *
  646. * If size is zero, the total size of the attribute list should be
  647. * sent with fuse_reply_xattr.
  648. *
  649. * If the size is non-zero, and the null character separated
  650. * attribute list fits in the buffer, the list should be sent with
  651. * fuse_reply_buf.
  652. *
  653. * If the size is too small for the list, the ERANGE error should
  654. * be sent.
  655. *
  656. * Valid replies:
  657. * fuse_reply_buf
  658. * fuse_reply_data
  659. * fuse_reply_xattr
  660. * fuse_reply_err
  661. *
  662. * @param req request handle
  663. * @param ino the inode number
  664. * @param size maximum size of the list to send
  665. */
  666. void (*listxattr) (fuse_req_t req, fuse_ino_t ino, size_t size);
  667. /**
  668. * Remove an extended attribute
  669. *
  670. * Valid replies:
  671. * fuse_reply_err
  672. *
  673. * @param req request handle
  674. * @param ino the inode number
  675. * @param name of the extended attribute
  676. */
  677. void (*removexattr) (fuse_req_t req, fuse_ino_t ino, const char *name);
  678. /**
  679. * Check file access permissions
  680. *
  681. * This will be called for the access() system call. If the
  682. * 'default_permissions' mount option is given, this method is not
  683. * called.
  684. *
  685. * This method is not called under Linux kernel versions 2.4.x
  686. *
  687. * Introduced in version 2.5
  688. *
  689. * Valid replies:
  690. * fuse_reply_err
  691. *
  692. * @param req request handle
  693. * @param ino the inode number
  694. * @param mask requested access mode
  695. */
  696. void (*access) (fuse_req_t req, fuse_ino_t ino, int mask);
  697. /**
  698. * Create and open a file
  699. *
  700. * If the file does not exist, first create it with the specified
  701. * mode, and then open it.
  702. *
  703. * Open flags (with the exception of O_NOCTTY) are available in
  704. * fi->flags.
  705. *
  706. * Filesystem may store an arbitrary file handle (pointer, index,
  707. * etc) in fi->fh, and use this in other all other file operations
  708. * (read, write, flush, release, fsync).
  709. *
  710. * There are also some flags (direct_io, keep_cache) which the
  711. * filesystem may set in fi, to change the way the file is opened.
  712. * See fuse_file_info structure in <fuse_common.h> for more details.
  713. *
  714. * If this method is not implemented or under Linux kernel
  715. * versions earlier than 2.6.15, the mknod() and open() methods
  716. * will be called instead.
  717. *
  718. * Introduced in version 2.5
  719. *
  720. * Valid replies:
  721. * fuse_reply_create
  722. * fuse_reply_err
  723. *
  724. * @param req request handle
  725. * @param parent inode number of the parent directory
  726. * @param name to create
  727. * @param mode file type and mode with which to create the new file
  728. * @param fi file information
  729. */
  730. void (*create) (fuse_req_t req, fuse_ino_t parent, const char *name,
  731. mode_t mode, struct fuse_file_info *fi);
  732. /**
  733. * Test for a POSIX file lock
  734. *
  735. * Introduced in version 2.6
  736. *
  737. * Valid replies:
  738. * fuse_reply_lock
  739. * fuse_reply_err
  740. *
  741. * @param req request handle
  742. * @param ino the inode number
  743. * @param fi file information
  744. * @param lock the region/type to test
  745. */
  746. void (*getlk) (fuse_req_t req, fuse_ino_t ino,
  747. struct fuse_file_info *fi, struct flock *lock);
  748. /**
  749. * Acquire, modify or release a POSIX file lock
  750. *
  751. * For POSIX threads (NPTL) there's a 1-1 relation between pid and
  752. * owner, but otherwise this is not always the case. For checking
  753. * lock ownership, 'fi->owner' must be used. The l_pid field in
  754. * 'struct flock' should only be used to fill in this field in
  755. * getlk().
  756. *
  757. * Note: if the locking methods are not implemented, the kernel
  758. * will still allow file locking to work locally. Hence these are
  759. * only interesting for network filesystems and similar.
  760. *
  761. * Introduced in version 2.6
  762. *
  763. * Valid replies:
  764. * fuse_reply_err
  765. *
  766. * @param req request handle
  767. * @param ino the inode number
  768. * @param fi file information
  769. * @param lock the region/type to set
  770. * @param sleep locking operation may sleep
  771. */
  772. void (*setlk) (fuse_req_t req, fuse_ino_t ino,
  773. struct fuse_file_info *fi,
  774. struct flock *lock, int sleep);
  775. /**
  776. * Map block index within file to block index within device
  777. *
  778. * Note: This makes sense only for block device backed filesystems
  779. * mounted with the 'blkdev' option
  780. *
  781. * Introduced in version 2.6
  782. *
  783. * Valid replies:
  784. * fuse_reply_bmap
  785. * fuse_reply_err
  786. *
  787. * @param req request handle
  788. * @param ino the inode number
  789. * @param blocksize unit of block index
  790. * @param idx block index within file
  791. */
  792. void (*bmap) (fuse_req_t req, fuse_ino_t ino, size_t blocksize,
  793. uint64_t idx);
  794. /**
  795. * Ioctl
  796. *
  797. * Note: For unrestricted ioctls (not allowed for FUSE
  798. * servers), data in and out areas can be discovered by giving
  799. * iovs and setting FUSE_IOCTL_RETRY in @flags. For
  800. * restricted ioctls, kernel prepares in/out data area
  801. * according to the information encoded in cmd.
  802. *
  803. * Introduced in version 2.8
  804. *
  805. * Valid replies:
  806. * fuse_reply_ioctl_retry
  807. * fuse_reply_ioctl
  808. * fuse_reply_ioctl_iov
  809. * fuse_reply_err
  810. *
  811. * @param req request handle
  812. * @param ino the inode number
  813. * @param cmd ioctl command
  814. * @param arg ioctl argument
  815. * @param fi file information
  816. * @param flags for FUSE_IOCTL_* flags
  817. * @param in_buf data fetched from the caller
  818. * @param in_bufsz number of fetched bytes
  819. * @param out_bufsz maximum size of output data
  820. */
  821. void (*ioctl) (fuse_req_t req, fuse_ino_t ino, unsigned long cmd, void *arg,
  822. struct fuse_file_info *fi, unsigned flags,
  823. const void *in_buf, uint32_t in_bufsz, uint32_t out_bufsz);
  824. /**
  825. * Poll for IO readiness
  826. *
  827. * Introduced in version 2.8
  828. *
  829. * Note: If ph is non-NULL, the client should notify
  830. * when IO readiness events occur by calling
  831. * fuse_lowelevel_notify_poll() with the specified ph.
  832. *
  833. * Regardless of the number of times poll with a non-NULL ph
  834. * is received, single notification is enough to clear all.
  835. * Notifying more times incurs overhead but doesn't harm
  836. * correctness.
  837. *
  838. * The callee is responsible for destroying ph with
  839. * fuse_pollhandle_destroy() when no longer in use.
  840. *
  841. * Valid replies:
  842. * fuse_reply_poll
  843. * fuse_reply_err
  844. *
  845. * @param req request handle
  846. * @param ino the inode number
  847. * @param fi file information
  848. * @param ph poll handle to be used for notification
  849. */
  850. void (*poll) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi,
  851. struct fuse_pollhandle *ph);
  852. /**
  853. * Write data made available in a buffer
  854. *
  855. * This is a more generic version of the ->write() method. If
  856. * FUSE_CAP_SPLICE_READ is set in fuse_conn_info.want and the
  857. * kernel supports splicing from the fuse device, then the
  858. * data will be made available in pipe for supporting zero
  859. * copy data transfer.
  860. *
  861. * buf->count is guaranteed to be one (and thus buf->idx is
  862. * always zero). The write_buf handler must ensure that
  863. * bufv->off is correctly updated (reflecting the number of
  864. * bytes read from bufv->buf[0]).
  865. *
  866. * Introduced in version 2.9
  867. *
  868. * Valid replies:
  869. * fuse_reply_write
  870. * fuse_reply_err
  871. *
  872. * @param req request handle
  873. * @param ino the inode number
  874. * @param bufv buffer containing the data
  875. * @param off offset to write to
  876. * @param fi file information
  877. */
  878. void (*write_buf) (fuse_req_t req, fuse_ino_t ino,
  879. struct fuse_bufvec *bufv, off_t off,
  880. struct fuse_file_info *fi);
  881. /**
  882. * Callback function for the retrieve request
  883. *
  884. * Introduced in version 2.9
  885. *
  886. * Valid replies:
  887. * fuse_reply_none
  888. *
  889. * @param req request handle
  890. * @param cookie user data supplied to fuse_lowlevel_notify_retrieve()
  891. * @param ino the inode number supplied to fuse_lowlevel_notify_retrieve()
  892. * @param offset the offset supplied to fuse_lowlevel_notify_retrieve()
  893. * @param bufv the buffer containing the returned data
  894. */
  895. void (*retrieve_reply) (fuse_req_t req, void *cookie, fuse_ino_t ino,
  896. off_t offset, struct fuse_bufvec *bufv);
  897. /**
  898. * Forget about multiple inodes
  899. *
  900. * See description of the forget function for more
  901. * information.
  902. *
  903. * Introduced in version 2.9
  904. *
  905. * Valid replies:
  906. * fuse_reply_none
  907. *
  908. * @param req request handle
  909. */
  910. void (*forget_multi) (fuse_req_t req, size_t count,
  911. struct fuse_forget_data *forgets);
  912. /**
  913. * Acquire, modify or release a BSD file lock
  914. *
  915. * Note: if the locking methods are not implemented, the kernel
  916. * will still allow file locking to work locally. Hence these are
  917. * only interesting for network filesystems and similar.
  918. *
  919. * Introduced in version 2.9
  920. *
  921. * Valid replies:
  922. * fuse_reply_err
  923. *
  924. * @param req request handle
  925. * @param ino the inode number
  926. * @param fi file information
  927. * @param op the locking operation, see flock(2)
  928. */
  929. void (*flock) (fuse_req_t req, fuse_ino_t ino,
  930. struct fuse_file_info *fi, int op);
  931. /**
  932. * Allocate requested space. If this function returns success then
  933. * subsequent writes to the specified range shall not fail due to the lack
  934. * of free space on the file system storage media.
  935. *
  936. * Introduced in version 2.9
  937. *
  938. * Valid replies:
  939. * fuse_reply_err
  940. *
  941. * @param req request handle
  942. * @param ino the inode number
  943. * @param offset starting point for allocated region
  944. * @param length size of allocated region
  945. * @param mode determines the operation to be performed on the given range,
  946. * see fallocate(2)
  947. */
  948. void (*fallocate) (fuse_req_t req, fuse_ino_t ino, int mode,
  949. off_t offset, off_t length, struct fuse_file_info *fi);
  950. /**
  951. * Copy a range of data from one file to another
  952. *
  953. * Performs an optimized copy between two file descriptors without
  954. * the
  955. * additional cost of transferring data through the FUSE kernel
  956. * module
  957. * to user space (glibc) and then back into the FUSE filesystem
  958. * again.
  959. *
  960. * In case this method is not implemented, glibc falls back to
  961. * reading
  962. * data from the source and writing to the destination. Effectively
  963. * doing an inefficient copy of the data.
  964. *
  965. * If this request is answered with an error code of ENOSYS, this is
  966. * treated as a permanent failure with error code EOPNOTSUPP,
  967. * i.e. all
  968. * future copy_file_range() requests will fail with EOPNOTSUPP
  969. * without
  970. * being send to the filesystem process.
  971. *
  972. * Valid replies:
  973. * fuse_reply_write
  974. * fuse_reply_err
  975. *
  976. * @param req request handle
  977. * @param ino_in the inode number of the source file
  978. * @param off_in starting point from were the data should be read
  979. * @param fi_in file information of the source file
  980. * @param ino_out the inode number of the destination file
  981. * @param off_out starting point where the data should be written
  982. * @param fi_out file information of the destination file
  983. * @param len maximum size of the data to copy
  984. * @param flags passed along with the copy_file_range() syscall
  985. */
  986. void (*copy_file_range)(fuse_req_t req,
  987. fuse_ino_t ino_in,
  988. off_t off_in,
  989. struct fuse_file_info *fi_in,
  990. fuse_ino_t ino_out,
  991. off_t off_out,
  992. struct fuse_file_info *fi_out,
  993. size_t len,
  994. int flags);
  995. };
  996. /**
  997. * Reply with an error code or success
  998. *
  999. * Possible requests:
  1000. * all except forget
  1001. *
  1002. * unlink, rmdir, rename, flush, release, fsync, fsyncdir, setxattr,
  1003. * removexattr and setlk may send a zero code
  1004. *
  1005. * @param req request handle
  1006. * @param err the positive error value, or zero for success
  1007. * @return zero for success, -errno for failure to send reply
  1008. */
  1009. int fuse_reply_err(fuse_req_t req, int err);
  1010. /**
  1011. * Don't send reply
  1012. *
  1013. * Possible requests:
  1014. * forget
  1015. *
  1016. * @param req request handle
  1017. */
  1018. void fuse_reply_none(fuse_req_t req);
  1019. /**
  1020. * Reply with a directory entry
  1021. *
  1022. * Possible requests:
  1023. * lookup, mknod, mkdir, symlink, link
  1024. *
  1025. * Side effects:
  1026. * increments the lookup count on success
  1027. *
  1028. * @param req request handle
  1029. * @param e the entry parameters
  1030. * @return zero for success, -errno for failure to send reply
  1031. */
  1032. int fuse_reply_entry(fuse_req_t req, const struct fuse_entry_param *e);
  1033. /**
  1034. * Reply with a directory entry and open parameters
  1035. *
  1036. * currently the following members of 'fi' are used:
  1037. * fh, direct_io, keep_cache
  1038. *
  1039. * Possible requests:
  1040. * create
  1041. *
  1042. * Side effects:
  1043. * increments the lookup count on success
  1044. *
  1045. * @param req request handle
  1046. * @param e the entry parameters
  1047. * @param fi file information
  1048. * @return zero for success, -errno for failure to send reply
  1049. */
  1050. int fuse_reply_create(fuse_req_t req, const struct fuse_entry_param *e,
  1051. const struct fuse_file_info *fi);
  1052. /**
  1053. * Reply with attributes
  1054. *
  1055. * Possible requests:
  1056. * getattr, setattr
  1057. *
  1058. * @param req request handle
  1059. * @param attr the attributes
  1060. * @param attr_timeout validity timeout (in seconds) for the attributes
  1061. * @return zero for success, -errno for failure to send reply
  1062. */
  1063. int fuse_reply_attr(fuse_req_t req,
  1064. const struct stat *attr,
  1065. const uint64_t timeout);
  1066. /**
  1067. * Reply with the contents of a symbolic link
  1068. *
  1069. * Possible requests:
  1070. * readlink
  1071. *
  1072. * @param req request handle
  1073. * @param link symbolic link contents
  1074. * @return zero for success, -errno for failure to send reply
  1075. */
  1076. int fuse_reply_readlink(fuse_req_t req, const char *link);
  1077. /**
  1078. * Reply with open parameters
  1079. *
  1080. * currently the following members of 'fi' are used:
  1081. * fh, direct_io, keep_cache
  1082. *
  1083. * Possible requests:
  1084. * open, opendir
  1085. *
  1086. * @param req request handle
  1087. * @param fi file information
  1088. * @return zero for success, -errno for failure to send reply
  1089. */
  1090. int fuse_reply_open(fuse_req_t req, const struct fuse_file_info *fi);
  1091. /**
  1092. * Reply with number of bytes written
  1093. *
  1094. * Possible requests:
  1095. * write
  1096. *
  1097. * @param req request handle
  1098. * @param count the number of bytes written
  1099. * @return zero for success, -errno for failure to send reply
  1100. */
  1101. int fuse_reply_write(fuse_req_t req, size_t count);
  1102. /**
  1103. * Reply with data
  1104. *
  1105. * Possible requests:
  1106. * read, readdir, getxattr, listxattr
  1107. *
  1108. * @param req request handle
  1109. * @param buf buffer containing data
  1110. * @param size the size of data in bytes
  1111. * @return zero for success, -errno for failure to send reply
  1112. */
  1113. int fuse_reply_buf(fuse_req_t req, const char *buf, size_t size);
  1114. /**
  1115. * Reply with data copied/moved from buffer(s)
  1116. *
  1117. * Possible requests:
  1118. * read, readdir, getxattr, listxattr
  1119. *
  1120. * @param req request handle
  1121. * @param bufv buffer vector
  1122. * @param flags flags controlling the copy
  1123. * @return zero for success, -errno for failure to send reply
  1124. */
  1125. int fuse_reply_data(fuse_req_t req, struct fuse_bufvec *bufv,
  1126. enum fuse_buf_copy_flags flags);
  1127. /**
  1128. * Reply with data vector
  1129. *
  1130. * Possible requests:
  1131. * read, readdir, getxattr, listxattr
  1132. *
  1133. * @param req request handle
  1134. * @param iov the vector containing the data
  1135. * @param count the size of vector
  1136. * @return zero for success, -errno for failure to send reply
  1137. */
  1138. int fuse_reply_iov(fuse_req_t req, const struct iovec *iov, int count);
  1139. /**
  1140. * Reply with filesystem statistics
  1141. *
  1142. * Possible requests:
  1143. * statfs
  1144. *
  1145. * @param req request handle
  1146. * @param stbuf filesystem statistics
  1147. * @return zero for success, -errno for failure to send reply
  1148. */
  1149. int fuse_reply_statfs(fuse_req_t req, const struct statvfs *stbuf);
  1150. /**
  1151. * Reply with needed buffer size
  1152. *
  1153. * Possible requests:
  1154. * getxattr, listxattr
  1155. *
  1156. * @param req request handle
  1157. * @param count the buffer size needed in bytes
  1158. * @return zero for success, -errno for failure to send reply
  1159. */
  1160. int fuse_reply_xattr(fuse_req_t req, size_t count);
  1161. /**
  1162. * Reply with file lock information
  1163. *
  1164. * Possible requests:
  1165. * getlk
  1166. *
  1167. * @param req request handle
  1168. * @param lock the lock information
  1169. * @return zero for success, -errno for failure to send reply
  1170. */
  1171. int fuse_reply_lock(fuse_req_t req, const struct flock *lock);
  1172. /**
  1173. * Reply with block index
  1174. *
  1175. * Possible requests:
  1176. * bmap
  1177. *
  1178. * @param req request handle
  1179. * @param idx block index within device
  1180. * @return zero for success, -errno for failure to send reply
  1181. */
  1182. int fuse_reply_bmap(fuse_req_t req, uint64_t idx);
  1183. /**
  1184. * Reply to ask for data fetch and output buffer preparation. ioctl
  1185. * will be retried with the specified input data fetched and output
  1186. * buffer prepared.
  1187. *
  1188. * Possible requests:
  1189. * ioctl
  1190. *
  1191. * @param req request handle
  1192. * @param in_iov iovec specifying data to fetch from the caller
  1193. * @param in_count number of entries in in_iov
  1194. * @param out_iov iovec specifying addresses to write output to
  1195. * @param out_count number of entries in out_iov
  1196. * @return zero for success, -errno for failure to send reply
  1197. */
  1198. int fuse_reply_ioctl_retry(fuse_req_t req,
  1199. const struct iovec *in_iov, size_t in_count,
  1200. const struct iovec *out_iov, size_t out_count);
  1201. /**
  1202. * Reply to finish ioctl
  1203. *
  1204. * Possible requests:
  1205. * ioctl
  1206. *
  1207. * @param req request handle
  1208. * @param result result to be passed to the caller
  1209. * @param buf buffer containing output data
  1210. * @param size length of output data
  1211. */
  1212. int fuse_reply_ioctl(fuse_req_t req, int result, const void *buf, uint32_t size);
  1213. /**
  1214. * Reply to finish ioctl with iov buffer
  1215. *
  1216. * Possible requests:
  1217. * ioctl
  1218. *
  1219. * @param req request handle
  1220. * @param result result to be passed to the caller
  1221. * @param iov the vector containing the data
  1222. * @param count the size of vector
  1223. */
  1224. int fuse_reply_ioctl_iov(fuse_req_t req, int result, const struct iovec *iov,
  1225. int count);
  1226. /**
  1227. * Reply with poll result event mask
  1228. *
  1229. * @param req request handle
  1230. * @param revents poll result event mask
  1231. */
  1232. int fuse_reply_poll(fuse_req_t req, unsigned revents);
  1233. /* ----------------------------------------------------------- *
  1234. * Notification *
  1235. * ----------------------------------------------------------- */
  1236. /**
  1237. * Notify IO readiness event
  1238. *
  1239. * For more information, please read comment for poll operation.
  1240. *
  1241. * @param ph poll handle to notify IO readiness event for
  1242. */
  1243. int fuse_lowlevel_notify_poll(struct fuse_pollhandle *ph);
  1244. /**
  1245. * Notify to invalidate cache for an inode
  1246. *
  1247. * @param ch the channel through which to send the invalidation
  1248. * @param ino the inode number
  1249. * @param off the offset in the inode where to start invalidating
  1250. * or negative to invalidate attributes only
  1251. * @param len the amount of cache to invalidate or 0 for all
  1252. * @return zero for success, -errno for failure
  1253. */
  1254. int fuse_lowlevel_notify_inval_inode(struct fuse_chan *ch, fuse_ino_t ino,
  1255. off_t off, off_t len);
  1256. /**
  1257. * Notify to invalidate parent attributes and the dentry matching
  1258. * parent/name
  1259. *
  1260. * To avoid a deadlock don't call this function from a filesystem operation and
  1261. * don't call it with a lock held that can also be held by a filesystem
  1262. * operation.
  1263. *
  1264. * @param ch the channel through which to send the invalidation
  1265. * @param parent inode number
  1266. * @param name file name
  1267. * @param namelen strlen() of file name
  1268. * @return zero for success, -errno for failure
  1269. */
  1270. int fuse_lowlevel_notify_inval_entry(struct fuse_chan *ch, fuse_ino_t parent,
  1271. const char *name, size_t namelen);
  1272. /**
  1273. * Notify to invalidate parent attributes and delete the dentry matching
  1274. * parent/name if the dentry's inode number matches child (otherwise it
  1275. * will invalidate the matching dentry).
  1276. *
  1277. * To avoid a deadlock don't call this function from a filesystem operation and
  1278. * don't call it with a lock held that can also be held by a filesystem
  1279. * operation.
  1280. *
  1281. * @param ch the channel through which to send the notification
  1282. * @param parent inode number
  1283. * @param child inode number
  1284. * @param name file name
  1285. * @param namelen strlen() of file name
  1286. * @return zero for success, -errno for failure
  1287. */
  1288. int fuse_lowlevel_notify_delete(struct fuse_chan *ch,
  1289. fuse_ino_t parent, fuse_ino_t child,
  1290. const char *name, size_t namelen);
  1291. /**
  1292. * Store data to the kernel buffers
  1293. *
  1294. * Synchronously store data in the kernel buffers belonging to the
  1295. * given inode. The stored data is marked up-to-date (no read will be
  1296. * performed against it, unless it's invalidated or evicted from the
  1297. * cache).
  1298. *
  1299. * If the stored data overflows the current file size, then the size
  1300. * is extended, similarly to a write(2) on the filesystem.
  1301. *
  1302. * If this function returns an error, then the store wasn't fully
  1303. * completed, but it may have been partially completed.
  1304. *
  1305. * @param ch the channel through which to send the invalidation
  1306. * @param ino the inode number
  1307. * @param offset the starting offset into the file to store to
  1308. * @param bufv buffer vector
  1309. * @param flags flags controlling the copy
  1310. * @return zero for success, -errno for failure
  1311. */
  1312. int fuse_lowlevel_notify_store(struct fuse_chan *ch, fuse_ino_t ino,
  1313. off_t offset, struct fuse_bufvec *bufv,
  1314. enum fuse_buf_copy_flags flags);
  1315. /**
  1316. * Retrieve data from the kernel buffers
  1317. *
  1318. * Retrieve data in the kernel buffers belonging to the given inode.
  1319. * If successful then the retrieve_reply() method will be called with
  1320. * the returned data.
  1321. *
  1322. * Only present pages are returned in the retrieve reply. Retrieving
  1323. * stops when it finds a non-present page and only data prior to that is
  1324. * returned.
  1325. *
  1326. * If this function returns an error, then the retrieve will not be
  1327. * completed and no reply will be sent.
  1328. *
  1329. * This function doesn't change the dirty state of pages in the kernel
  1330. * buffer. For dirty pages the write() method will be called
  1331. * regardless of having been retrieved previously.
  1332. *
  1333. * @param ch the channel through which to send the invalidation
  1334. * @param ino the inode number
  1335. * @param size the number of bytes to retrieve
  1336. * @param offset the starting offset into the file to retrieve from
  1337. * @param cookie user data to supply to the reply callback
  1338. * @return zero for success, -errno for failure
  1339. */
  1340. int fuse_lowlevel_notify_retrieve(struct fuse_chan *ch, fuse_ino_t ino,
  1341. size_t size, off_t offset, void *cookie);
  1342. /* ----------------------------------------------------------- *
  1343. * Utility functions *
  1344. * ----------------------------------------------------------- */
  1345. /**
  1346. * Get the userdata from the request
  1347. *
  1348. * @param req request handle
  1349. * @return the user data passed to fuse_lowlevel_new()
  1350. */
  1351. void *fuse_req_userdata(fuse_req_t req);
  1352. /**
  1353. * Get the context from the request
  1354. *
  1355. * The pointer returned by this function will only be valid for the
  1356. * request's lifetime
  1357. *
  1358. * @param req request handle
  1359. * @return the context structure
  1360. */
  1361. const struct fuse_ctx *fuse_req_ctx(fuse_req_t req);
  1362. /**
  1363. * Get the current supplementary group IDs for the specified request
  1364. *
  1365. * Similar to the getgroups(2) system call, except the return value is
  1366. * always the total number of group IDs, even if it is larger than the
  1367. * specified size.
  1368. *
  1369. * The current fuse kernel module in linux (as of 2.6.30) doesn't pass
  1370. * the group list to userspace, hence this function needs to parse
  1371. * "/proc/$TID/task/$TID/status" to get the group IDs.
  1372. *
  1373. * This feature may not be supported on all operating systems. In
  1374. * such a case this function will return -ENOSYS.
  1375. *
  1376. * @param req request handle
  1377. * @param size size of given array
  1378. * @param list array of group IDs to be filled in
  1379. * @return the total number of supplementary group IDs or -errno on failure
  1380. */
  1381. int fuse_req_getgroups(fuse_req_t req, int size, gid_t list[]);
  1382. /**
  1383. * Callback function for an interrupt
  1384. *
  1385. * @param req interrupted request
  1386. * @param data user data
  1387. */
  1388. typedef void (*fuse_interrupt_func_t)(fuse_req_t req, void *data);
  1389. /**
  1390. * Register/unregister callback for an interrupt
  1391. *
  1392. * If an interrupt has already happened, then the callback function is
  1393. * called from within this function, hence it's not possible for
  1394. * interrupts to be lost.
  1395. *
  1396. * @param req request handle
  1397. * @param func the callback function or NULL for unregister
  1398. * @param data user data passed to the callback function
  1399. */
  1400. void fuse_req_interrupt_func(fuse_req_t req, fuse_interrupt_func_t func,
  1401. void *data);
  1402. /**
  1403. * Check if a request has already been interrupted
  1404. *
  1405. * @param req request handle
  1406. * @return 1 if the request has been interrupted, 0 otherwise
  1407. */
  1408. int fuse_req_interrupted(fuse_req_t req);
  1409. /* ----------------------------------------------------------- *
  1410. * Filesystem setup *
  1411. * ----------------------------------------------------------- */
  1412. /* Deprecated, don't use */
  1413. int fuse_lowlevel_is_lib_option(const char *opt);
  1414. /**
  1415. * Create a low level session
  1416. *
  1417. * @param args argument vector
  1418. * @param op the low level filesystem operations
  1419. * @param op_size sizeof(struct fuse_lowlevel_ops)
  1420. * @param userdata user data
  1421. * @return the created session object, or NULL on failure
  1422. */
  1423. struct fuse_session *fuse_lowlevel_new(struct fuse_args *args,
  1424. const struct fuse_lowlevel_ops *op,
  1425. size_t op_size, void *userdata);
  1426. /* ----------------------------------------------------------- *
  1427. * Session interface *
  1428. * ----------------------------------------------------------- */
  1429. /**
  1430. * Session operations
  1431. *
  1432. * This is used in session creation
  1433. */
  1434. struct fuse_session_ops {
  1435. /**
  1436. * Hook to process a request (mandatory)
  1437. *
  1438. * @param data user data passed to fuse_session_new()
  1439. * @param buf buffer containing the raw request
  1440. * @param len request length
  1441. * @param ch channel on which the request was received
  1442. */
  1443. void (*process) (void *data, const char *buf, size_t len,
  1444. struct fuse_chan *ch);
  1445. /**
  1446. * Hook for session exit and reset (optional)
  1447. *
  1448. * @param data user data passed to fuse_session_new()
  1449. * @param val exited status (1 - exited, 0 - not exited)
  1450. */
  1451. void (*exit) (void *data, int val);
  1452. /**
  1453. * Hook for querying the current exited status (optional)
  1454. *
  1455. * @param data user data passed to fuse_session_new()
  1456. * @return 1 if exited, 0 if not exited
  1457. */
  1458. int (*exited) (void *data);
  1459. /**
  1460. * Hook for cleaning up the channel on destroy (optional)
  1461. *
  1462. * @param data user data passed to fuse_session_new()
  1463. */
  1464. void (*destroy) (void *data);
  1465. };
  1466. /**
  1467. * Create a new session
  1468. *
  1469. * @param op session operations
  1470. * @param data user data
  1471. * @return new session object, or NULL on failure
  1472. */
  1473. struct fuse_session *fuse_session_new(struct fuse_session_ops *op, void *data);
  1474. /**
  1475. * Assign a channel to a session
  1476. *
  1477. * Note: currently only a single channel may be assigned. This may
  1478. * change in the future
  1479. *
  1480. * If a session is destroyed, the assigned channel is also destroyed
  1481. *
  1482. * @param se the session
  1483. * @param ch the channel
  1484. */
  1485. void fuse_session_add_chan(struct fuse_session *se, struct fuse_chan *ch);
  1486. /**
  1487. * Remove a channel from a session
  1488. *
  1489. * If the channel is not assigned to a session, then this is a no-op
  1490. *
  1491. * @param ch the channel to remove
  1492. */
  1493. void fuse_session_remove_chan(struct fuse_chan *ch);
  1494. /**
  1495. * Iterate over the channels assigned to a session
  1496. *
  1497. * The iterating function needs to start with a NULL channel, and
  1498. * after that needs to pass the previously returned channel to the
  1499. * function.
  1500. *
  1501. * @param se the session
  1502. * @param ch the previous channel, or NULL
  1503. * @return the next channel, or NULL if no more channels exist
  1504. */
  1505. struct fuse_chan *fuse_session_next_chan(struct fuse_session *se,
  1506. struct fuse_chan *ch);
  1507. /**
  1508. * Process a raw request
  1509. *
  1510. * @param se the session
  1511. * @param buf buffer containing the raw request
  1512. * @param len request length
  1513. * @param ch channel on which the request was received
  1514. */
  1515. void fuse_session_process(struct fuse_session *se, const char *buf, size_t len,
  1516. struct fuse_chan *ch);
  1517. /**
  1518. * Process a raw request supplied in a generic buffer
  1519. *
  1520. * This is a more generic version of fuse_session_process(). The
  1521. * fuse_buf may contain a memory buffer or a pipe file descriptor.
  1522. *
  1523. * @param se the session
  1524. * @param buf the fuse_buf containing the request
  1525. * @param ch channel on which the request was received
  1526. */
  1527. void fuse_session_process_buf(struct fuse_session *se,
  1528. const struct fuse_buf *buf, struct fuse_chan *ch);
  1529. /**
  1530. * Receive a raw request supplied in a generic buffer
  1531. *
  1532. * This is a more generic version of fuse_chan_recv(). The fuse_buf
  1533. * supplied to this function contains a suitably allocated memory
  1534. * buffer. This may be overwritten with a file descriptor buffer.
  1535. *
  1536. * @param se the session
  1537. * @param buf the fuse_buf to store the request in
  1538. * @param chp pointer to the channel
  1539. * @return the actual size of the raw request, or -errno on error
  1540. */
  1541. int fuse_session_receive_buf(struct fuse_session *se, struct fuse_buf *buf,
  1542. struct fuse_chan **chp);
  1543. /**
  1544. * Destroy a session
  1545. *
  1546. * @param se the session
  1547. */
  1548. void fuse_session_destroy(struct fuse_session *se);
  1549. /**
  1550. * Exit a session
  1551. *
  1552. * @param se the session
  1553. */
  1554. void fuse_session_exit(struct fuse_session *se);
  1555. /**
  1556. * Reset the exited status of a session
  1557. *
  1558. * @param se the session
  1559. */
  1560. void fuse_session_reset(struct fuse_session *se);
  1561. /**
  1562. * Query the exited status of a session
  1563. *
  1564. * @param se the session
  1565. * @return 1 if exited, 0 if not exited
  1566. */
  1567. int fuse_session_exited(struct fuse_session *se);
  1568. /**
  1569. * Get the user data provided to the session
  1570. *
  1571. * @param se the session
  1572. * @return the user data
  1573. */
  1574. void *fuse_session_data(struct fuse_session *se);
  1575. /**
  1576. * Enter a single threaded event loop
  1577. *
  1578. * @param se the session
  1579. * @return 0 on success, -1 on error
  1580. */
  1581. int fuse_session_loop(struct fuse_session *se);
  1582. /**
  1583. * Enter a multi-threaded event loop
  1584. *
  1585. * @param se the session
  1586. * @return 0 on success, -1 on error
  1587. */
  1588. int fuse_session_loop_mt(struct fuse_session *se, const int threads);
  1589. /* ----------------------------------------------------------- *
  1590. * Channel interface *
  1591. * ----------------------------------------------------------- */
  1592. /**
  1593. * Channel operations
  1594. *
  1595. * This is used in channel creation
  1596. */
  1597. struct fuse_chan_ops {
  1598. /**
  1599. * Hook for receiving a raw request
  1600. *
  1601. * @param ch pointer to the channel
  1602. * @param buf the buffer to store the request in
  1603. * @param size the size of the buffer
  1604. * @return the actual size of the raw request, or -1 on error
  1605. */
  1606. int (*receive)(struct fuse_chan **chp, char *buf, size_t size);
  1607. /**
  1608. * Hook for sending a raw reply
  1609. *
  1610. * A return value of -ENOENT means, that the request was
  1611. * interrupted, and the reply was discarded
  1612. *
  1613. * @param ch the channel
  1614. * @param iov vector of blocks
  1615. * @param count the number of blocks in vector
  1616. * @return zero on success, -errno on failure
  1617. */
  1618. int (*send)(struct fuse_chan *ch, const struct iovec iov[],
  1619. size_t count);
  1620. /**
  1621. * Destroy the channel
  1622. *
  1623. * @param ch the channel
  1624. */
  1625. void (*destroy)(struct fuse_chan *ch);
  1626. };
  1627. /**
  1628. * Create a new channel
  1629. *
  1630. * @param op channel operations
  1631. * @param fd file descriptor of the channel
  1632. * @param bufsize the minimal receive buffer size
  1633. * @param data user data
  1634. * @return the new channel object, or NULL on failure
  1635. */
  1636. struct fuse_chan *fuse_chan_new(struct fuse_chan_ops *op, int fd,
  1637. size_t bufsize, void *data);
  1638. /**
  1639. * Query the file descriptor of the channel
  1640. *
  1641. * @param ch the channel
  1642. * @return the file descriptor passed to fuse_chan_new()
  1643. */
  1644. int fuse_chan_fd(struct fuse_chan *ch);
  1645. /**
  1646. * Query the minimal receive buffer size
  1647. *
  1648. * @param ch the channel
  1649. * @return the buffer size passed to fuse_chan_new()
  1650. */
  1651. size_t fuse_chan_bufsize(struct fuse_chan *ch);
  1652. /**
  1653. * Query the user data
  1654. *
  1655. * @param ch the channel
  1656. * @return the user data passed to fuse_chan_new()
  1657. */
  1658. void *fuse_chan_data(struct fuse_chan *ch);
  1659. /**
  1660. * Query the session to which this channel is assigned
  1661. *
  1662. * @param ch the channel
  1663. * @return the session, or NULL if the channel is not assigned
  1664. */
  1665. struct fuse_session *fuse_chan_session(struct fuse_chan *ch);
  1666. /**
  1667. * Receive a raw request
  1668. *
  1669. * A return value of -ENODEV means, that the filesystem was unmounted
  1670. *
  1671. * @param ch pointer to the channel
  1672. * @param buf the buffer to store the request in
  1673. * @param size the size of the buffer
  1674. * @return the actual size of the raw request, or -errno on error
  1675. */
  1676. int fuse_chan_recv(struct fuse_chan **ch, char *buf, size_t size);
  1677. /**
  1678. * Send a raw reply
  1679. *
  1680. * A return value of -ENOENT means, that the request was
  1681. * interrupted, and the reply was discarded
  1682. *
  1683. * @param ch the channel
  1684. * @param iov vector of blocks
  1685. * @param count the number of blocks in vector
  1686. * @return zero on success, -errno on failure
  1687. */
  1688. int fuse_chan_send(struct fuse_chan *ch, const struct iovec iov[],
  1689. size_t count);
  1690. /**
  1691. * Destroy a channel
  1692. *
  1693. * @param ch the channel
  1694. */
  1695. void fuse_chan_destroy(struct fuse_chan *ch);
  1696. /* ----------------------------------------------------------- *
  1697. * Compatibility stuff *
  1698. * ----------------------------------------------------------- */
  1699. #if FUSE_USE_VERSION < 26
  1700. # include "fuse_lowlevel_compat.h"
  1701. # define fuse_chan_ops fuse_chan_ops_compat24
  1702. # define fuse_chan_new fuse_chan_new_compat24
  1703. # if FUSE_USE_VERSION == 25
  1704. # define fuse_lowlevel_ops fuse_lowlevel_ops_compat25
  1705. # define fuse_lowlevel_new fuse_lowlevel_new_compat25
  1706. # elif FUSE_USE_VERSION == 24
  1707. # define fuse_lowlevel_ops fuse_lowlevel_ops_compat
  1708. # define fuse_lowlevel_new fuse_lowlevel_new_compat
  1709. # define fuse_file_info fuse_file_info_compat
  1710. # define fuse_reply_statfs fuse_reply_statfs_compat
  1711. # define fuse_reply_open fuse_reply_open_compat
  1712. # else
  1713. # error Compatibility with low-level API version < 24 not supported
  1714. # endif
  1715. #endif
  1716. #ifdef __cplusplus
  1717. }
  1718. #endif
  1719. #endif /* _FUSE_LOWLEVEL_H_ */