diff options
-rw-r--r-- | futility/updater_archive.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/futility/updater_archive.c b/futility/updater_archive.c index 1d916db6..65b448d9 100644 --- a/futility/updater_archive.c +++ b/futility/updater_archive.c @@ -821,6 +821,48 @@ static int manifest_scan_entries(const char *name, void *arg) return !manifest_add_model(manifest, &model); } +/* + * A callback function for manifest to scan files in raw /firmware archive. + * Returns 0 to keep scanning, or non-zero to stop. + */ +static int manifest_scan_raw_entries(const char *name, void *arg) +{ + struct manifest *manifest = (struct manifest *)arg; + struct archive *archive = manifest->archive; + struct model_config model = {0}; + char *ec_name = NULL, *zephyr_name = NULL; + int chars_read = 0; + + /* + * /build/$BOARD/firmware (or CPFE firmware archives) layout: + * - image-${MODEL}{,.serial,.dev...}.bin + * - ${MODEL}/ec.bin or ${MODEL}/zephyr.bin + */ + + if (sscanf(name, "image-%m[^.].bin%n", &model.name, &chars_read) != 1) + return 0; + + /* Ignore the names with extra modifiers like image-$MODEL.serial.bin */ + if (!chars_read || name[chars_read]) { + free(model.name); + return 0; + } + + VB2_DEBUG("Found model <%s>: %s\n", model.name, name); + model.image = strdup(name); + + ASPRINTF(&ec_name, "%s/ec.bin", model.name); + ASPRINTF(&zephyr_name, "%s/zephyr.bin", model.name); + if (archive_has_entry(archive, ec_name)) + model.ec_image = strdup(ec_name); + else if (archive_has_entry(archive, zephyr_name)) + model.ec_image = strdup(zephyr_name); + free(ec_name); + free(zephyr_name); + + return !manifest_add_model(manifest, &model); +} + /** * get_manifest_key() - Wrapper to get the firmware manifest key from crosid * @@ -1009,6 +1051,9 @@ struct manifest *new_manifest_from_archive(struct archive *archive) manifest.archive = archive; manifest.default_model = -1; archive_walk(archive, &manifest, manifest_scan_entries); + if (manifest.num == 0) + archive_walk(archive, &manifest, manifest_scan_raw_entries); + if (manifest.num == 0) { const char *image_name = NULL; struct firmware_image image = {0}; |