applypatch: add support for BML partitions
This actually uses the EMMC partition access code. In order for this to work, the BML partition name is changed back to the block device name (e.g. "boot" -> "/dev/block/bml9"), and the BML_UNLOCK_ALL ioctl is called before writing. Change-Id: I012f1eca0b486b7465ca38b5db1f513ee8a246ea
This commit is contained in:
+38
-4
@@ -27,6 +27,7 @@
|
||||
|
||||
#include "mincrypt/sha.h"
|
||||
#include "applypatch.h"
|
||||
#include "bmlutils/bmlutils.h"
|
||||
#include "mtdutils/mtdutils.h"
|
||||
#include "edify/expr.h"
|
||||
|
||||
@@ -57,7 +58,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);
|
||||
}
|
||||
|
||||
@@ -147,6 +149,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);
|
||||
@@ -154,6 +158,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) {
|
||||
@@ -368,12 +380,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;
|
||||
@@ -845,7 +876,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
|
||||
@@ -887,7 +919,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.
|
||||
@@ -932,7 +965,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) {
|
||||
|
||||
Reference in New Issue
Block a user