* [PATCH] erofs-utils: dump: Add --cat flag to show file contents
@ 2025-01-09 9:55 Juan Hernandez
2025-01-09 10:37 ` Gao Xiang
0 siblings, 1 reply; 5+ messages in thread
From: Juan Hernandez @ 2025-01-09 9:55 UTC (permalink / raw)
To: linux-erofs; +Cc: Juan Hernandez
This patch adds a new '--cat' flag to the 'dump.erofs' command. When
used it will write to the standard output the content of the file
indicated by the '--path' or '--nid' options. For example, if there is a
'/mydir/myfile.txt' file containg the text 'mytext':
$ dump.erofs --cat --path=/mydir/myfile.txt myimage.erofs
mytext
Signed-off-by: Juan Hernandez <jhernand@redhat.com>
---
dump/main.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++
man/dump.erofs.1 | 13 +++++++--
2 files changed, 83 insertions(+), 2 deletions(-)
diff --git a/dump/main.c b/dump/main.c
index 372162e..ed8d44d 100644
--- a/dump/main.c
+++ b/dump/main.c
@@ -26,6 +26,7 @@ struct erofsdump_cfg {
bool show_superblock;
bool show_statistics;
bool show_subdirectories;
+ bool show_file_content;
erofs_nid_t nid;
const char *inode_path;
};
@@ -80,6 +81,7 @@ static struct option long_options[] = {
{"path", required_argument, NULL, 4},
{"ls", no_argument, NULL, 5},
{"offset", required_argument, NULL, 6},
+ {"cat", no_argument, NULL, 7},
{0, 0, 0, 0},
};
@@ -123,6 +125,7 @@ static void usage(int argc, char **argv)
" -s show information about superblock\n"
" --device=X specify an extra device to be used together\n"
" --ls show directory contents (INODE required)\n"
+ " --cat show file contents (INODE required)\n"
" --nid=# show the target inode info of nid #\n"
" --offset=# skip # bytes at the beginning of IMAGE\n"
" --path=X show the target inode info of path X\n",
@@ -186,6 +189,9 @@ static int erofsdump_parse_options_cfg(int argc, char **argv)
return -EINVAL;
}
break;
+ case 7:
+ dumpcfg.show_file_content = true;
+ break;
default:
return -EINVAL;
}
@@ -672,6 +678,63 @@ static void erofsdump_show_superblock(void)
uuid_str);
}
+static void erofsdump_show_file_content(void)
+{
+ int err;
+ struct erofs_inode inode = { .sbi = &g_sbi, .nid = dumpcfg.nid };
+ size_t buffer_size;
+ char *buffer_ptr;
+ erofs_off_t pending_size;
+ erofs_off_t read_offset;
+ erofs_off_t read_size;
+
+ if (dumpcfg.inode_path) {
+ err = erofs_ilookup(dumpcfg.inode_path, &inode);
+ if (err) {
+ erofs_err("read inode failed @ %s", dumpcfg.inode_path);
+ return;
+ }
+ } else {
+ err = erofs_read_inode_from_disk(&inode);
+ if (err) {
+ erofs_err("read inode failed @ nid %llu", inode.nid | 0ULL);
+ return;
+ }
+ }
+
+ if (!S_ISREG(inode.i_mode)) {
+ erofs_err("not a regular file @ nid %llu", inode.nid | 0ULL);
+ return;
+ }
+
+ buffer_size = erofs_blksiz(inode.sbi);
+ buffer_ptr = malloc(buffer_size);
+ if (!buffer_ptr) {
+ erofs_err("buffer allocation failed @ nid %llu", inode.nid | 0ULL);
+ return;
+ }
+
+ pending_size = inode.i_size;
+ read_offset = 0;
+ while (pending_size > 0) {
+ read_size = pending_size > buffer_size? buffer_size: pending_size;
+ err = erofs_pread(&inode, buffer_ptr, read_size, read_offset);
+ if (err) {
+ erofs_err("read file failed @ nid %llu", inode.nid | 0ULL);
+ goto out;
+ }
+ pending_size -= read_size;
+ read_offset += read_size;
+ fwrite(buffer_ptr, read_size, 1, stdout);
+ }
+ fflush(stdout);
+
+out:
+ free(buffer_ptr);
+}
+
+
+
int main(int argc, char **argv)
{
int err;
@@ -696,6 +759,15 @@ int main(int argc, char **argv)
goto exit_dev_close;
}
+ if (dumpcfg.show_file_content) {
+ if (dumpcfg.show_superblock || dumpcfg.show_statistics || dumpcfg.show_subdirectories) {
+ fprintf(stderr, "The '--cat' flag is incompatible with '-S', '-e', '-s' and '--ls'.\n");
+ goto exit_dev_close;
+ }
+ erofsdump_show_file_content();
+ goto exit_dev_close;
+ }
+
if (!dumpcfg.totalshow) {
dumpcfg.show_superblock = true;
dumpcfg.totalshow = 1;
diff --git a/man/dump.erofs.1 b/man/dump.erofs.1
index 6237ead..ec823ec 100644
--- a/man/dump.erofs.1
+++ b/man/dump.erofs.1
@@ -8,7 +8,7 @@ or overall disk statistics information from an EROFS-formatted image.
\fBdump.erofs\fR [\fIOPTIONS\fR] \fIIMAGE\fR
.SH DESCRIPTION
.B dump.erofs
-is used to retrieve erofs metadata from \fIIMAGE\fP and demonstrate
+is used to retrieve erofs metadata and data from \fIIMAGE\fP and demonstrate
.br
1) overall disk statistics,
.br
@@ -16,7 +16,9 @@ is used to retrieve erofs metadata from \fIIMAGE\fP and demonstrate
.br
3) file information of the given inode NID,
.br
-4) file extent information of the given inode NID.
+4) file extent information of the given inode NID,
+.br
+5) file content for the given inode NID.
.SH OPTIONS
.TP
.BI "\-\-device=" path
@@ -32,6 +34,13 @@ or
.I path
required.
.TP
+.BI "\-\-cat"
+Write file content to standard output.
+.I NID
+or
+.I path
+required.
+.TP
.BI "\-\-nid=" NID
Specify an inode NID in order to print its file information.
.TP
--
2.47.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] erofs-utils: dump: Add --cat flag to show file contents
2025-01-09 9:55 [PATCH] erofs-utils: dump: Add --cat flag to show file contents Juan Hernandez
@ 2025-01-09 10:37 ` Gao Xiang
2025-01-09 10:49 ` Juan Hernández
0 siblings, 1 reply; 5+ messages in thread
From: Gao Xiang @ 2025-01-09 10:37 UTC (permalink / raw)
To: Juan Hernandez, linux-erofs
Hi Juan,
On 2025/1/9 17:55, Juan Hernandez wrote:
> This patch adds a new '--cat' flag to the 'dump.erofs' command. When
> used it will write to the standard output the content of the file
> indicated by the '--path' or '--nid' options. For example, if there is a
> '/mydir/myfile.txt' file containg the text 'mytext':
>
> $ dump.erofs --cat --path=/mydir/myfile.txt myimage.erofs
> mytext
>
> Signed-off-by: Juan Hernandez <jhernand@redhat.com>
Thanks for the patch!
It looks good to me, just minor nits..
> ---
> dump/main.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++
> man/dump.erofs.1 | 13 +++++++--
> 2 files changed, 83 insertions(+), 2 deletions(-)
>
> diff --git a/dump/main.c b/dump/main.c
> index 372162e..ed8d44d 100644
> --- a/dump/main.c
> +++ b/dump/main.c
> @@ -26,6 +26,7 @@ struct erofsdump_cfg {
> bool show_superblock;
> bool show_statistics;
> bool show_subdirectories;
> + bool show_file_content;
> erofs_nid_t nid;
> const char *inode_path;
> };
> @@ -80,6 +81,7 @@ static struct option long_options[] = {
> {"path", required_argument, NULL, 4},
> {"ls", no_argument, NULL, 5},
> {"offset", required_argument, NULL, 6},
> + {"cat", no_argument, NULL, 7},
> {0, 0, 0, 0},
> };
>
> @@ -123,6 +125,7 @@ static void usage(int argc, char **argv)
> " -s show information about superblock\n"
> " --device=X specify an extra device to be used together\n"
> " --ls show directory contents (INODE required)\n"
> + " --cat show file contents (INODE required)\n"
> " --nid=# show the target inode info of nid #\n"
> " --offset=# skip # bytes at the beginning of IMAGE\n"
> " --path=X show the target inode info of path X\n",
> @@ -186,6 +189,9 @@ static int erofsdump_parse_options_cfg(int argc, char **argv)
> return -EINVAL;
> }
> break;
> + case 7:
> + dumpcfg.show_file_content = true;
> + break;
> default:
> return -EINVAL;
> }
> @@ -672,6 +678,63 @@ static void erofsdump_show_superblock(void)
> uuid_str);
> }
>
> +static void erofsdump_show_file_content(void)
> +{
> + int err;
> + struct erofs_inode inode = { .sbi = &g_sbi, .nid = dumpcfg.nid };
> + size_t buffer_size;
> + char *buffer_ptr;
> + erofs_off_t pending_size;
> + erofs_off_t read_offset;
> + erofs_off_t read_size;
> +
> + if (dumpcfg.inode_path) {
> + err = erofs_ilookup(dumpcfg.inode_path, &inode);
> + if (err) {
> + erofs_err("read inode failed @ %s", dumpcfg.inode_path);
> + return;
> + }
> + } else {
> + err = erofs_read_inode_from_disk(&inode);
> + if (err) {
> + erofs_err("read inode failed @ nid %llu", inode.nid | 0ULL);
> + return;
> + }
> + }
> +
> + if (!S_ISREG(inode.i_mode)) {
I think we could dump raw directory content too.
> + erofs_err("not a regular file @ nid %llu", inode.nid | 0ULL);
> + return;
> + }
> +
> + buffer_size = erofs_blksiz(inode.sbi);
> + buffer_ptr = malloc(buffer_size);
> + if (!buffer_ptr) {
> + erofs_err("buffer allocation failed @ nid %llu", inode.nid | 0ULL);
> + return;
> + }
> +
> + pending_size = inode.i_size;
> + read_offset = 0;
> + while (pending_size > 0) {
> + read_size = pending_size > buffer_size? buffer_size: pending_size;
> + err = erofs_pread(&inode, buffer_ptr, read_size, read_offset);
> + if (err) {
> + erofs_err("read file failed @ nid %llu", inode.nid | 0ULL);
> + goto out;
> + }
> + pending_size -= read_size;
> + read_offset += read_size;
> + fwrite(buffer_ptr, read_size, 1, stdout);
> + }
> + fflush(stdout);
> +
> +out:
> + free(buffer_ptr);
> +}
> +
> +
> +
Reduntant new lines..
Thanks,
Gao Xiang
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] erofs-utils: dump: Add --cat flag to show file contents
2025-01-09 10:37 ` Gao Xiang
@ 2025-01-09 10:49 ` Juan Hernández
2025-01-09 10:56 ` Juan Hernandez
0 siblings, 1 reply; 5+ messages in thread
From: Juan Hernández @ 2025-01-09 10:49 UTC (permalink / raw)
To: Gao Xiang; +Cc: linux-erofs
Thanks for your feedback Gao! I will address your concerns.
On Thu, Jan 9, 2025 at 11:43 AM Gao Xiang <hsiangkao@linux.alibaba.com> wrote:
>
> Hi Juan,
>
> On 2025/1/9 17:55, Juan Hernandez wrote:
> > This patch adds a new '--cat' flag to the 'dump.erofs' command. When
> > used it will write to the standard output the content of the file
> > indicated by the '--path' or '--nid' options. For example, if there is a
> > '/mydir/myfile.txt' file containg the text 'mytext':
> >
> > $ dump.erofs --cat --path=/mydir/myfile.txt myimage.erofs
> > mytext
> >
> > Signed-off-by: Juan Hernandez <jhernand@redhat.com>
>
> Thanks for the patch!
> It looks good to me, just minor nits..
>
> > ---
> > dump/main.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++
> > man/dump.erofs.1 | 13 +++++++--
> > 2 files changed, 83 insertions(+), 2 deletions(-)
> >
> > diff --git a/dump/main.c b/dump/main.c
> > index 372162e..ed8d44d 100644
> > --- a/dump/main.c
> > +++ b/dump/main.c
> > @@ -26,6 +26,7 @@ struct erofsdump_cfg {
> > bool show_superblock;
> > bool show_statistics;
> > bool show_subdirectories;
> > + bool show_file_content;
> > erofs_nid_t nid;
> > const char *inode_path;
> > };
> > @@ -80,6 +81,7 @@ static struct option long_options[] = {
> > {"path", required_argument, NULL, 4},
> > {"ls", no_argument, NULL, 5},
> > {"offset", required_argument, NULL, 6},
> > + {"cat", no_argument, NULL, 7},
> > {0, 0, 0, 0},
> > };
> >
> > @@ -123,6 +125,7 @@ static void usage(int argc, char **argv)
> > " -s show information about superblock\n"
> > " --device=X specify an extra device to be used together\n"
> > " --ls show directory contents (INODE required)\n"
> > + " --cat show file contents (INODE required)\n"
> > " --nid=# show the target inode info of nid #\n"
> > " --offset=# skip # bytes at the beginning of IMAGE\n"
> > " --path=X show the target inode info of path X\n",
> > @@ -186,6 +189,9 @@ static int erofsdump_parse_options_cfg(int argc, char **argv)
> > return -EINVAL;
> > }
> > break;
> > + case 7:
> > + dumpcfg.show_file_content = true;
> > + break;
> > default:
> > return -EINVAL;
> > }
> > @@ -672,6 +678,63 @@ static void erofsdump_show_superblock(void)
> > uuid_str);
> > }
> >
> > +static void erofsdump_show_file_content(void)
> > +{
> > + int err;
> > + struct erofs_inode inode = { .sbi = &g_sbi, .nid = dumpcfg.nid };
> > + size_t buffer_size;
> > + char *buffer_ptr;
> > + erofs_off_t pending_size;
> > + erofs_off_t read_offset;
> > + erofs_off_t read_size;
> > +
> > + if (dumpcfg.inode_path) {
> > + err = erofs_ilookup(dumpcfg.inode_path, &inode);
> > + if (err) {
> > + erofs_err("read inode failed @ %s", dumpcfg.inode_path);
> > + return;
> > + }
> > + } else {
> > + err = erofs_read_inode_from_disk(&inode);
> > + if (err) {
> > + erofs_err("read inode failed @ nid %llu", inode.nid | 0ULL);
> > + return;
> > + }
> > + }
> > +
> > + if (!S_ISREG(inode.i_mode)) {
>
> I think we could dump raw directory content too.
>
>
> > + erofs_err("not a regular file @ nid %llu", inode.nid | 0ULL);
> > + return;
> > + }
> > +
> > + buffer_size = erofs_blksiz(inode.sbi);
> > + buffer_ptr = malloc(buffer_size);
> > + if (!buffer_ptr) {
> > + erofs_err("buffer allocation failed @ nid %llu", inode.nid | 0ULL);
> > + return;
> > + }
> > +
> > + pending_size = inode.i_size;
> > + read_offset = 0;
> > + while (pending_size > 0) {
> > + read_size = pending_size > buffer_size? buffer_size: pending_size;
> > + err = erofs_pread(&inode, buffer_ptr, read_size, read_offset);
> > + if (err) {
> > + erofs_err("read file failed @ nid %llu", inode.nid | 0ULL);
> > + goto out;
> > + }
> > + pending_size -= read_size;
> > + read_offset += read_size;
> > + fwrite(buffer_ptr, read_size, 1, stdout);
> > + }
> > + fflush(stdout);
> > +
> > +out:
> > + free(buffer_ptr);
> > +}
> > +
> > +
> > +
>
> Reduntant new lines..
>
> Thanks,
> Gao Xiang
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH] erofs-utils: dump: Add --cat flag to show file contents
2025-01-09 10:49 ` Juan Hernández
@ 2025-01-09 10:56 ` Juan Hernandez
2025-01-09 12:56 ` Gao Xiang via Linux-erofs
0 siblings, 1 reply; 5+ messages in thread
From: Juan Hernandez @ 2025-01-09 10:56 UTC (permalink / raw)
To: linux-erofs
This patch adds a new '--cat' flag to the 'dump.erofs' command. When
used it will write to the standard output the content of the file
indicated by the '--path' or '--nid' options. For example, if there is a
'/mydir/myfile.txt' file containg the text 'mytext':
$ dump.erofs --cat --path=/mydir/myfile.txt myimage.erofs
mytext
Signed-off-by: Juan Hernandez <jhernand@redhat.com>
---
dump/main.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++
man/dump.erofs.1 | 13 ++++++++--
2 files changed, 76 insertions(+), 2 deletions(-)
diff --git a/dump/main.c b/dump/main.c
index 372162e..860ee5a 100644
--- a/dump/main.c
+++ b/dump/main.c
@@ -26,6 +26,7 @@ struct erofsdump_cfg {
bool show_superblock;
bool show_statistics;
bool show_subdirectories;
+ bool show_file_content;
erofs_nid_t nid;
const char *inode_path;
};
@@ -80,6 +81,7 @@ static struct option long_options[] = {
{"path", required_argument, NULL, 4},
{"ls", no_argument, NULL, 5},
{"offset", required_argument, NULL, 6},
+ {"cat", no_argument, NULL, 7},
{0, 0, 0, 0},
};
@@ -123,6 +125,7 @@ static void usage(int argc, char **argv)
" -s show information about superblock\n"
" --device=X specify an extra device to be used together\n"
" --ls show directory contents (INODE required)\n"
+ " --cat show file contents (INODE required)\n"
" --nid=# show the target inode info of nid #\n"
" --offset=# skip # bytes at the beginning of IMAGE\n"
" --path=X show the target inode info of path X\n",
@@ -186,6 +189,9 @@ static int erofsdump_parse_options_cfg(int argc, char **argv)
return -EINVAL;
}
break;
+ case 7:
+ dumpcfg.show_file_content = true;
+ break;
default:
return -EINVAL;
}
@@ -672,6 +678,56 @@ static void erofsdump_show_superblock(void)
uuid_str);
}
+static void erofsdump_show_file_content(void)
+{
+ int err;
+ struct erofs_inode inode = { .sbi = &g_sbi, .nid = dumpcfg.nid };
+ size_t buffer_size;
+ char *buffer_ptr;
+ erofs_off_t pending_size;
+ erofs_off_t read_offset;
+ erofs_off_t read_size;
+
+ if (dumpcfg.inode_path) {
+ err = erofs_ilookup(dumpcfg.inode_path, &inode);
+ if (err) {
+ erofs_err("read inode failed @ %s", dumpcfg.inode_path);
+ return;
+ }
+ } else {
+ err = erofs_read_inode_from_disk(&inode);
+ if (err) {
+ erofs_err("read inode failed @ nid %llu", inode.nid | 0ULL);
+ return;
+ }
+ }
+
+ buffer_size = erofs_blksiz(inode.sbi);
+ buffer_ptr = malloc(buffer_size);
+ if (!buffer_ptr) {
+ erofs_err("buffer allocation failed @ nid %llu", inode.nid | 0ULL);
+ return;
+ }
+
+ pending_size = inode.i_size;
+ read_offset = 0;
+ while (pending_size > 0) {
+ read_size = pending_size > buffer_size? buffer_size: pending_size;
+ err = erofs_pread(&inode, buffer_ptr, read_size, read_offset);
+ if (err) {
+ erofs_err("read file failed @ nid %llu", inode.nid | 0ULL);
+ goto out;
+ }
+ pending_size -= read_size;
+ read_offset += read_size;
+ fwrite(buffer_ptr, read_size, 1, stdout);
+ }
+ fflush(stdout);
+
+out:
+ free(buffer_ptr);
+}
+
int main(int argc, char **argv)
{
int err;
@@ -696,6 +752,15 @@ int main(int argc, char **argv)
goto exit_dev_close;
}
+ if (dumpcfg.show_file_content) {
+ if (dumpcfg.show_superblock || dumpcfg.show_statistics || dumpcfg.show_subdirectories) {
+ fprintf(stderr, "The '--cat' flag is incompatible with '-S', '-e', '-s' and '--ls'.\n");
+ goto exit_dev_close;
+ }
+ erofsdump_show_file_content();
+ goto exit_dev_close;
+ }
+
if (!dumpcfg.totalshow) {
dumpcfg.show_superblock = true;
dumpcfg.totalshow = 1;
diff --git a/man/dump.erofs.1 b/man/dump.erofs.1
index 6237ead..ec823ec 100644
--- a/man/dump.erofs.1
+++ b/man/dump.erofs.1
@@ -8,7 +8,7 @@ or overall disk statistics information from an EROFS-formatted image.
\fBdump.erofs\fR [\fIOPTIONS\fR] \fIIMAGE\fR
.SH DESCRIPTION
.B dump.erofs
-is used to retrieve erofs metadata from \fIIMAGE\fP and demonstrate
+is used to retrieve erofs metadata and data from \fIIMAGE\fP and demonstrate
.br
1) overall disk statistics,
.br
@@ -16,7 +16,9 @@ is used to retrieve erofs metadata from \fIIMAGE\fP and demonstrate
.br
3) file information of the given inode NID,
.br
-4) file extent information of the given inode NID.
+4) file extent information of the given inode NID,
+.br
+5) file content for the given inode NID.
.SH OPTIONS
.TP
.BI "\-\-device=" path
@@ -32,6 +34,13 @@ or
.I path
required.
.TP
+.BI "\-\-cat"
+Write file content to standard output.
+.I NID
+or
+.I path
+required.
+.TP
.BI "\-\-nid=" NID
Specify an inode NID in order to print its file information.
.TP
--
2.47.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] erofs-utils: dump: Add --cat flag to show file contents
2025-01-09 10:56 ` Juan Hernandez
@ 2025-01-09 12:56 ` Gao Xiang via Linux-erofs
0 siblings, 0 replies; 5+ messages in thread
From: Gao Xiang via Linux-erofs @ 2025-01-09 12:56 UTC (permalink / raw)
To: Juan Hernandez; +Cc: linux-erofs
On Thu, Jan 09, 2025 at 11:56:11AM +0100, Juan Hernandez wrote:
> This patch adds a new '--cat' flag to the 'dump.erofs' command. When
> used it will write to the standard output the content of the file
> indicated by the '--path' or '--nid' options. For example, if there is a
> '/mydir/myfile.txt' file containg the text 'mytext':
>
> $ dump.erofs --cat --path=/mydir/myfile.txt myimage.erofs
> mytext
>
> Signed-off-by: Juan Hernandez <jhernand@redhat.com>
Thanks! Applied now for testing.
Thanks,
Gao Xiang
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-01-09 12:56 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-09 9:55 [PATCH] erofs-utils: dump: Add --cat flag to show file contents Juan Hernandez
2025-01-09 10:37 ` Gao Xiang
2025-01-09 10:49 ` Juan Hernández
2025-01-09 10:56 ` Juan Hernandez
2025-01-09 12:56 ` Gao Xiang via Linux-erofs
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.