#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);
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;
+ FILE *fp = block_list_fp;
- fclose(block_list_fp);
block_list_fp = NULL;
+ return fp;
}
/* XXX: really need to be cleaned up */
erofs_blk_t nblocks;
struct timeval t;
FILE *packedfile = NULL;
+ FILE *blklst = NULL;
u32 crc;
erofs_init_configure();
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) {
+ blklst = fopen(cfg.block_list_file, "w");
+ if (!blklst || erofs_blocklist_open(blklst, false)) {
+ erofs_err("failed to open %s", cfg.block_list_file);
+ return 1;
+ }
}
#endif
erofs_show_config();
erofstar.dev = rebuild_src_count + 1;
if (erofstar.mapfile) {
- err = erofs_blocklist_open(erofstar.mapfile, true);
- if (err) {
+ blklst = fopen(erofstar.mapfile, "w");
+ if (!blklst || erofs_blocklist_open(blklst, true)) {
+ err = -errno;
erofs_err("failed to open %s", erofstar.mapfile);
goto exit;
}
erofs_iput(root);
z_erofs_compress_exit();
z_erofs_dedupe_exit();
- erofs_blocklist_close();
+ blklst = erofs_blocklist_close();
+ if (blklst)
+ fclose(blklst);
erofs_dev_close(&sbi);
erofs_cleanup_compress_hints();
erofs_cleanup_exclude_rules();