summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--futility/updater_archive.c45
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};