From abaefca1c0ddbcb7fb7fc5431211e6833ea1bd75 Mon Sep 17 00:00:00 2001
From: livio <livio@codeberg.org>
Date: Tue, 2 Apr 2024 23:22:04 +0200
Subject: [PATCH] Added ISOLINUX/SYSLINUX menulist from media detection

---
 config/grub/config/grub.cfg | 50 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 49 insertions(+), 1 deletion(-)

diff --git a/config/grub/config/grub.cfg b/config/grub/config/grub.cfg
index 0d7df997..364a4caf 100644
--- a/config/grub/config/grub.cfg
+++ b/config/grub/config/grub.cfg
@@ -123,6 +123,7 @@ function make_boot_menus {
 		test -e ${i}
 		if [ $? == 0 ]; then # Media exists so we search there
 			grub_create_menu ${i} # Look for grub entries in known directories
+			isolinux_create_menu ${i}
 		fi
 		echo -n "."
 	done
@@ -224,7 +225,54 @@ function search_grub {
 }
 
 # Default list of ISOLINUX possible directories. The @/... entries are for cases where the BTRFS filesystem is being used
-set isolinux_dirs="'' /boot /EFI /boot/EFI /@ /@/boot /@/boot/EFI /@/EFI"
+set isolinux_dirs="" # Complete list of every possible isolinux directory, automatically filled later
+set isolinux_dir_super="@" # Possible list of superdirectories (BTRFS can have those)
+set isolinux_dir="boot EFI" # First level directories list
+set isolinux_dir_sub="boot EFI" # Second level directories list
+
+for i in '' ${isolinux_dir_super}; do
+	isolinux_dirs="${isolinux_dirs} ${i}"
+	for j in ${isolinux_dir}; do
+		isolinux_dirs="${isolinux_dirs} ${i}/${j}"
+		for k in ${isolinux_dir_sub}; do
+			isolinux_dirs="${isolinux_dirs} ${i}/${j}/${k}"
+		done
+	done
+done
+
+# Creates a menuentry for ISOLINUX. First argument is menu text without spaces then root and configfile
+function isolinux_menuentry {
+	menuentry "Boot ISOLINUX from $1" ${1} ${2} ${3} {
+		set root="${2}"
+		syslinux_configfile -i ${3}
+	}
+}
+
+# Pretty same as above function
+function syslinux_menuentry {
+	menuentry "Boot SYSLINUX from $1" ${1} ${2} ${3} {
+		set root="${2}"
+		syslinux_configfile -s ${3}
+	}
+}
+
+function isolinux_create_menu {
+	set root="${1}"
+	for dir in ${isolinux_dirs}; do
+		# In order to save time, we do not attempt anything on non existing directory.
+		if [ -d /"${dir}"/ ]; then
+			if [ -f "${dir}"/isolinux/isolinux.cfg ]; then
+				isolinux_menuentry ${1} "${dir}"/isolinux/isolinux.cfg
+			elif [ -f "${dir}"/syslinux/syslinux.cfg ]; then
+				syslinux_menuentry ${1} "${dir}"/syslinux/syslinux.cfg
+			elif [ -f "${dir}"/syslinux/extlinux.conf ]; then
+				syslinux_menuentry ${1} "${dir}"/syslinux/extlinux.conf
+			elif [ -f "${dir}"/extlinux/extlinux.conf ]; then
+				syslinux_menuentry ${1} "${dir}"/extlinux/extlinux.conf
+			fi
+		fi
+	done
+}
 
 function try_isolinux_config {
 	set root="${1}"
-- 
GitLab