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.

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