aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/sqfs/dir_writer.h66
1 files changed, 64 insertions, 2 deletions
diff --git a/include/sqfs/dir_writer.h b/include/sqfs/dir_writer.h
index 81a651c..c390050 100644
--- a/include/sqfs/dir_writer.h
+++ b/include/sqfs/dir_writer.h
@@ -58,6 +58,30 @@
* writer used for inodes.
*/
+/**
+ * @enum SQFS_DIR_WRITER_CREATE_FLAGS
+ *
+ * @brief Flags that can be set for @ref sqfs_dir_writer_create
+ */
+typedef enum {
+ /**
+ * @brief Record all inode locations to create an export table.
+ *
+ * For NFS export support, SquashFS needs an extra table that maps
+ * inode numbers directly to on-disk locations.
+ *
+ * Since the @ref sqfs_dir_writer_t "sees" all inode numbers and
+ * coresponding locations and easily create such a table.
+ *
+ * If this flag is set for @ref sqfs_dir_writer_create, the result
+ * directory wrter collects such a table which it can then write to
+ * disk using @ref sqfs_dir_writer_write_export_table.
+ */
+ SQFS_DIR_WRITER_CREATE_EXPORT_TABLE = 0x01,
+
+ SQFS_DIR_WRITER_CREATE_ALL_FLAGS = 0x01
+} SQFS_DIR_WRITER_CREATE_FLAGS;
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -69,11 +93,13 @@ extern "C" {
*
* @param dm A pointer to a meta data writer that the generated directory
* entries should be written to.
+ * @param flags A combination of @ref SQFS_DIR_WRITER_CREATE_FLAGS.
*
* @return A pointer to a directory writer on success, NULL on
- * allocation failure.
+ * allocation failure or if flags has unknown flags set.
*/
-SQFS_API sqfs_dir_writer_t *sqfs_dir_writer_create(sqfs_meta_writer_t *dm);
+SQFS_API sqfs_dir_writer_t *sqfs_dir_writer_create(sqfs_meta_writer_t *dm,
+ sqfs_u32 flags);
/**
* @brief Destroy a directory writer and free all its memory.
@@ -217,6 +243,42 @@ SQFS_API sqfs_inode_generic_t
*sqfs_dir_writer_create_inode(const sqfs_dir_writer_t *writer, size_t hlinks,
sqfs_u32 xattr, sqfs_u32 parent_ino);
+/**
+ * @brief Write an export table to a SquashFS image.
+ *
+ * @memberof sqfs_dir_writer_t
+ *
+ * If the @ref sqfs_dir_writer_t was created with the
+ * @ref SQFS_DIR_WRITER_CREATE_EXPORT_TABLE flag set, it has an internal table
+ * that maps all inode numbers to inode references. After writing the fragment
+ * table, this function can be used to write this inode mapping table for NFS
+ * export support.
+ *
+ * It is safe to call this function if the writer has been created without the
+ * flag. In this case, it is simply a noop.
+ *
+ * In theory, the writer "sees" the entire directory tree and for each entry,
+ * the inode number and on-disk location, so it can build this table. The only
+ * inode it never sees is the root inode, so that information has to be passed
+ * to this function to add it to the table just before writing it to disk.
+ *
+ * @param writer A pointer to a directory writer object.
+ * @param file The ouput file to write the table to.
+ * @param cmp The compressor to use to compress the table.
+ * @param root_inode_num The inode number of the root inode.
+ * @param root_inode_ref An inode reference for the root inode.
+ * @param super A pointer to the super block. Location of the export table and
+ * the exportable flag are set.
+ *
+ * @return Zero on success, a @ref E_SQFS_ERROR value on failure.
+ */
+SQFS_API int sqfs_dir_writer_write_export_table(sqfs_dir_writer_t *writer,
+ sqfs_file_t *file,
+ sqfs_compressor_t *cmp,
+ sqfs_u32 root_inode_num,
+ sqfs_u64 root_inode_ref,
+ sqfs_super_t *super);
+
#ifdef __cplusplus
}
#endif