diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/sqfs/block_processor.h | 14 | ||||
| -rw-r--r-- | include/sqfs/compress.h | 13 | ||||
| -rw-r--r-- | include/sqfs/dir.h | 32 | ||||
| -rw-r--r-- | include/sqfs/id_table.h | 22 | ||||
| -rw-r--r-- | include/sqfs/inode.h | 6 | ||||
| -rw-r--r-- | include/sqfs/meta_reader.h | 22 | ||||
| -rw-r--r-- | include/sqfs/meta_writer.h | 24 | ||||
| -rw-r--r-- | include/sqfs/predef.h | 36 | ||||
| -rw-r--r-- | include/sqfs/super.h | 11 | ||||
| -rw-r--r-- | include/sqfs/table.h | 15 | ||||
| -rw-r--r-- | include/sqfs/xattr.h | 24 | ||||
| -rw-r--r-- | include/str_table.h | 14 | ||||
| -rw-r--r-- | include/util.h | 13 | 
13 files changed, 163 insertions, 83 deletions
| diff --git a/include/sqfs/block_processor.h b/include/sqfs/block_processor.h index bde0a2e..97bfd34 100644 --- a/include/sqfs/block_processor.h +++ b/include/sqfs/block_processor.h @@ -8,6 +8,7 @@  #define SFQS_BLOCK_PROCESSOR_H  #include "config.h" +#include "sqfs/predef.h"  #include "sqfs/compress.h"  enum { @@ -67,13 +68,14 @@ typedef int (*sqfs_block_cb)(void *user, sqfs_block_t *blk);  extern "C" {  #endif +SQFS_API  sqfs_block_processor_t *sqfs_block_processor_create(size_t max_block_size,  						    sqfs_compressor_t *cmp,  						    unsigned int num_workers,  						    void *user,  						    sqfs_block_cb callback); -void sqfs_block_processor_destroy(sqfs_block_processor_t *proc); +SQFS_API void sqfs_block_processor_destroy(sqfs_block_processor_t *proc);  /*    Add a block to be processed. Returns non-zero on error and prints a message @@ -85,22 +87,22 @@ void sqfs_block_processor_destroy(sqfs_block_processor_t *proc);    Even on failure, the workers may still be running and    sqfs_block_processor_finish must be called before cleaning up.  */ -int sqfs_block_processor_enqueue(sqfs_block_processor_t *proc, -				 sqfs_block_t *block); +SQFS_API int sqfs_block_processor_enqueue(sqfs_block_processor_t *proc, +					  sqfs_block_t *block);  /*    Wait for the compressor workers to finish. Returns zero on success, non-zero    if an internal error occoured or one of the block callbacks returned a    non-zero value.   */ -int sqfs_block_processor_finish(sqfs_block_processor_t *proc); +SQFS_API int sqfs_block_processor_finish(sqfs_block_processor_t *proc);  /*    Convenience function to process a data block. Returns 0 on success,    prints to stderr on failure.   */ -int sqfs_block_process(sqfs_block_t *block, sqfs_compressor_t *cmp, -		       uint8_t *scratch, size_t scratch_size); +SQFS_API int sqfs_block_process(sqfs_block_t *block, sqfs_compressor_t *cmp, +				uint8_t *scratch, size_t scratch_size);  #ifdef __cplusplus  } diff --git a/include/sqfs/compress.h b/include/sqfs/compress.h index c826c84..27c603d 100644 --- a/include/sqfs/compress.h +++ b/include/sqfs/compress.h @@ -14,6 +14,7 @@  #include <stddef.h>  #include <stdint.h> +#include "sqfs/predef.h"  #include "sqfs/super.h"  typedef struct sqfs_compressor_t sqfs_compressor_t; @@ -132,16 +133,18 @@ typedef enum {  extern "C" {  #endif -int sqfs_compressor_config_init(sqfs_compressor_config_t *cfg, -				E_SQFS_COMPRESSOR id, -				size_t block_size, uint16_t flags); +SQFS_API int sqfs_compressor_config_init(sqfs_compressor_config_t *cfg, +					 E_SQFS_COMPRESSOR id, +					 size_t block_size, uint16_t flags); -bool sqfs_compressor_exists(E_SQFS_COMPRESSOR id); +SQFS_API bool sqfs_compressor_exists(E_SQFS_COMPRESSOR id); +SQFS_API  sqfs_compressor_t *sqfs_compressor_create(const sqfs_compressor_config_t *cfg); -const char *sqfs_compressor_name_from_id(E_SQFS_COMPRESSOR id); +SQFS_API const char *sqfs_compressor_name_from_id(E_SQFS_COMPRESSOR id); +SQFS_API  int sqfs_compressor_id_from_name(const char *name, E_SQFS_COMPRESSOR *out);  #ifdef __cplusplus diff --git a/include/sqfs/dir.h b/include/sqfs/dir.h index c57831c..3a65102 100644 --- a/include/sqfs/dir.h +++ b/include/sqfs/dir.h @@ -9,6 +9,7 @@  #include "config.h" +#include "sqfs/predef.h"  #include "sqfs/meta_reader.h"  #include "sqfs/meta_writer.h" @@ -44,33 +45,34 @@ extern "C" {  #endif  /* Returns 0 on success. Internally prints to stderr on failure */ -int sqfs_meta_reader_read_dir_header(sqfs_meta_reader_t *m, -				     sqfs_dir_header_t *hdr); +SQFS_API int sqfs_meta_reader_read_dir_header(sqfs_meta_reader_t *m, +					      sqfs_dir_header_t *hdr);  /* Entry can be freed with a single free() call.     The function internally prints to stderr on failure */ -sqfs_dir_entry_t *sqfs_meta_reader_read_dir_ent(sqfs_meta_reader_t *m); +SQFS_API sqfs_dir_entry_t *sqfs_meta_reader_read_dir_ent(sqfs_meta_reader_t *m); -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); -void sqfs_dir_writer_destroy(sqfs_dir_writer_t *writer); +SQFS_API void sqfs_dir_writer_destroy(sqfs_dir_writer_t *writer); -int sqfs_dir_writer_begin(sqfs_dir_writer_t *writer); +SQFS_API int sqfs_dir_writer_begin(sqfs_dir_writer_t *writer); -int sqfs_dir_writer_add_entry(sqfs_dir_writer_t *writer, const char *name, -			      uint32_t inode_num, uint64_t inode_ref, -			      mode_t mode); +SQFS_API int sqfs_dir_writer_add_entry(sqfs_dir_writer_t *writer, +				       const char *name, +				       uint32_t inode_num, uint64_t inode_ref, +				       mode_t mode); -int sqfs_dir_writer_end(sqfs_dir_writer_t *writer); +SQFS_API int sqfs_dir_writer_end(sqfs_dir_writer_t *writer); -size_t sqfs_dir_writer_get_size(sqfs_dir_writer_t *writer); +SQFS_API size_t sqfs_dir_writer_get_size(sqfs_dir_writer_t *writer); -uint64_t sqfs_dir_writer_get_dir_reference(sqfs_dir_writer_t *writer); +SQFS_API uint64_t sqfs_dir_writer_get_dir_reference(sqfs_dir_writer_t *writer); -size_t sqfs_dir_writer_get_index_size(sqfs_dir_writer_t *writer); +SQFS_API size_t sqfs_dir_writer_get_index_size(sqfs_dir_writer_t *writer); -int sqfs_dir_writer_write_index(sqfs_dir_writer_t *writer, -				sqfs_meta_writer_t *im); +SQFS_API int sqfs_dir_writer_write_index(sqfs_dir_writer_t *writer, +					 sqfs_meta_writer_t *im);  #ifdef __cplusplus  } diff --git a/include/sqfs/id_table.h b/include/sqfs/id_table.h index 0e652ec..f8b3b5c 100644 --- a/include/sqfs/id_table.h +++ b/include/sqfs/id_table.h @@ -12,7 +12,8 @@  #include <stdint.h>  #include <stddef.h> -#include "compress.h" +#include "sqfs/predef.h" +#include "sqfs/compress.h"  typedef struct sqfs_id_table_t sqfs_id_table_t; @@ -21,26 +22,27 @@ extern "C" {  #endif  /* Prints error message to stderr on failure. */ -sqfs_id_table_t *sqfs_id_table_create(void); +SQFS_API sqfs_id_table_t *sqfs_id_table_create(void); -void sqfs_id_table_destroy(sqfs_id_table_t *tbl); +SQFS_API void sqfs_id_table_destroy(sqfs_id_table_t *tbl);  /* Resolve a 32 bit to a 16 bit table index.     Returns 0 on success. Internally prints errors to stderr. */ -int sqfs_id_table_id_to_index(sqfs_id_table_t *tbl, uint32_t id, uint16_t *out); +SQFS_API int sqfs_id_table_id_to_index(sqfs_id_table_t *tbl, uint32_t id, +				       uint16_t *out);  /* Write an ID table to a SquashFS image.     Returns 0 on success. Internally prints error message to stderr. */ -int sqfs_id_table_write(sqfs_id_table_t *tbl, int outfd, sqfs_super_t *super, -			sqfs_compressor_t *cmp); +SQFS_API int sqfs_id_table_write(sqfs_id_table_t *tbl, int outfd, +				 sqfs_super_t *super, sqfs_compressor_t *cmp);  /* Read an ID table from a SquashFS image.     Returns 0 on success. Internally prints error messages to stderr. */ -int sqfs_id_table_read(sqfs_id_table_t *tbl, int fd, sqfs_super_t *super, -		       sqfs_compressor_t *cmp); +SQFS_API int sqfs_id_table_read(sqfs_id_table_t *tbl, int fd, +				sqfs_super_t *super, sqfs_compressor_t *cmp); -int sqfs_id_table_index_to_id(const sqfs_id_table_t *tbl, uint16_t index, -			      uint32_t *out); +SQFS_API int sqfs_id_table_index_to_id(const sqfs_id_table_t *tbl, +				       uint16_t index, uint32_t *out);  #ifdef __cplusplus  } diff --git a/include/sqfs/inode.h b/include/sqfs/inode.h index d693aec..37a088c 100644 --- a/include/sqfs/inode.h +++ b/include/sqfs/inode.h @@ -9,6 +9,7 @@  #include "config.h" +#include "sqfs/predef.h"  #include "sqfs/meta_reader.h"  #include "sqfs/meta_writer.h" @@ -138,13 +139,14 @@ extern "C" {  /* Inode can be freed with a single free() call.     The function internally prints error message to stderr on failure. */ +SQFS_API  sqfs_inode_generic_t *sqfs_meta_reader_read_inode(sqfs_meta_reader_t *ir,  						  sqfs_super_t *super,  						  uint64_t block_start,  						  size_t offset); -int sqfs_meta_writer_write_inode(sqfs_meta_writer_t *iw, -				 sqfs_inode_generic_t *n); +SQFS_API int sqfs_meta_writer_write_inode(sqfs_meta_writer_t *iw, +					  sqfs_inode_generic_t *n);  #ifdef __cplusplus  } diff --git a/include/sqfs/meta_reader.h b/include/sqfs/meta_reader.h index 6f0d184..1e5e027 100644 --- a/include/sqfs/meta_reader.h +++ b/include/sqfs/meta_reader.h @@ -9,6 +9,7 @@  #include "config.h" +#include "sqfs/predef.h"  #include "sqfs/compress.h"  #include "sqfs/data.h" @@ -24,21 +25,24 @@ extern "C" {     Start offset and limit can be specified to do bounds checking against     a subregion of the filesystem image.  */ -sqfs_meta_reader_t *sqfs_meta_reader_create(int fd, sqfs_compressor_t *cmp, -					    uint64_t start, uint64_t limit); +SQFS_API sqfs_meta_reader_t *sqfs_meta_reader_create(int fd, +						     sqfs_compressor_t *cmp, +						     uint64_t start, +						     uint64_t limit); -void sqfs_meta_reader_destroy(sqfs_meta_reader_t *m); +SQFS_API void sqfs_meta_reader_destroy(sqfs_meta_reader_t *m);  /* Returns 0 on success. Internally prints to stderr on failure */ -int sqfs_meta_reader_seek(sqfs_meta_reader_t *m, uint64_t block_start, -			  size_t offset); +SQFS_API int sqfs_meta_reader_seek(sqfs_meta_reader_t *m, uint64_t block_start, +				   size_t offset); -void sqfs_meta_reader_get_position(sqfs_meta_reader_t *m, -				   uint64_t *block_start, -				   size_t *offset); +SQFS_API void sqfs_meta_reader_get_position(sqfs_meta_reader_t *m, +					    uint64_t *block_start, +					    size_t *offset);  /* Returns 0 on success. Internally prints to stderr on failure */ -int sqfs_meta_reader_read(sqfs_meta_reader_t *m, void *data, size_t size); +SQFS_API int sqfs_meta_reader_read(sqfs_meta_reader_t *m, void *data, +				   size_t size);  #ifdef __cplusplus  } diff --git a/include/sqfs/meta_writer.h b/include/sqfs/meta_writer.h index bb14993..3611984 100644 --- a/include/sqfs/meta_writer.h +++ b/include/sqfs/meta_writer.h @@ -9,6 +9,7 @@  #include "config.h" +#include "sqfs/predef.h"  #include "sqfs/compress.h"  #include "sqfs/id_table.h"  #include "sqfs/data.h" @@ -24,31 +25,32 @@ extern "C" {     If keep_in_mem is true, the blocks are collected in memory and must     be explicitly flushed to disk using meta_write_write_to_file.  */ -sqfs_meta_writer_t *sqfs_meta_writer_create(int fd, sqfs_compressor_t *cmp, -					    bool keep_in_mem); +SQFS_API sqfs_meta_writer_t *sqfs_meta_writer_create(int fd, +						     sqfs_compressor_t *cmp, +						     bool keep_in_mem); -void sqfs_meta_writer_destroy(sqfs_meta_writer_t *m); +SQFS_API void sqfs_meta_writer_destroy(sqfs_meta_writer_t *m);  /* Compress and flush the currently unfinished block to disk. Returns 0 on     success, internally prints error message to stderr on failure */ -int sqfs_meta_writer_flush(sqfs_meta_writer_t *m); +SQFS_API int sqfs_meta_writer_flush(sqfs_meta_writer_t *m);  /* Returns 0 on success. Prints error message to stderr on failure. */ -int sqfs_meta_writer_append(sqfs_meta_writer_t *m, const void *data, -			    size_t size); +SQFS_API int sqfs_meta_writer_append(sqfs_meta_writer_t *m, const void *data, +				     size_t size);  /* Query the current block start position and offset within the block */ -void sqfs_meta_writer_get_position(const sqfs_meta_writer_t *m, -				   uint64_t *block_start, -				   uint32_t *offset); +SQFS_API void sqfs_meta_writer_get_position(const sqfs_meta_writer_t *m, +					    uint64_t *block_start, +					    uint32_t *offset);  /* Reset all internal state, including the current block start position. */ -void sqfs_meta_writer_reset(sqfs_meta_writer_t *m); +SQFS_API void sqfs_meta_writer_reset(sqfs_meta_writer_t *m);  /* If created with keep_in_mem true, write the collected blocks to disk.     Does not flush the current block. Writes error messages to stderr and     returns non-zero on failure. */ -int sqfs_meta_write_write_to_file(sqfs_meta_writer_t *m); +SQFS_API int sqfs_meta_write_write_to_file(sqfs_meta_writer_t *m);  #ifdef __cplusplus  } diff --git a/include/sqfs/predef.h b/include/sqfs/predef.h new file mode 100644 index 0000000..210f306 --- /dev/null +++ b/include/sqfs/predef.h @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * predef.h + * + * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> + */ +#ifndef SQFS_PREDEF_H +#define SQFS_PREDEF_H + +#if defined(_WIN32) || defined(__CYGWIN__) +	#ifdef SQFS_BUILDING_DLL +		#if defined(__GNUC__) || defined(__clang__) +			#define SQFS_API __attribute__ ((dllexport)) +		#else +			#define SQFS_API __declspec(dllexport) +		#endif +	#else +		#if defined(__GNUC__) || defined(__clang__) +			#define SQFS_API __attribute__ ((dllimport)) +		#else +			#define SQFS_API __declspec(dllimport) +		#endif +	#endif + +	#define SQFS_INTERNAL +#else +	#if defined(__GNUC__) || defined(__clang__) +		#define SQFS_API __attribute__ ((visibility ("default"))) +		#define SQFS_INTERNAL  __attribute__ ((visibility ("hidden"))) +	#else +		#define SQFS_API +		#define SQFS_INTERNAL +	#endif +#endif + +#endif /* SQFS_PREDEF_H */ diff --git a/include/sqfs/super.h b/include/sqfs/super.h index 0df1691..6593555 100644 --- a/include/sqfs/super.h +++ b/include/sqfs/super.h @@ -9,6 +9,8 @@  #include "config.h" +#include "sqfs/predef.h" +  #include <stdint.h>  #include <stddef.h> @@ -71,14 +73,15 @@ extern "C" {  #endif  /* Returns 0 on success. Prints error messages to stderr on failure. */ -int sqfs_super_init(sqfs_super_t *super, size_t block_size, uint32_t mtime, -		    E_SQFS_COMPRESSOR compressor); +SQFS_API int sqfs_super_init(sqfs_super_t *super, size_t block_size, +			     uint32_t mtime, +			     E_SQFS_COMPRESSOR compressor);  /* Returns 0 on success. Prints error messages to stderr on failure. */ -int sqfs_super_write(sqfs_super_t *super, int fd); +SQFS_API int sqfs_super_write(sqfs_super_t *super, int fd);  /* Returns 0 on success. Prints error messages to stderr on failure. */ -int sqfs_super_read(sqfs_super_t *super, int fd); +SQFS_API int sqfs_super_read(sqfs_super_t *super, int fd);  #ifdef __cplusplus  } diff --git a/include/sqfs/table.h b/include/sqfs/table.h index b5eeb54..0bd3112 100644 --- a/include/sqfs/table.h +++ b/include/sqfs/table.h @@ -7,6 +7,7 @@  #ifndef SQFS_TABLE_H  #define SQFS_TABLE_H +#include "sqfs/predef.h"  #include "sqfs/compress.h"  #include "sqfs/super.h" @@ -28,12 +29,14 @@ extern "C" {    Returns 0 on success. Internally prints error messages to stderr.   */ -int sqfs_write_table(int outfd, sqfs_super_t *super, sqfs_compressor_t *cmp, -		     const void *data, size_t table_size, uint64_t *start); - -void *sqfs_read_table(int fd, sqfs_compressor_t *cmp, size_t table_size, -		      uint64_t location, uint64_t lower_limit, -		      uint64_t upper_limit); +SQFS_API int sqfs_write_table(int outfd, sqfs_super_t *super, +			      sqfs_compressor_t *cmp, +			      const void *data, size_t table_size, +			      uint64_t *start); + +SQFS_API void *sqfs_read_table(int fd, sqfs_compressor_t *cmp, +			       size_t table_size, uint64_t location, +			       uint64_t lower_limit, uint64_t upper_limit);  #ifdef __cplusplus  } diff --git a/include/sqfs/xattr.h b/include/sqfs/xattr.h index 5350534..d1b3bdd 100644 --- a/include/sqfs/xattr.h +++ b/include/sqfs/xattr.h @@ -9,6 +9,7 @@  #include "config.h" +#include "sqfs/predef.h"  #include "sqfs/compress.h"  #include <stdbool.h> @@ -54,28 +55,31 @@ extern "C" {  #endif  /* Get a prefix string from the ID or NULL if unknown */ -const char *sqfs_get_xattr_prefix(E_SQFS_XATTR_TYPE id); +SQFS_API const char *sqfs_get_xattr_prefix(E_SQFS_XATTR_TYPE id);  /* Get id from xattr key prefix or -1 if not supported */ -int sqfs_get_xattr_prefix_id(const char *key); +SQFS_API int sqfs_get_xattr_prefix_id(const char *key);  /* Check if a given xattr key can be encoded in squashfs at all. */ -bool sqfs_has_xattr(const char *key); +SQFS_API bool sqfs_has_xattr(const char *key); -void sqfs_xattr_reader_destroy(sqfs_xattr_reader_t *xr); +SQFS_API void sqfs_xattr_reader_destroy(sqfs_xattr_reader_t *xr); -sqfs_xattr_reader_t *sqfs_xattr_reader_create(int sqfsfd, sqfs_super_t *super, -					      sqfs_compressor_t *cmp); +SQFS_API sqfs_xattr_reader_t *sqfs_xattr_reader_create(int sqfsfd, +						       sqfs_super_t *super, +						       sqfs_compressor_t *cmp); -int sqfs_xattr_reader_get_desc(sqfs_xattr_reader_t *xr, uint32_t idx, -			       sqfs_xattr_id_t *desc); +SQFS_API int sqfs_xattr_reader_get_desc(sqfs_xattr_reader_t *xr, uint32_t idx, +					sqfs_xattr_id_t *desc); -int sqfs_xattr_reader_seek_kv(sqfs_xattr_reader_t *xr, -			      const sqfs_xattr_id_t *desc); +SQFS_API int sqfs_xattr_reader_seek_kv(sqfs_xattr_reader_t *xr, +				       const sqfs_xattr_id_t *desc); +SQFS_API  sqfs_xattr_value_t *sqfs_xattr_reader_read_value(sqfs_xattr_reader_t *xr,  						 const sqfs_xattr_entry_t *key); +SQFS_API  sqfs_xattr_entry_t *sqfs_xattr_reader_read_key(sqfs_xattr_reader_t *xr);  #ifdef __cplusplus diff --git a/include/str_table.h b/include/str_table.h index 634854a..1f836cc 100644 --- a/include/str_table.h +++ b/include/str_table.h @@ -7,6 +7,8 @@  #ifndef STR_TABLE_H  #define STR_TABLE_H +#include "sqfs/predef.h" +  typedef struct str_bucket_t {  	struct str_bucket_t *next;  	char *str; @@ -28,22 +30,24 @@ typedef struct {  /* `size` is the number of hash table buckets to use internally.     Returns 0 on success. Internally writes errors to stderr. */ -int str_table_init(str_table_t *table, size_t size); +SQFS_INTERNAL int str_table_init(str_table_t *table, size_t size); -void str_table_cleanup(str_table_t *table); +SQFS_INTERNAL void str_table_cleanup(str_table_t *table);  /* Resolve a string to an incremental, unique ID     Returns 0 on success. Internally writes errors to stderr. */ +SQFS_INTERNAL  int str_table_get_index(str_table_t *table, const char *str, size_t *idx);  /* Resolve a unique ID to the string it represents.     Returns NULL if the ID is unknown, i.e. out of bounds. */ +SQFS_INTERNAL  const char *str_table_get_string(str_table_t *table, size_t index); -void str_table_reset_ref_count(str_table_t *table); +SQFS_INTERNAL void str_table_reset_ref_count(str_table_t *table); -void str_table_add_ref(str_table_t *table, size_t index); +SQFS_INTERNAL void str_table_add_ref(str_table_t *table, size_t index); -size_t str_table_get_ref_count(str_table_t *table, size_t index); +SQFS_INTERNAL size_t str_table_get_ref_count(str_table_t *table, size_t index);  #endif /* STR_TABLE_H */ diff --git a/include/util.h b/include/util.h index 651a958..93b8a04 100644 --- a/include/util.h +++ b/include/util.h @@ -8,6 +8,7 @@  #define UTIL_H  #include "config.h" +#include "sqfs/predef.h"  #include <sys/types.h>  #include <stdint.h> @@ -52,6 +53,7 @@ typedef struct sparse_map_t {    on success. Writes to stderr on failure using 'errstr' as a perror style    error prefix.  */ +SQFS_INTERNAL  int write_data(const char *errstr, int fd, const void *data, size_t size);  /* @@ -60,11 +62,13 @@ int write_data(const char *errstr, int fd, const void *data, size_t size);    on success. Writes to stderr on failure using 'errstr' as a perror style    error prefix.  */ +SQFS_INTERNAL  int read_data(const char *errstr, int fd, void *buffer, size_t size);  /*    Similar to read_data but wrapps pread() instead of read().  */ +SQFS_INTERNAL  int read_data_at(const char *errstr, off_t location,  		 int fd, void *buffer, size_t size); @@ -74,6 +78,7 @@ int read_data_at(const char *errstr, off_t location,    Prints out version information. The program name is extracted from the    BSD style __progname global variable.  */ +SQFS_INTERNAL  void print_version(void);  /* @@ -82,21 +87,26 @@ void print_version(void);    Returns 0 on success.  */ +SQFS_INTERNAL  int mkdir_p(const char *path);  /* Returns 0 on success. On failure, prints error message to stderr. */ +SQFS_INTERNAL  int pushd(const char *path);  /* Same as pushd, but the string doesn't have to be null-terminated. */ +SQFS_INTERNAL  int pushdn(const char *path, size_t len);  /* Returns 0 on success. On failure, prints error message to stderr. */ +SQFS_INTERNAL  int popd(void);  /*    Write zero bytes to an output file to padd it to specified block size.    Returns 0 on success. On failure, prints error message to stderr.  */ +SQFS_INTERNAL  int padd_file(int outfd, uint64_t size, size_t blocksize);  /* @@ -107,12 +117,15 @@ int padd_file(int outfd, uint64_t size, size_t blocksize);    Iternally checks for arithmetic overflows when allocating the combined thing.   */ +SQFS_INTERNAL  void *alloc_flex(size_t base_size, size_t item_size, size_t nmemb);  /* Basically the same as calloc, but *ALWAYS* does overflow checking */ +SQFS_INTERNAL  void *alloc_array(size_t item_size, size_t nmemb);  /* allocates len + 1 (for the null-terminator) and does overflow checking */ +SQFS_INTERNAL  void *alloc_string(size_t len);  #endif /* UTIL_H */ | 
