On 2024/7/2 20:14, Hongzhen Luo wrote:

erofs-utils: lib: change function definition of erofs_blocklist_open()

s/chagne/change/

Modified the definition of the function `erofs_blocklist_open` to accept
a file pointer rather than a string, for external use in liberofs.

Modify erofs_blocklist_open to accept a file pointer instead of a
file path, making it suitable for external use in liberofs.


Signed-off-by: Hongzhen Luo <[email protected]>
---
v2: Let the caller to close the block_list.
v1: 
https://lore.kernel.org/all/[email protected]/
---
  include/erofs/block_list.h |  4 ++--
  lib/block_list.c           | 17 +++++++----------
  mkfs/main.c                | 23 +++++++++++++++--------
  3 files changed, 24 insertions(+), 20 deletions(-)

diff --git a/include/erofs/block_list.h b/include/erofs/block_list.h
index 9f9975e..7db4d0c 100644
--- a/include/erofs/block_list.h
+++ b/include/erofs/block_list.h
@@ -13,8 +13,8 @@ extern "C"
#include "internal.h" -int erofs_blocklist_open(char *filename, bool srcmap);
-void erofs_blocklist_close(void);
+int erofs_blocklist_open(FILE *fp, bool srcmap);
+FILE *erofs_blocklist_close(void);
void tarerofs_blocklist_write(erofs_blk_t blkaddr, erofs_blk_t nblocks,
                              erofs_off_t srcoff);
diff --git a/lib/block_list.c b/lib/block_list.c
index f47a746..10c7c6a 100644
--- a/lib/block_list.c
+++ b/lib/block_list.c
@@ -13,23 +13,20 @@
  static FILE *block_list_fp;
  bool srcmap_enabled;
-int erofs_blocklist_open(char *filename, bool srcmap)
+int erofs_blocklist_open(FILE *fp, bool srcmap)
  {
-       block_list_fp = fopen(filename, "w");
-
-       if (!block_list_fp)
-               return -errno;
+       if (!fp)
+               return -ENOENT;
+       block_list_fp = fp;
        srcmap_enabled = srcmap;
        return 0;
  }
-void erofs_blocklist_close(void)
+FILE *erofs_blocklist_close(void)
  {
-       if (!block_list_fp)
-               return;
-
-       fclose(block_list_fp);
+       FILE *ret = block_list_fp;
        block_list_fp = NULL;
+       return ret;>   }
/* XXX: really need to be cleaned up */
diff --git a/mkfs/main.c b/mkfs/main.c
index 63ed877..07b4f8d 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -1133,6 +1133,10 @@ int main(int argc, char **argv)
        erofs_blk_t nblocks;
        struct timeval t;
        FILE *packedfile = NULL;
+       FILE  *mp_fp;
+#ifdef WITH_ANDROID    
+       FILE  *cfg_fp;
+#endif
        FILE *blocklist;

        u32 crc;
erofs_init_configure();
@@ -1173,11 +1177,13 @@ int main(int argc, char **argv)
                erofs_err("failed to load fs config %s", cfg.fs_config_file);
                return 1;
        }
-
-       if (cfg.block_list_file &&
-           erofs_blocklist_open(cfg.block_list_file, false)) {
-               erofs_err("failed to open %s", cfg.block_list_file);
-               return 1;
+       
+       if (cfg.block_list_file) {
+               cfg_fp = fopen(cfg.block_list_file, "w");

                blklst = fopen(cfg.block_list_file, "w");

+               if (!cfg_fp || erofs_blocklist_open(cfg_fp, false)) {
+                       erofs_err("failed to open %s", cfg.block_list_file);
+                       return 1;
+               }
        }
  #endif
        erofs_show_config();
@@ -1210,8 +1216,9 @@ int main(int argc, char **argv)
                erofstar.dev = rebuild_src_count + 1;
if (erofstar.mapfile) {
-                       err = erofs_blocklist_open(erofstar.mapfile, true);
-                       if (err) {
+                       mp_fp = fopen(erofstar.mapfile, "w");

                        blklst = fopen(erofstar.mapfile, "w");

+                       if (!mp_fp || erofs_blocklist_open(mp_fp, true)) {
+                               err = -errno;
                                erofs_err("failed to open %s", 
erofstar.mapfile);
                                goto exit;
                        }
@@ -1417,7 +1424,7 @@ exit:
                erofs_iput(root);
        z_erofs_compress_exit();
        z_erofs_dedupe_exit();
-       erofs_blocklist_close();
+       fclose(erofs_blocklist_close());

What if erofs_blocklist_close() returns NULL?

        blklst = erofs_blocklist_close();
        if (blklst)
                fclose(blklst);

Thanks,
Gao Xiang

        erofs_dev_close(&sbi);
        erofs_cleanup_compress_hints();
        erofs_cleanup_exclude_rules();

Reply via email to