Skip to content

Commit

Permalink
erofs-utils: dump: Add --cat flag to show file contents
Browse files Browse the repository at this point in the history
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 <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Gao Xiang <[email protected]>
  • Loading branch information
jhernand authored and hsiangkao committed Jan 9, 2025
1 parent 3bd00bf commit b526c0d
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 2 deletions.
65 changes: 65 additions & 0 deletions dump/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
Expand Down Expand Up @@ -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},
};

Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down
13 changes: 11 additions & 2 deletions man/dump.erofs.1
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,17 @@ 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
2) superblock information,
.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
Expand All @@ -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
Expand Down

0 comments on commit b526c0d

Please sign in to comment.