From 259f08007a0a3a144e545623479bf2c05c0adb43 Mon Sep 17 00:00:00 2001
From: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Date: Sat, 28 Sep 2019 15:17:55 +0200
Subject: Move declarations for sqfs_xattr_reader_t to a seperate header

Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
---
 include/sqfs/xattr.h        | 165 +-----------------------------------
 include/sqfs/xattr_reader.h | 201 ++++++++++++++++++++++++++++++++++++++++++++
 lib/sqfs/Makemodule.am      |   3 +-
 lib/sqfs/xattr_reader.c     |   1 +
 tar/sqfs2tar.c              |   1 +
 unpack/rdsquashfs.h         |   1 +
 6 files changed, 207 insertions(+), 165 deletions(-)
 create mode 100644 include/sqfs/xattr_reader.h

diff --git a/include/sqfs/xattr.h b/include/sqfs/xattr.h
index e4a3efa..654fe9c 100644
--- a/include/sqfs/xattr.h
+++ b/include/sqfs/xattr.h
@@ -25,8 +25,7 @@
 /**
  * @file xattr.h
  *
- * @brief Contains on-disk data structures for storing extended attributes and
- *        declarations for the @ref sqfs_xattr_reader_t.
+ * @brief Contains on-disk data structures for storing extended attributes.
  */
 
 /**
@@ -149,39 +148,6 @@ struct sqfs_xattr_id_table_t {
 	sqfs_u64 locations[];
 };
 
-/**
- * @struct sqfs_xattr_reader_t
- *
- * @brief Abstracts read access to extended attributes in a SquashFS filesystem
- *
- * SquashFS stores extended attributes using multiple levels of indirection.
- * First of all, the key-value pairs of each inode (that has extended
- * attributes) are deduplicated and stored consecutively in meta data blocks.
- * Furthermore, a value can be stored out-of-band, i.e. it holds a reference to
- * another location from which the value has to be read.
- *
- * For each unique set of key-value pairs, a descriptor object is generated
- * that holds the location of the first pair, the number of pairs and the total
- * size used on disk. The array of descriptor objects is stored in multiple
- * meta data blocks. Each inode that has extended attributes holds a 32 bit
- * index into the descriptor array.
- *
- * The third layer of indirection is yet another table that points to the
- * locations of the previous two tables. Its location is in turn stored in
- * the super block.
- *
- * The sqfs_xattr_reader_t data structure takes care of the low level details
- * of loading and parsing the data.
- *
- * After creating an instance using @ref sqfs_xattr_reader_create, simply call
- * @ref sqfs_xattr_reader_load_locations to load and parse all of the location
- * tables. Then use @ref sqfs_xattr_reader_get_desc to resolve a 32 bit index
- * from an inode to a descriptor structure. Use @ref sqfs_xattr_reader_seek_kv
- * to point the reader to the start of the key-value pairs and the call
- * @ref sqfs_xattr_reader_read_key and @ref sqfs_xattr_reader_read_value
- * consecutively to read and decode each key-value pair.
- */
-
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -233,135 +199,6 @@ SQFS_API int sqfs_get_xattr_prefix_id(const char *key);
  */
 SQFS_API bool sqfs_has_xattr(const char *key);
 
