summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Couzens2019-05-07 14:33:58 +0000
committerAlexander Couzens2023-09-19 18:01:06 +0000
commit9e211d2980fe556b70c7191a8c908916316ebc1a (patch)
tree85f2f56e41ff48ad2426c5cf60bb85a5893c7561
parent89875fc18b57e72ffcfbe716a6a3e2ae6c9ead5e (diff)
downloadfirmware-utils-9e211d2980fe556b70c7191a8c908916316ebc1a.tar.gz
mktplinkfw2: add support to extract bootloader images
tplinkfw2 images from TP-Link contains a bootloader image in most cases. -x will create a -bootloader.bin file. Signed-off-by: Alexander Couzens <lynxis@fe80.eu>
-rw-r--r--src/mktplinkfw2.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/mktplinkfw2.c b/src/mktplinkfw2.c
index f25355a..d51e9ca 100644
--- a/src/mktplinkfw2.c
+++ b/src/mktplinkfw2.c
@@ -207,7 +207,7 @@ static void usage(int status)
" -v <version> set firmware version to <version>\n"
" -y <version> set secondary version to <version>\n"
" -i <file> inspect given firmware file <file>\n"
-" -x extract kernel and rootfs while inspecting (requires -i)\n"
+" -x extract bootloader, kernel and rootfs while inspecting (requires -i)\n"
" -h show this screen\n"
);
@@ -507,6 +507,23 @@ static int inspect_fw(void)
printf("\n");
+ if (hdr->boot_len) {
+ filename = malloc(strlen(inspect_info.file_name) + 8);
+ sprintf(filename, "%s-bootloader", inspect_info.file_name);
+ printf("Extracting bootloader to \"%s\"...\n", filename);
+ fp = fopen(filename, "w");
+ if (fp) {
+ if (!fwrite(buf + sizeof(struct fw_header) + ntohl(hdr->boot_ofs),
+ ntohl(hdr->boot_len), 1, fp)) {
+ ERR("error in fwrite(): %s", strerror(errno));
+ }
+ fclose(fp);
+ } else {
+ ERR("error in fopen(): %s", strerror(errno));
+ }
+ free(filename);
+ }
+
filename = malloc(strlen(inspect_info.file_name) + 8);
sprintf(filename, "%s-kernel", inspect_info.file_name);
printf("Extracting kernel to \"%s\"...\n", filename);