From: Juan Hernandez <jhernand@redhat.com>
To: linux-erofs@lists.ozlabs.org
Cc: Juan Hernandez <jhernand@redhat.com>
Subject: [PATCH] erofs-utils: dump: Add --cat flag to show file contents
Date: Thu, 9 Jan 2025 10:55:26 +0100 [thread overview]
Message-ID: <20250109095526.71911-1-jhernand@redhat.com> (raw)
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
next reply other threads:[~2025-01-09 9:56 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-09 9:55 Juan Hernandez [this message]
2025-01-09 10:37 ` [PATCH] erofs-utils: dump: Add --cat flag to show file contents 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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250109095526.71911-1-jhernand@redhat.com \
--to=jhernand@redhat.com \
--cc=linux-erofs@lists.ozlabs.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.