Add --offset to erofsfuse to skip bytes at the start of the image file.

Signed-off-by: Li He <[email protected]>
---
 fuse/main.c            | 6 ++++++
 include/erofs/config.h | 3 +++
 lib/io.c               | 2 ++
 3 files changed, 11 insertions(+)

diff --git a/fuse/main.c b/fuse/main.c
index f4c2476..a2a6449 100644
--- a/fuse/main.c
+++ b/fuse/main.c
@@ -151,6 +151,7 @@ static struct fuse_operations erofs_ops = {
 static struct options {
        const char *disk;
        const char *mountpoint;
+       u64 offset;
        unsigned int debug_lvl;
        bool show_help;
        bool odebug;
@@ -158,6 +159,7 @@ static struct options {
 
 #define OPTION(t, p) { t, offsetof(struct options, p), 1 }
 static const struct fuse_opt option_spec[] = {
+       OPTION("--offset=%lu", offset),
        OPTION("--dbglevel=%u", debug_lvl),
        OPTION("--help", show_help),
        FUSE_OPT_KEY("--device=", 1),
@@ -170,6 +172,7 @@ static void usage(void)
 
        fputs("usage: [options] IMAGE MOUNTPOINT\n\n"
              "Options:\n"
+             "    --offset=#             # bytes to skip when read IMAGE\n"
              "    --dbglevel=#           set output message level to # 
(maximum 9)\n"
              "    --device=#             specify an extra device to be used 
together\n"
 #if FUSE_MAJOR_VERSION < 3
@@ -190,6 +193,7 @@ static void usage(void)
 static void erofsfuse_dumpcfg(void)
 {
        erofs_dump("disk: %s\n", fusecfg.disk);
+       erofs_dump("offset: %lu\n", fusecfg.offset);
        erofs_dump("mountpoint: %s\n", fusecfg.mountpoint);
        erofs_dump("dbglevel: %u\n", cfg.c_dbg_lvl);
 }
@@ -279,6 +283,8 @@ int main(int argc, char *argv[])
        if (fusecfg.odebug && cfg.c_dbg_lvl < EROFS_DBG)
                cfg.c_dbg_lvl = EROFS_DBG;
 
+       cfg.c_offset = fusecfg.offset;
+
        erofsfuse_dumpcfg();
        ret = dev_open_ro(fusecfg.disk);
        if (ret) {
diff --git a/include/erofs/config.h b/include/erofs/config.h
index 0d0916c..8b6f7db 100644
--- a/include/erofs/config.h
+++ b/include/erofs/config.h
@@ -73,6 +73,9 @@ struct erofs_configure {
        char *fs_config_file;
        char *block_list_file;
 #endif
+
+       /* offset when read mutli partiton image */
+       u64 c_offset;
 };
 
 extern struct erofs_configure cfg;
diff --git a/lib/io.c b/lib/io.c
index 9c663c5..524cfb4 100644
--- a/lib/io.c
+++ b/lib/io.c
@@ -261,6 +261,8 @@ int dev_read(int device_id, void *buf, u64 offset, size_t 
len)
        if (cfg.c_dry_run)
                return 0;
 
+       offset += cfg.c_offset;
+
        if (!buf) {
                erofs_err("buf is NULL");
                return -EINVAL;
-- 
2.20.1



Reply via email to