Instead of parsing all files in one go and checking the compatible, create a list and iterate over it to check the compatible. This is a preparation to not only account for the top-level barebox compatible, but to instead use the compatible score system to find the correct bootable device tree entry. Signed-off-by: Rouven Czerwinski <r.czerwinski@xxxxxxxxxxxxxx> --- common/blspec.c | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/common/blspec.c b/common/blspec.c index 158fd1e9a2..0ea857294f 100644 --- a/common/blspec.c +++ b/common/blspec.c @@ -520,6 +520,21 @@ static bool entry_is_match_machine_id(struct blspec_entry *entry) * * returns the number of entries found or a negative error value otherwise. */ + +struct blspec_list_entry { + struct list_head list; + struct blspec_entry *entry; + char *name; +}; + +static int compare(struct list_head *a, struct list_head *b) +{ + char *na = (char *)list_entry(a, struct blspec_list_entry, list)->name; + char *nb = (char *)list_entry(b, struct blspec_list_entry, list)->name; + + return strcmp(na, nb); +} + int blspec_scan_directory(struct bootentries *bootentries, const char *root) { struct blspec_entry *entry; @@ -529,6 +544,11 @@ int blspec_scan_directory(struct bootentries *bootentries, const char *root) int ret, found = 0; const char *dirname = "loader/entries"; char *nfspath = NULL; + struct list_head entry_list; + struct blspec_list_entry *lentry; + struct blspec_list_entry *temp; + + INIT_LIST_HEAD(&entry_list); nfspath = parse_nfs_url(root); if (!IS_ERR(nfspath)) @@ -549,7 +569,6 @@ int blspec_scan_directory(struct bootentries *bootentries, const char *root) char *configname; struct stat s; char *dot; - char *devname = NULL, *hwdevname = NULL; if (*d->d_name == '.') continue; @@ -593,13 +612,29 @@ int blspec_scan_directory(struct bootentries *bootentries, const char *root) entry->configpath = configname; entry->cdev = get_cdev_by_mountpath(root); + lentry = calloc(1, sizeof(*lentry)); + lentry->entry = entry; + lentry->name = d->d_name; + + list_add_sort(&entry_list, &lentry->list, compare); + } + + list_for_each_entry_safe(lentry, temp, &entry_list, list) { + char *devname = NULL, *hwdevname = NULL; + + entry = lentry->entry; + if (!entry_is_of_compatible(entry)) { blspec_entry_free(&entry->entry); + list_del(&lentry->list); + free(lentry); continue; } if (!entry_is_match_machine_id(entry)) { blspec_entry_free(&entry->entry); + list_del(&lentry->list); + free(lentry); continue; } @@ -612,7 +647,7 @@ int blspec_scan_directory(struct bootentries *bootentries, const char *root) } entry->entry.title = xasprintf("%s (%s)", blspec_entry_var_get(entry, "title"), - configname); + entry->configpath); entry->entry.description = basprintf("blspec entry, device: %s hwdevice: %s", devname ? devname : "none", hwdevname ? hwdevname : "none"); @@ -623,6 +658,8 @@ int blspec_scan_directory(struct bootentries *bootentries, const char *root) entry->entry.release = blspec_entry_free; bootentries_add_entry(bootentries, &entry->entry); + list_del(&lentry->list); + free(lentry); } ret = found; -- 2.35.1 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox