Revise dtb commands CLI

This commit is contained in:
topjohnwu 2019-09-20 03:53:58 -04:00
parent d81ccde569
commit 120668c7bc
3 changed files with 121 additions and 103 deletions

View File

@ -94,7 +94,7 @@ static void print_node(const void *fdt, int node = 0, int depth = 0) {
}
}
static int find_fstab(const void *fdt, int parent) {
static int find_fstab(const void *fdt, int parent = 0) {
int node, fstab;
fdt_for_each_subnode(node, fdt, parent) {
if (strcmp(fdt_get_name(fdt, node, nullptr), "fstab") == 0)
@ -106,7 +106,7 @@ static int find_fstab(const void *fdt, int parent) {
return -1;
}
static void dtb_dump(const char *file) {
static void dtb_print(const char *file, bool fstab) {
size_t size ;
uint8_t *dtb, *fdt;
fprintf(stderr, "Loading dtbs from [%s]\n", file);
@ -116,8 +116,17 @@ static void dtb_dump(const char *file) {
for (int i = 0; i < size; ++i) {
if (memcmp(dtb + i, DTB_MAGIC, 4) == 0) {
fdt = dtb + i;
fprintf(stderr, "Dumping dtb.%04d\n", dtb_num++);
print_node(fdt);
if (fstab) {
int node = find_fstab(fdt);
if (node >= 0) {
fprintf(stderr, "Found fstab in dtb.%04d\n", dtb_num);
print_node(fdt, node);
}
} else {
fprintf(stderr, "Printing dtb.%04d\n", dtb_num);
print_node(fdt);
}
dtb_num++;
}
}
fprintf(stderr, "\n");
@ -165,15 +174,20 @@ static void dtb_patch(const char *file, int patch) {
exit(!found);
}
int dtb_commands(const char *cmd, int argc, char *argv[]) {
if (argc == 0) return 1;
if (strcmp(cmd, "dump") == 0)
dtb_dump(argv[0]);
else if (strcmp(cmd, "patch") == 0)
dtb_patch(argv[0], 1);
else if (strcmp(cmd, "test") == 0)
dtb_patch(argv[0], 0);
int dtb_commands(int argc, char *argv[]) {
char *dtb = argv[0];
++argv;
--argc;
if (argv[0] == "print"sv) {
dtb_print(dtb, argc > 1 && argv[1] == "-f"sv);
} else if (argv[0] == "patch"sv) {
dtb_patch(dtb, 1);
} else if (argv[0] == "test"sv) {
dtb_patch(dtb, 0);
} else {
return 1;
}
return 0;
}

View File

@ -17,7 +17,7 @@ int unpack(const char *image, bool hdr = false);
void repack(const char* orig_image, const char* out_image, bool force_nocomp = false);
int hexpatch(const char *image, const char *from, const char *to);
int cpio_commands(int argc, char *argv[]);
int dtb_commands(const char *cmd, int argc, char *argv[]);
int dtb_commands(int argc, char *argv[]);
// Pattern
bool patch_verity(void **buf, uint32_t *size, bool patch = true);

View File

@ -16,94 +16,100 @@ using namespace std;
static void usage(char *arg0) {
fprintf(stderr,
FULL_VER(MagiskBoot) " - Boot Image Modification Tool\n"
"Usage: %s <action> [args...]\n"
"\n"
"Supported actions:\n"
" unpack [-h] <bootimg>\n"
" Unpack <bootimg> to, if available, kernel, kernel_dtb, ramdisk.cpio,\n"
" second, dtb, extra, and recovery_dtbo into current directory.\n"
" If '-h' is provided, it will dump header info to 'header',\n"
" which will be parsed when repacking.\n"
" Return values:\n"
" 0:valid 1:error 2:chromeos\n"
"\n"
" repack [-n] <origbootimg> [outbootimg]\n"
" Repack boot image components from current directory\n"
" to [outbootimg], or new-boot.img if not specified.\n"
" If '-n' is provided, it will not attempt to recompress ramdisk.cpio,\n"
" otherwise it will compress ramdisk.cpio and kernel with the same method\n"
" in <origbootimg> if the file provided is not already compressed.\n"
"\n"
" hexpatch <file> <hexpattern1> <hexpattern2>\n"
" Search <hexpattern1> in <file>, and replace with <hexpattern2>\n"
"\n"
" cpio <incpio> [commands...]\n"
" Do cpio commands to <incpio> (modifications are done directly)\n"
" Each command is a single argument, use quotes if necessary\n"
" Supported commands:\n"
" exists ENTRY\n"
" Return 0 if ENTRY exists, else return 1\n"
" rm [-r] ENTRY\n"
" Remove ENTRY, specify [-r] to remove recursively\n"
" mkdir MODE ENTRY\n"
" Create directory ENTRY in permissions MODE\n"
" ln TARGET ENTRY\n"
" Create a symlink to TARGET with the name ENTRY\n"
" mv SOURCE DEST\n"
" Move SOURCE to DEST\n"
" add MODE ENTRY INFILE\n"
" Add INFILE as ENTRY in permissions MODE; replaces ENTRY if exists\n"
" extract [ENTRY OUT]\n"
" Extract ENTRY to OUT, or extract all entries to current directory\n"
" test\n"
" Test the current cpio's patch status\n"
" Return values:\n"
" 0:stock 1:Magisk 2:unsupported (phh, SuperSU, Xposed)\n"
" patch KEEPVERITY KEEPFORCEENCRYPT\n"
" Ramdisk patches. KEEP**** are boolean values\n"
" backup ORIG\n"
" Create ramdisk backups from ORIG\n"
" restore\n"
" Restore ramdisk from ramdisk backup stored within incpio\n"
" sha1\n"
" Print stock boot SHA1 if previously backed up in ramdisk\n"
"\n"
" dtb-<cmd> <dtb>\n"
" Do dtb related cmds to <dtb> (modifications are done directly)\n"
" Supported commands:\n"
" dump\n"
" Dump all contents from dtb for debugging\n"
" test\n"
" Check if fstab has verity/avb flags\n"
" Return values:\n"
" 0:flag exists 1:no flags\n"
" patch\n"
" Search for fstab and remove verity/avb\n"
"\n"
" compress[=method] <infile> [outfile]\n"
" Compress <infile> with [method] (default: gzip), optionally to [outfile]\n"
" <infile>/[outfile] can be '-' to be STDIN/STDOUT\n"
" Supported methods: "
, arg0);
FULL_VER(MagiskBoot) R"EOF( - Boot Image Modification Tool
Usage: %s <action> [args...]
Supported actions:
unpack [-h] <bootimg>
Unpack <bootimg> to, if available, kernel, kernel_dtb, ramdisk.cpio,
second, dtb, extra, and recovery_dtbo into current directory.
If '-h' is provided, it will dump header info to 'header',
which will be parsed when repacking.
Return values:
0:valid 1:error 2:chromeos
repack [-n] <origbootimg> [outbootimg]
Repack boot image components from current directory
to [outbootimg], or new-boot.img if not specified.
If '-n' is provided, it will not attempt to recompress ramdisk.cpio,
otherwise it will compress ramdisk.cpio and kernel with the same method
in <origbootimg> if the file provided is not already compressed.
hexpatch <file> <hexpattern1> <hexpattern2>
Search <hexpattern1> in <file>, and replace with <hexpattern2>
cpio <incpio> [commands...]
Do cpio commands to <incpio> (modifications are done directly)
Each command is a single argument, add quotes for each command
Supported commands:
exists ENTRY
Return 0 if ENTRY exists, else return 1
rm [-r] ENTRY
Remove ENTRY, specify [-r] to remove recursively
mkdir MODE ENTRY
Create directory ENTRY in permissions MODE
ln TARGET ENTRY
Create a symlink to TARGET with the name ENTRY
mv SOURCE DEST
Move SOURCE to DEST
add MODE ENTRY INFILE
Add INFILE as ENTRY in permissions MODE; replaces ENTRY if exists
extract [ENTRY OUT]
Extract ENTRY to OUT, or extract all entries to current directory
test
Test the current cpio's patch status
Return values:
0:stock 1:Magisk 2:unsupported (phh, SuperSU, Xposed)
patch KEEPVERITY KEEPFORCEENCRYPT
Ramdisk patches. KEEP**** are boolean values
backup ORIG
Create ramdisk backups from ORIG
restore
Restore ramdisk from ramdisk backup stored within incpio
sha1
Print stock boot SHA1 if previously backed up in ramdisk
dtb <dtb> <command> [args...]
Do commands to <dtb> (modifications are done directly)
Supported commands:
print [-f]
Print all contents from dtb for debugging
Specify [-f] to only print fstab nodes
test
Check if fstab has verity/avb flags
Return values:
0:flag exists 1:no flags
patch
Search for fstab and remove verity/avb
compress[=method] <infile> [outfile]
Compress <infile> with [method] (default: gzip), optionally to [outfile]
<infile>/[outfile] can be '-' to be STDIN/STDOUT
Supported methods: )EOF", arg0);
for (auto &it : name2fmt)
fprintf(stderr, "%s ", it.first.data());
fprintf(stderr,
"\n\n"
" decompress <infile> [outfile]\n"
" Detect method and decompress <infile>, optionally to [outfile]\n"
" <infile>/[outfile] can be '-' to be STDIN/STDOUT\n"
" Supported methods: ");
fprintf(stderr, R"EOF(
decompress <infile> [outfile]
Detect method and decompress <infile>, optionally to [outfile]
<infile>/[outfile] can be '-' to be STDIN/STDOUT
Supported methods: )EOF");
for (auto &it : name2fmt)
fprintf(stderr, "%s ", it.first.data());
fprintf(stderr,
"\n\n"
" sha1 <file>\n"
" Print the SHA1 checksum for <file>\n"
"\n"
" cleanup\n"
" Cleanup the current working directory\n"
"\n");
fprintf(stderr, R"EOF(
sha1 <file>
Print the SHA1 checksum for <file>
cleanup
Cleanup the current working directory
)EOF");
exit(1);
}
@ -165,10 +171,8 @@ int main(int argc, char *argv[]) {
} else if (argc > 2 && action == "cpio"sv) {
if (cpio_commands(argc - 2, argv + 2))
usage(argv[0]);
} else if (argc > 2 && str_starts(action, "dtb")) {
if (action[3] != '-')
usage(argv[0]);
if (dtb_commands(&action[4], argc - 2, argv + 2))
} else if (argc > 2 && action == "dtb") {
if (dtb_commands(argc - 2, argv + 2))
usage(argv[0]);
} else {
usage(argv[0]);