diff options
Diffstat (limited to 'applypatch/applypatch.c')
-rw-r--r-- | applypatch/applypatch.c | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/applypatch/applypatch.c b/applypatch/applypatch.c index 2358d4292..bc45e3c45 100644 --- a/applypatch/applypatch.c +++ b/applypatch/applypatch.c @@ -28,6 +28,7 @@ #include "mincrypt/sha.h" #include "applypatch.h" +#include "bmlutils/bmlutils.h" #include "mtdutils/mtdutils.h" #include "edify/expr.h" @@ -55,7 +56,8 @@ int LoadFileContents(const char* filename, FileContents* file) { // A special 'filename' beginning with "MTD:" or "EMMC:" means to // load the contents of a partition. if (strncmp(filename, "MTD:", 4) == 0 || - strncmp(filename, "EMMC:", 5) == 0) { + strncmp(filename, "EMMC:", 5) == 0 || + strncmp(filename, "BML:", 4) == 0) { return LoadPartitionContents(filename, file); } @@ -131,6 +133,8 @@ static int LoadPartitionContents(const char* filename, FileContents* file) { type = MTD; } else if (strcmp(magic, "EMMC") == 0) { type = EMMC; + } else if (strcmp(magic, "BML") == 0) { + type = EMMC; } else { printf("LoadPartitionContents called with bad filename (%s)\n", filename); @@ -138,6 +142,14 @@ static int LoadPartitionContents(const char* filename, FileContents* file) { } const char* partition = strtok(NULL, ":"); + if (strcmp(magic, "BML") == 0) { + if (strcmp(partition, "boot") == 0) { + partition = BOARD_BML_BOOT; + } else if (strcmp(partition, "recovery") == 0) { + partition = BOARD_BML_RECOVERY; + } + } + int i; int colons = 0; for (i = 0; filename[i] != '\0'; ++i) { @@ -358,12 +370,31 @@ int WriteToPartition(unsigned char* data, size_t len, type = MTD; } else if (strcmp(magic, "EMMC") == 0) { type = EMMC; + } else if (strcmp(magic, "BML") == 0) { + type = EMMC; } else { printf("WriteToPartition called with bad target (%s)\n", target); return -1; } const char* partition = strtok(NULL, ":"); + if (strcmp(magic, "BML") == 0) { + if (strcmp(partition, "boot") == 0) { + partition = BOARD_BML_BOOT; + } else if (strcmp(partition, "recovery") == 0) { + partition = BOARD_BML_RECOVERY; + } + + int bmlpartition = open(partition, O_RDWR | O_LARGEFILE); + if (bmlpartition < 0) + return -1; + if (ioctl(bmlpartition, BML_UNLOCK_ALL, 0)) { + printf("failed to unlock BML partition: (%s)\n", partition); + return -1; + } + close(bmlpartition); + } + if (partition == NULL) { printf("bad partition target name \"%s\"\n", target); return -1; @@ -838,7 +869,8 @@ static int GenerateTarget(FileContents* source_file, // file? if (strncmp(target_filename, "MTD:", 4) == 0 || - strncmp(target_filename, "EMMC:", 5) == 0) { + strncmp(target_filename, "EMMC:", 5) == 0 || + strncmp(target_filename, "BML:", 4) == 0) { // If the target is a partition, we're actually going to // write the output to /tmp and then copy it to the // partition. statfs() always returns 0 blocks free for @@ -880,7 +912,8 @@ static int GenerateTarget(FileContents* source_file, // location. if (strncmp(source_filename, "MTD:", 4) == 0 || - strncmp(source_filename, "EMMC:", 5) == 0) { + strncmp(source_filename, "EMMC:", 5) == 0 || + strncmp(source_filename, "BML:", 4) == 0) { // It's impossible to free space on the target filesystem by // deleting the source if the source is a partition. If // we're ever in a state where we need to do this, fail. @@ -925,7 +958,8 @@ static int GenerateTarget(FileContents* source_file, output = -1; outname = NULL; if (strncmp(target_filename, "MTD:", 4) == 0 || - strncmp(target_filename, "EMMC:", 5) == 0) { + strncmp(target_filename, "EMMC:", 5) == 0 || + strncmp(target_filename, "BML:", 4) == 0) { // We store the decoded output in memory. msi.buffer = malloc(target_size); if (msi.buffer == NULL) { |