-/**
- * @brief Load the locations of the xattr meta data blocks into memory
- *
- * @memberof sqfs_xattr_reader_t
- *
- * This function must be called explicitly after an xattr reader has been
- * created to load the actual location table from disk.
- *
- * @return Zero on success, a negative @ref E_SQFS_ERROR value on failure.
- */
-SQFS_API int sqfs_xattr_reader_load_locations(sqfs_xattr_reader_t *xr);
-
-/**
- * @brief Destroy an xattr reader and free all memory used by it
- *
- * @memberof sqfs_xattr_reader_t
- *
- * @param xr A pointer to an xattr reader instance
- */
-SQFS_API void sqfs_xattr_reader_destroy(sqfs_xattr_reader_t *xr);
-
-/**
- * @brief Create an xattr reader
- *
- * @memberof sqfs_xattr_reader_t
- *
- * This function creates an object that abstracts away read only access to
- * the extended attributes in a SquashFS filesystem.
- *
- * After creating a reader and before using it, call
- * @ref sqfs_xattr_reader_load_locations to load and parse the location
- * information required to look up xattr key-value pairs.
- *
- * All pointers passed to this function are stored internally for later use.
- * Do not destroy any of the pointed to objects before destroying the xattr
- * reader.
- *
- * @param file A pointer to a file object that contains the SquashFS filesystem
- * @param super A pointer to the SquashFS super block required to find the
- *              location tables.
- * @param cmp A pointer to a compressor used to uncompress the loaded meta data
- *            blocks.
- *
- * @return A pointer to a new xattr reader instance on success, NULL on
- *         allocation failure.
- */
-SQFS_API sqfs_xattr_reader_t *sqfs_xattr_reader_create(sqfs_file_t *file,
-						       sqfs_super_t *super,
-						       sqfs_compressor_t *cmp);
-
-/**
- * @brief Resolve an xattr index from an inode to an xattr description
- *
- * @memberof sqfs_xattr_reader_t
- *
- * This function takes an xattr index from an extended inode type and resolves
- * it to a descriptor that points to location of the key-value pairs and
- * indicates how many key-value pairs to read from there.
- *
- * @param xr A pointer to an xattr reader instance
- * @param idx The xattr index to resolve
- * @param desc Used to return the description
- *
- * @return Zero on success, a negative @ref E_SQFS_ERROR value on failure.
- */
-SQFS_API int sqfs_xattr_reader_get_desc(sqfs_xattr_reader_t *xr, sqfs_u32 idx,
-					sqfs_xattr_id_t *desc);
-
-/**
- * @brief Resolve an xattr index from an inode to an xattr description
- *
- * @memberof sqfs_xattr_reader_t
- *
- * This function takes an xattr descriptor object and seeks to the meta data
- * block containing the key-value pairs. The individual pairs can then be read
- * using consecutive calls to @ref sqfs_xattr_reader_read_key and
- * @ref sqfs_xattr_reader_read_value.
- *
- * @param xr A pointer to an xattr reader instance
- * @param desc The descriptor holding the location of the key-value pairs
- *
- * @return Zero on success, a negative @ref E_SQFS_ERROR value on failure.
- */
-SQFS_API int sqfs_xattr_reader_seek_kv(sqfs_xattr_reader_t *xr,
-				       const sqfs_xattr_id_t *desc);
-
-/**
- * @brief Read the next xattr key
- *
- * @memberof sqfs_xattr_reader_t
- *
- * After setting the start position using @ref sqfs_xattr_reader_seek_kv, this
- * function reads and decodes an xattr key and advances the internal position
- * indicator to the location after the key. The value can then be read using
- * using @ref sqfs_xattr_reader_read_value. After reading the value, the next
- * key can be read by calling this function again.
- *
- * @param xr A pointer to an xattr reader instance
- * @param key_out Used to return the decoded key. The underlying memory can be
- *                released using a single free() call.
- *
- * @return Zero on success, a negative @ref E_SQFS_ERROR value on failure.
- */
-SQFS_API
-int sqfs_xattr_reader_read_key(sqfs_xattr_reader_t *xr,
-			       sqfs_xattr_entry_t **key_out);
-
-/**
- * @brief Read the xattr value belonging to the last read key
- *
- * @memberof sqfs_xattr_reader_t
- *
- * After calling @ref sqfs_xattr_reader_read_key, this function can read and
- * decode the asociated value. The internal location indicator is then advanced
- * past the key to the next value, so @ref sqfs_xattr_reader_read_key can be
- * called again to read the next key.
- *
- * @param xr A pointer to an xattr reader instance.
- * @param key A pointer to the decoded key object.
- * @param val_out Used to return the decoded value. The underlying memory can
- *                be released using a single free() call.
- *
- * @return Zero on success, a negative @ref E_SQFS_ERROR value on failure.
- */
-SQFS_API
-int sqfs_xattr_reader_read_value(sqfs_xattr_reader_t *xr,
-				 const sqfs_xattr_entry_t *key,
-				 sqfs_xattr_value_t **val_out);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/include/sqfs/xattr_reader.h b/include/sqfs/xattr_reader.h
new file mode 100644
index 0000000..6544a21
--- /dev/null
+++ b/include/sqfs/xattr_reader.h
@@ -0,0 +1,201 @@
+/* SPDX-License-Identifier: LGPL-3.0-or-later */
+/*
+ * xattr_reader.h - This file is part of libsquashfs
+ *
+ * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+#ifndef SQFS_XATTR_READER_H
+#define SQFS_XATTR_READER_H
+
+#include "sqfs/predef.h"
+
+/**
+ * @file xattr_reader.h
+ *
+ * @brief Contains declarations for the @ref sqfs_xattr_reader_t.
+ */
+
+/**
+ * @struct sqfs_xattr_reader_t
+ *
+ * @brief Abstracts read access to extended attributes in a SquashFS filesystem
+ *
+ * SquashFS stores extended attributes using multiple levels of indirection.
+ * First of all, the key-value pairs of each inode (that has extended
+ * attributes) are deduplicated and stored consecutively in meta data blocks.
+ * Furthermore, a value can be stored out-of-band, i.e. it holds a reference to
+ * another location from which the value has to be read.
+ *
+ * For each unique set of key-value pairs, a descriptor object is generated
+ * that holds the location of the first pair, the number of pairs and the total
+ * size used on disk. The array of descriptor objects is stored in multiple
+ * meta data blocks. Each inode that has extended attributes holds a 32 bit
+ * index into the descriptor array.
+ *
+ * The third layer of indirection is yet another table that points to the
+ * locations of the previous two tables. Its location is in turn stored in
+ * the super block.
+ *
+ * The sqfs_xattr_reader_t data structure takes care of the low level details
+ * of loading and parsing the data.
+ *
+ * After creating an instance using @ref sqfs_xattr_reader_create, simply call
+ * @ref sqfs_xattr_reader_load_locations to load and parse all of the location
+ * tables. Then use @ref sqfs_xattr_reader_get_desc to resolve a 32 bit index
+ * from an inode to a descriptor structure. Use @ref sqfs_xattr_reader_seek_kv
+ * to point the reader to the start of the key-value pairs and the call
+ * @ref sqfs_xattr_reader_read_key and @ref sqfs_xattr_reader_read_value
+ * consecutively to read and decode each key-value pair.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief Create an xattr reader
+ *
+ * @memberof sqfs_xattr_reader_t
+ *
+ * This function creates an object that abstracts away read only access to
+ * the extended attributes in a SquashFS filesystem.
+ *
+ * After creating a reader and before using it, call
+ * @ref sqfs_xattr_reader_load_locations to load and parse the location
+ * information required to look up xattr key-value pairs.
+ *
+ * All pointers passed to this function are stored internally for later use.
+ * Do not destroy any of the pointed to objects before destroying the xattr
+ * reader.
+ *
+ * @param file A pointer to a file object that contains the SquashFS filesystem
+ * @param super A pointer to the SquashFS super block required to find the
+ *              location tables.
+ * @param cmp A pointer to a compressor used to uncompress the loaded meta data
+ *            blocks.
+ *
+ * @return A pointer to a new xattr reader instance on success, NULL on
+ *         allocation failure.
+ */
+SQFS_API sqfs_xattr_reader_t *sqfs_xattr_reader_create(sqfs_file_t *file,
+						       sqfs_super_t *super,
+						       sqfs_compressor_t *cmp);
+
+/**
+ * @brief Destroy an xattr reader and free all memory used by it
+ *
+ * @memberof sqfs_xattr_reader_t
+ *
+ * @param xr A pointer to an xattr reader instance
+ */
+SQFS_API void sqfs_xattr_reader_destroy(sqfs_xattr_reader_t *xr);
+
+/**
+ * @brief Load the locations of the xattr meta data blocks into memory
+ *
+ * @memberof sqfs_xattr_reader_t
+ *
+ * This function must be called explicitly after an xattr reader has been
+ * created to load the actual location table from disk.
+ *
+ * @return Zero on success, a negative @ref E_SQFS_ERROR value on failure.
+ */
+SQFS_API int sqfs_xattr_reader_load_locations(sqfs_xattr_reader_t *xr);
+
+/**
+ * @brief Resolve an xattr index from an inode to an xattr description
+ *
+ * @memberof sqfs_xattr_reader_t
+ *
+ * This function takes an xattr index from an extended inode type and resolves
+ * it to a descriptor that points to location of the key-value pairs and
+ * indicates how many key-value pairs to read from there.
+ *
+ * @param xr A pointer to an xattr reader instance
+ * @param idx The xattr index to resolve
+ * @param desc Used to return the description
+ *
+ * @return Zero on success, a negative @ref E_SQFS_ERROR value on failure.
+ */
+SQFS_API int sqfs_xattr_reader_get_desc(sqfs_xattr_reader_t *xr, sqfs_u32 idx,
+					sqfs_xattr_id_t *desc);
+
+/**
+ * @brief Resolve an xattr index from an inode to an xattr description
+ *
+ * @memberof sqfs_xattr_reader_t
+ *
+ * This function takes an xattr descriptor object and seeks to the meta data
+ * block containing the key-value pairs. The individual pairs can then be read
+ * using consecutive calls to @ref sqfs_xattr_reader_read_key and
+ * @ref sqfs_xattr_reader_read_value.
+ *
+ * @param xr A pointer to an xattr reader instance
+ * @param desc The descriptor holding the location of the key-value pairs
+ *
+ * @return Zero on success, a negative @ref E_SQFS_ERROR value on failure.
+ */
+SQFS_API int sqfs_xattr_reader_seek_kv(sqfs_xattr_reader_t *xr,
+				       const sqfs_xattr_id_t *desc);
+
+/**
+ * @brief Read the next xattr key
+ *
+ * @memberof sqfs_xattr_reader_t
+ *
+ * After setting the start position using @ref sqfs_xattr_reader_seek_kv, this
+ * function reads and decodes an xattr key and advances the internal position
+ * indicator to the location after the key. The value can then be read using
+ * using @ref sqfs_xattr_reader_read_value. After reading the value, the next
+ * key can be read by calling this function again.
+ *
+ * @param xr A pointer to an xattr reader instance
+ * @param key_out Used to return the decoded key. The underlying memory can be
+ *                released using a single free() call.
+ *
+ * @return Zero on success, a negative @ref E_SQFS_ERROR value on failure.
+ */
+SQFS_API
+int sqfs_xattr_reader_read_key(sqfs_xattr_reader_t *xr,
+			       sqfs_xattr_entry_t **key_out);
+
+/**
+ * @brief Read the xattr value belonging to the last read key
+ *
+ * @memberof sqfs_xattr_reader_t
+ *
+ * After calling @ref sqfs_xattr_reader_read_key, this function can read and
+ * decode the asociated value. The internal location indicator is then advanced
+ * past the key to the next value, so @ref sqfs_xattr_reader_read_key can be
+ * called again to read the next key.
+ *
+ * @param xr A pointer to an xattr reader instance.
+ * @param key A pointer to the decoded key object.
+ * @param val_out Used to return the decoded value. The underlying memory can
+ *                be released using a single free() call.
+ *
+ * @return Zero on success, a negative @ref E_SQFS_ERROR value on failure.
+ */
+SQFS_API
+int sqfs_xattr_reader_read_value(sqfs_xattr_reader_t *xr,
+				 const sqfs_xattr_entry_t *key,
+				 sqfs_xattr_value_t **val_out);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SQFS_XATTR_READER_H */
diff --git a/lib/sqfs/Makemodule.am b/lib/sqfs/Makemodule.am
index 920172c..419d98c 100644
--- a/lib/sqfs/Makemodule.am
+++ b/lib/sqfs/Makemodule.am
@@ -6,7 +6,8 @@ LIBSQFS_HEARDS = include/sqfs/meta_writer.h \
 		include/sqfs/table.h include/sqfs/predef.h \
 		include/sqfs/error.h include/sqfs/dir_reader.h \
 		include/sqfs/dir_writer.h include/sqfs/io.h \
