diff options
-rw-r--r-- | bootloader.cpp | 206 | ||||
-rw-r--r-- | bootloader.h | 11 | ||||
-rw-r--r-- | common.h | 2 | ||||
-rw-r--r-- | twrp-functions.cpp | 11 | ||||
-rw-r--r-- | twrp.cpp | 6 |
5 files changed, 60 insertions, 176 deletions
diff --git a/bootloader.cpp b/bootloader.cpp index 856a7d2b4..d23d1e9cd 100644 --- a/bootloader.cpp +++ b/bootloader.cpp @@ -22,50 +22,81 @@ extern "C" { #include "mtdutils/mtdutils.h" } +/* #include "roots.h" - +*/ #include <errno.h> #include <stdio.h> #include <string.h> #include <sys/stat.h> #include <unistd.h> -static char device_type = 'e'; // e for emmc or m for mtd, default is emmc -static char device_name[256]; +// fake Volume struct that allows us to use the AOSP code easily +struct Volume +{ + char fs_type[8]; + char blk_device[256]; +}; + +static Volume misc; + +void set_misc_device(const char* type, const char* name) { + strlcpy(misc.fs_type, type, sizeof(misc.fs_type)); + if (strlen(name) >= sizeof(misc.blk_device)) { + LOGE("New device name of '%s' is too large for bootloader.cpp\n", name); + } else { + strcpy(misc.blk_device, name); + } +} -/* static int get_bootloader_message_mtd(struct bootloader_message *out, const Volume* v); static int set_bootloader_message_mtd(const struct bootloader_message *in, const Volume* v); static int get_bootloader_message_block(struct bootloader_message *out, const Volume* v); static int set_bootloader_message_block(const struct bootloader_message *in, const Volume* v); -*/ + int get_bootloader_message(struct bootloader_message *out) { - //volume_for_path("/misc"); - if (device_name[0] == 0) { +#if 0 + Volume* v = volume_for_path("/misc"); + if (v == NULL) { LOGE("Cannot load volume /misc!\n"); return -1; } - if (device_type == 'm') { - return get_bootloader_message_mtd_name(out); - } else if (device_type == 'e') { - return get_bootloader_message_block_name(out); +#else + Volume* v = &misc; + if (v->fs_type[0] == 0) { + LOGI("Not using /misc, not defined in fstab.\n"); + return -1; } - LOGE("unknown misc partition fs_type \"%c\"\n", device_type); +#endif + if (strcmp(v->fs_type, "mtd") == 0) { + return get_bootloader_message_mtd(out, v); + } else if (strcmp(v->fs_type, "emmc") == 0) { + return get_bootloader_message_block(out, v); + } + LOGE("unknown misc partition fs_type \"%s\"\n", v->fs_type); return -1; } int set_bootloader_message(const struct bootloader_message *in) { - //volume_for_path("/misc"); - if (device_name[0] == 0) { +#if 0 + Volume* v = volume_for_path("/misc"); + if (v == NULL) { LOGE("Cannot load volume /misc!\n"); return -1; } - if (device_type == 'm') { - return set_bootloader_message_mtd_name(in, device_name); - } else if (device_type == 'e') { - return set_bootloader_message_block_name(in, device_name); +#else + Volume* v = &misc; + if (v->fs_type[0] == 0) { + LOGI("Not using /misc, not defined in fstab.\n"); + return -1; } - LOGE("unknown misc partition type \"%c\"\n", device_type); +#endif + if (strcmp(v->fs_type, "mtd") == 0) { + return set_bootloader_message_mtd(in, v); + } else if (strcmp(v->fs_type, "emmc") == 0) { + return set_bootloader_message_block(in, v); + } + LOGE("unknown misc partition fs_type \"%s\"\n", v->fs_type); return -1; } @@ -75,7 +106,7 @@ int set_bootloader_message(const struct bootloader_message *in) { static const int MISC_PAGES = 3; // number of pages to save static const int MISC_COMMAND_PAGE = 1; // bootloader command is this page -/* + static int get_bootloader_message_mtd(struct bootloader_message *out, const Volume* v) { size_t write_size; @@ -145,89 +176,7 @@ static int set_bootloader_message_mtd(const struct bootloader_message *in, LOGI("Set boot command \"%s\"\n", in->command[0] != 255 ? in->command : ""); return 0; } -*/ - -void set_device_type(char new_type) { - device_type = new_type; -} - -void set_device_name(const char* new_name) { - if (strlen(new_name) >= sizeof(device_name)) { - LOGE("New device name of '%s' is too large for bootloader.cpp\n", new_name); - } else { - strcpy(device_name, new_name); - } -} -int get_bootloader_message_mtd_name(struct bootloader_message *out) { - size_t write_size; - mtd_scan_partitions(); - const MtdPartition *part = mtd_find_partition_by_name(device_name); - if (part == NULL || mtd_partition_info(part, NULL, NULL, &write_size)) { - LOGE("Can't find %s\n", device_name); - return -1; - } - - MtdReadContext *read = mtd_read_partition(part); - if (read == NULL) { - LOGE("Can't open %s\n(%s)\n", device_name, strerror(errno)); - return -1; - } - - const ssize_t size = write_size * MISC_PAGES; - char data[size]; - ssize_t r = mtd_read_data(read, data, size); - if (r != size) LOGE("Can't read %s\n(%s)\n", device_name, strerror(errno)); - mtd_read_close(read); - if (r != size) return -1; - - memcpy(out, &data[write_size * MISC_COMMAND_PAGE], sizeof(*out)); - return 0; -} - -int set_bootloader_message_mtd_name(const struct bootloader_message *in, - const char* mtd_name) { - size_t write_size; - mtd_scan_partitions(); - const MtdPartition *part = mtd_find_partition_by_name(mtd_name); - if (part == NULL || mtd_partition_info(part, NULL, NULL, &write_size)) { - printf("Can't find %s\n", mtd_name); - return -1; - } - - MtdReadContext *read = mtd_read_partition(part); - if (read == NULL) { - printf("Can't open %s\n(%s)\n", mtd_name, strerror(errno)); - return -1; - } - - ssize_t size = write_size * MISC_PAGES; - char data[size]; - ssize_t r = mtd_read_data(read, data, size); - if (r != size) printf("Can't read %s\n(%s)\n", mtd_name, strerror(errno)); - mtd_read_close(read); - if (r != size) return -1; - - memcpy(&data[write_size * MISC_COMMAND_PAGE], in, sizeof(*in)); - - MtdWriteContext *write = mtd_write_partition(part); - if (write == NULL) { - printf("Can't open %s\n(%s)\n", mtd_name, strerror(errno)); - return -1; - } - if (mtd_write_data(write, data, size) != size) { - printf("Can't write %s\n(%s)\n", mtd_name, strerror(errno)); - mtd_write_close(write); - return -1; - } - if (mtd_write_close(write)) { - printf("Can't finish %s\n(%s)\n", mtd_name, strerror(errno)); - return -1; - } - - printf("Set boot command \"%s\"\n", in->command[0] != 255 ? in->command : ""); - return 0; -} // ------------------------------------ // for misc partitions on block devices @@ -249,7 +198,7 @@ static void wait_for_device(const char* fn) { printf("failed to stat %s\n", fn); } } -/* + static int get_bootloader_message_block(struct bootloader_message *out, const Volume* v) { wait_for_device(v->blk_device); @@ -297,54 +246,7 @@ static int set_bootloader_message_block(const struct bootloader_message *in, } return 0; } -*/ - -int get_bootloader_message_block_name(struct bootloader_message *out) { - wait_for_device(device_name); - FILE* f = fopen(device_name, "rb"); - if (f == NULL) { - LOGE("Can't open %s\n(%s)\n", device_name, strerror(errno)); - return -1; - } -#ifdef BOARD_RECOVERY_BLDRMSG_OFFSET - fseek(f, BOARD_RECOVERY_BLDRMSG_OFFSET, SEEK_SET); -#endif - struct bootloader_message temp; - int count = fread(&temp, sizeof(temp), 1, f); - if (count != 1) { - LOGE("Failed reading %s\n(%s)\n", device_name, strerror(errno)); - return -1; - } - if (fclose(f) != 0) { - LOGE("Failed closing %s\n(%s)\n", device_name, strerror(errno)); - return -1; - } - memcpy(out, &temp, sizeof(temp)); - return 0; -} -int set_bootloader_message_block_name(const struct bootloader_message *in, - const char* block_name) { - wait_for_device(block_name); - FILE* f = fopen(block_name, "rb+"); - if (f == NULL) { - printf("Can't open %s\n(%s)\n", block_name, strerror(errno)); - return -1; - } -#ifdef BOARD_RECOVERY_BLDRMSG_OFFSET - fseek(f, BOARD_RECOVERY_BLDRMSG_OFFSET, SEEK_SET); -#endif - int count = fwrite(in, sizeof(*in), 1, f); - if (count != 1) { - printf("Failed writing %s\n(%s)\n", block_name, strerror(errno)); - return -1; - } - if (fclose(f) != 0) { - printf("Failed closing %s\n(%s)\n", block_name, strerror(errno)); - return -1; - } - return 0; -} static const char *COMMAND_FILE = "/cache/recovery/command"; static const int MAX_ARG_LENGTH = 4096; @@ -361,11 +263,11 @@ get_args(int *argc, char ***argv) { get_bootloader_message(&boot); // this may fail, leaving a zeroed structure if (boot.command[0] != 0 && boot.command[0] != 255) { - LOGI("Boot command: %.*s\n", sizeof(boot.command), boot.command); + LOGI("Boot command: %.*s\n", (int)sizeof(boot.command), boot.command); } if (boot.status[0] != 0 && boot.status[0] != 255) { - LOGI("Boot status: %.*s\n", sizeof(boot.status), boot.status); + LOGI("Boot status: %.*s\n", (int)sizeof(boot.status), boot.status); } // --- if arguments weren't supplied, look in the bootloader control block diff --git a/bootloader.h b/bootloader.h index 15e0a5c99..b9d70edaa 100644 --- a/bootloader.h +++ b/bootloader.h @@ -61,19 +61,10 @@ struct bootloader_message { /* Read and write the bootloader command from the "misc" partition. * These return zero on success. */ -/* int get_bootloader_message(struct bootloader_message *out); int set_bootloader_message(const struct bootloader_message *in); -*/ - -void set_device_type(char new_type); -void set_device_name(const char* new_name); - -int get_bootloader_message_mtd_name(struct bootloader_message *out); -int set_bootloader_message_mtd_name(const struct bootloader_message *in, const char* mtd_name); -int get_bootloader_message_block_name(struct bootloader_message *out); -int set_bootloader_message_block_name(const struct bootloader_message *in, const char* block_name); +void set_misc_device(const char* type, const char* name); void get_args(int *argc, char ***argv); #ifdef __cplusplus @@ -45,7 +45,7 @@ static long tmplog_offset = 0; #define STRINGIFY(x) #x #define EXPAND(x) STRINGIFY(x) -typedef struct fstab_rec Volume; +//typedef struct fstab_rec Volume; // fopen a file, mounting volumes and making parent dirs as necessary. FILE* fopen_path(const char *path, const char *mode); diff --git a/twrp-functions.cpp b/twrp-functions.cpp index b6f9c56fc..3bc879929 100644 --- a/twrp-functions.cpp +++ b/twrp-functions.cpp @@ -487,15 +487,8 @@ void TWFunc::Update_Log_File(void) { if (Part != NULL) { struct bootloader_message boot; memset(&boot, 0, sizeof(boot)); - if (Part->Current_File_System == "mtd") { - if (set_bootloader_message_mtd_name(&boot, Part->MTD_Name.c_str()) != 0) - LOGERR("Unable to set MTD bootloader message.\n"); - } else if (Part->Current_File_System == "emmc") { - if (set_bootloader_message_block_name(&boot, Part->Actual_Block_Device.c_str()) != 0) - LOGERR("Unable to set emmc bootloader message.\n"); - } else { - LOGERR("Unknown file system for /misc: '%s'\n", Part->Current_File_System.c_str()); - } + if (set_bootloader_message(&boot) != 0) + LOGERR("Unable to set bootloader message.\n"); } if (PartitionManager.Mount_By_Path("/cache", true)) { @@ -171,11 +171,9 @@ int main(int argc, char **argv) { TWPartition* misc = PartitionManager.Find_Partition_By_Path("/misc"); if (misc != NULL) { if (misc->Current_File_System == "emmc") { - set_device_type('e'); - set_device_name(misc->Actual_Block_Device.c_str()); + set_misc_device("emmc", misc->Actual_Block_Device.c_str()); } else if (misc->Current_File_System == "mtd") { - set_device_type('m'); - set_device_name(misc->MTD_Name.c_str()); + set_misc_device("mtd", misc->MTD_Name.c_str()); } else { LOGERR("Unknown file system for /misc\n"); } |