Loading fastboot/fastboot.cpp +46 −16 Original line number Diff line number Diff line Loading @@ -111,12 +111,13 @@ static struct { const char* img_name; const char* sig_name; const char* part_name; bool is_optional; bool is_secondary; bool optional_if_no_image; bool optional_if_no_partition; bool IsSecondary() const { return nickname == nullptr; } } images[] = { // clang-format off { "boot", "boot.img", "boot.sig", "boot", false, false }, { nullptr, "boot_other.img", "boot.sig", "boot", true, true }, { nullptr, "boot_other.img", "boot.sig", "boot", true, false }, { "dtbo", "dtbo.img", "dtbo.sig", "dtbo", true, false }, { "dts", "dt.img", "dt.sig", "dts", true, false }, { "odm", "odm.img", "odm.sig", "odm", true, false }, Loading @@ -125,14 +126,14 @@ static struct { "product-services.img", "product-services.sig", "product-services", true, false }, true, true }, { "recovery", "recovery.img", "recovery.sig", "recovery", true, false }, { "super", "super.img", "super.sig", "super", true, false }, { "system", "system.img", "system.sig", "system", false, false }, { nullptr, "system_other.img", "system.sig", "system", true, true }, { "super", "super.img", "super.sig", "super", true, true }, { "system", "system.img", "system.sig", "system", false, true }, { nullptr, "system_other.img", "system.sig", "system", true, false }, { "vbmeta", "vbmeta.img", "vbmeta.sig", "vbmeta", true, false }, { "vendor", "vendor.img", "vendor.sig", "vendor", true, false }, { nullptr, "vendor_other.img", "vendor.sig", "vendor", true, true }, { "vendor", "vendor.img", "vendor.sig", "vendor", true, true }, { nullptr, "vendor_other.img", "vendor.sig", "vendor", true, false }, // clang-format on }; Loading Loading @@ -637,7 +638,8 @@ static void check_requirement(char* line) { // "require partition-exists=x" is a special case, added because of the trouble we had when // Pixel 2 shipped with new partitions and users used old versions of fastboot to flash them, // missing out new partitions. A device with new partitions can use "partition-exists" to // override the `is_optional` field in the `images` array. // override the fields `optional_if_no_image` and 'optional_if_no_partition' in the `images` // array. if (!strcmp(name, "partition-exists")) { const char* partition_name = val[0]; std::string has_slot; Loading @@ -648,7 +650,8 @@ static void check_requirement(char* line) { bool known_partition = false; for (size_t i = 0; i < arraysize(images); ++i) { if (images[i].nickname && !strcmp(images[i].nickname, partition_name)) { images[i].is_optional = false; images[i].optional_if_no_image = false; images[i].optional_if_no_partition = false; known_partition = true; } } Loading Loading @@ -1041,6 +1044,25 @@ static void set_active(const std::string& slot_override) { } } static bool if_partition_exists(const std::string& partition, const std::string& slot) { std::string has_slot; std::string partition_name = partition; if (fb_getvar("has-slot:" + partition, &has_slot) && has_slot == "yes") { if (slot == "") { std::string current_slot = get_current_slot(); if (current_slot == "") { die("Failed to identify current slot"); } partition_name += "_" + current_slot; } else { partition_name += "_" + slot; } } std::string partition_size; return fb_getvar("partition-size:" + partition_name, &partition_size); } static void do_update(const char* filename, const std::string& slot_override, bool skip_secondary) { queue_info_dump(); Loading Loading @@ -1076,7 +1098,7 @@ static void do_update(const char* filename, const std::string& slot_override, bo } for (size_t i = 0; i < arraysize(images); ++i) { const char* slot = slot_override.c_str(); if (images[i].is_secondary) { if (images[i].IsSecondary()) { if (!skip_secondary) { slot = secondary.c_str(); } else { Loading @@ -1086,12 +1108,17 @@ static void do_update(const char* filename, const std::string& slot_override, bo int fd = unzip_to_file(zip, images[i].img_name); if (fd == -1) { if (images[i].is_optional) { if (images[i].optional_if_no_image) { continue; // An optional file is missing, so ignore it. } die("non-optional file %s missing", images[i].img_name); } if (images[i].optional_if_no_partition && !if_partition_exists(images[i].part_name, slot)) { continue; } fastboot_buffer buf; if (!load_buf_fd(fd, &buf)) { die("cannot load %s from flash: %s", images[i].img_name, strerror(errno)); Loading Loading @@ -1163,7 +1190,7 @@ static void do_flashall(const std::string& slot_override, bool skip_secondary) { for (size_t i = 0; i < arraysize(images); i++) { const char* slot = NULL; if (images[i].is_secondary) { if (images[i].IsSecondary()) { if (!skip_secondary) slot = secondary.c_str(); } else { slot = slot_override.c_str(); Loading @@ -1172,10 +1199,13 @@ static void do_flashall(const std::string& slot_override, bool skip_secondary) { fname = find_item_given_name(images[i].img_name); fastboot_buffer buf; if (!load_buf(fname.c_str(), &buf)) { if (images[i].is_optional) continue; if (images[i].optional_if_no_image) continue; die("could not load '%s': %s", images[i].img_name, strerror(errno)); } if (images[i].optional_if_no_partition && !if_partition_exists(images[i].part_name, slot)) { continue; } auto flashall = [&](const std::string &partition) { do_send_signature(fname.c_str()); flash_buf(partition.c_str(), &buf); Loading Loading
fastboot/fastboot.cpp +46 −16 Original line number Diff line number Diff line Loading @@ -111,12 +111,13 @@ static struct { const char* img_name; const char* sig_name; const char* part_name; bool is_optional; bool is_secondary; bool optional_if_no_image; bool optional_if_no_partition; bool IsSecondary() const { return nickname == nullptr; } } images[] = { // clang-format off { "boot", "boot.img", "boot.sig", "boot", false, false }, { nullptr, "boot_other.img", "boot.sig", "boot", true, true }, { nullptr, "boot_other.img", "boot.sig", "boot", true, false }, { "dtbo", "dtbo.img", "dtbo.sig", "dtbo", true, false }, { "dts", "dt.img", "dt.sig", "dts", true, false }, { "odm", "odm.img", "odm.sig", "odm", true, false }, Loading @@ -125,14 +126,14 @@ static struct { "product-services.img", "product-services.sig", "product-services", true, false }, true, true }, { "recovery", "recovery.img", "recovery.sig", "recovery", true, false }, { "super", "super.img", "super.sig", "super", true, false }, { "system", "system.img", "system.sig", "system", false, false }, { nullptr, "system_other.img", "system.sig", "system", true, true }, { "super", "super.img", "super.sig", "super", true, true }, { "system", "system.img", "system.sig", "system", false, true }, { nullptr, "system_other.img", "system.sig", "system", true, false }, { "vbmeta", "vbmeta.img", "vbmeta.sig", "vbmeta", true, false }, { "vendor", "vendor.img", "vendor.sig", "vendor", true, false }, { nullptr, "vendor_other.img", "vendor.sig", "vendor", true, true }, { "vendor", "vendor.img", "vendor.sig", "vendor", true, true }, { nullptr, "vendor_other.img", "vendor.sig", "vendor", true, false }, // clang-format on }; Loading Loading @@ -637,7 +638,8 @@ static void check_requirement(char* line) { // "require partition-exists=x" is a special case, added because of the trouble we had when // Pixel 2 shipped with new partitions and users used old versions of fastboot to flash them, // missing out new partitions. A device with new partitions can use "partition-exists" to // override the `is_optional` field in the `images` array. // override the fields `optional_if_no_image` and 'optional_if_no_partition' in the `images` // array. if (!strcmp(name, "partition-exists")) { const char* partition_name = val[0]; std::string has_slot; Loading @@ -648,7 +650,8 @@ static void check_requirement(char* line) { bool known_partition = false; for (size_t i = 0; i < arraysize(images); ++i) { if (images[i].nickname && !strcmp(images[i].nickname, partition_name)) { images[i].is_optional = false; images[i].optional_if_no_image = false; images[i].optional_if_no_partition = false; known_partition = true; } } Loading Loading @@ -1041,6 +1044,25 @@ static void set_active(const std::string& slot_override) { } } static bool if_partition_exists(const std::string& partition, const std::string& slot) { std::string has_slot; std::string partition_name = partition; if (fb_getvar("has-slot:" + partition, &has_slot) && has_slot == "yes") { if (slot == "") { std::string current_slot = get_current_slot(); if (current_slot == "") { die("Failed to identify current slot"); } partition_name += "_" + current_slot; } else { partition_name += "_" + slot; } } std::string partition_size; return fb_getvar("partition-size:" + partition_name, &partition_size); } static void do_update(const char* filename, const std::string& slot_override, bool skip_secondary) { queue_info_dump(); Loading Loading @@ -1076,7 +1098,7 @@ static void do_update(const char* filename, const std::string& slot_override, bo } for (size_t i = 0; i < arraysize(images); ++i) { const char* slot = slot_override.c_str(); if (images[i].is_secondary) { if (images[i].IsSecondary()) { if (!skip_secondary) { slot = secondary.c_str(); } else { Loading @@ -1086,12 +1108,17 @@ static void do_update(const char* filename, const std::string& slot_override, bo int fd = unzip_to_file(zip, images[i].img_name); if (fd == -1) { if (images[i].is_optional) { if (images[i].optional_if_no_image) { continue; // An optional file is missing, so ignore it. } die("non-optional file %s missing", images[i].img_name); } if (images[i].optional_if_no_partition && !if_partition_exists(images[i].part_name, slot)) { continue; } fastboot_buffer buf; if (!load_buf_fd(fd, &buf)) { die("cannot load %s from flash: %s", images[i].img_name, strerror(errno)); Loading Loading @@ -1163,7 +1190,7 @@ static void do_flashall(const std::string& slot_override, bool skip_secondary) { for (size_t i = 0; i < arraysize(images); i++) { const char* slot = NULL; if (images[i].is_secondary) { if (images[i].IsSecondary()) { if (!skip_secondary) slot = secondary.c_str(); } else { slot = slot_override.c_str(); Loading @@ -1172,10 +1199,13 @@ static void do_flashall(const std::string& slot_override, bool skip_secondary) { fname = find_item_given_name(images[i].img_name); fastboot_buffer buf; if (!load_buf(fname.c_str(), &buf)) { if (images[i].is_optional) continue; if (images[i].optional_if_no_image) continue; die("could not load '%s': %s", images[i].img_name, strerror(errno)); } if (images[i].optional_if_no_partition && !if_partition_exists(images[i].part_name, slot)) { continue; } auto flashall = [&](const std::string &partition) { do_send_signature(fname.c_str()); flash_buf(partition.c_str(), &buf); Loading