-		include/sqfs/data_reader.h include/sqfs/block.h
+		include/sqfs/data_reader.h include/sqfs/block.h \
+		include/sqfs/xattr_reader.h
 
 libsquashfs_la_SOURCES = $(LIBSQFS_HEARDS) lib/sqfs/id_table.c lib/sqfs/super.c
 libsquashfs_la_SOURCES += lib/sqfs/readdir.c lib/sqfs/io_file.c lib/sqfs/xattr.c
diff --git a/lib/sqfs/xattr_reader.c b/lib/sqfs/xattr_reader.c
index fb9c36a..d5b003b 100644
--- a/lib/sqfs/xattr_reader.c
+++ b/lib/sqfs/xattr_reader.c
@@ -7,6 +7,7 @@
 #define SQFS_BUILDING_DLL
 #include "config.h"
 
+#include "sqfs/xattr_reader.h"
 #include "sqfs/meta_reader.h"
 #include "sqfs/super.h"
 #include "sqfs/xattr.h"
diff --git a/tar/sqfs2tar.c b/tar/sqfs2tar.c
index 9001c5a..af9e9ca 100644
--- a/tar/sqfs2tar.c
+++ b/tar/sqfs2tar.c
@@ -9,6 +9,7 @@
 #include "sqfs/meta_reader.h"
 #include "sqfs/compress.h"
 #include "sqfs/data_reader.h"
+#include "sqfs/xattr_reader.h"
 #include "highlevel.h"
 #include "util.h"
 #include "tar.h"
diff --git a/unpack/rdsquashfs.h b/unpack/rdsquashfs.h
index 26c5d08..182baa5 100644
--- a/unpack/rdsquashfs.h
+++ b/unpack/rdsquashfs.h
@@ -9,6 +9,7 @@
 
 #include "config.h"
 
+#include "sqfs/xattr_reader.h"
 #include "sqfs/meta_reader.h"
 #include "sqfs/data_reader.h"
 #include "sqfs/compress.h"
-- 
cgit v1.2.3