From 841662c37f1c12887a2be25abba25bffd390d759 Mon Sep 17 00:00:00 2001
From: Andreas Loibl <andreas@andreas-loibl.de>
Date: Tue, 6 May 2014 23:40:51 +0200
Subject: added /boot/efi detection for hdmap

---
 backend/modules/hdmap      | 36 ++++++++++++++++++++++++++++++++++--
 backend/modules/partitions | 18 ++++++++++++++++++
 2 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/backend/modules/hdmap b/backend/modules/hdmap
index ec7af08..09e2b91 100644
--- a/backend/modules/hdmap
+++ b/backend/modules/hdmap
@@ -326,10 +326,42 @@ function fill_hdmap()
 	hdmap_set "$(
         (
                 echo "$cfg_hdmap"
-		root_disk="$(get_disk "$(hdmap_get device of mountpoint /)")"
+                root_disk="$(get_disk "$(hdmap_get device of mountpoint /)")"
+                efi_part="$(hdmap_get device of mountpoint /boot/efi)"
+                for part in $(list_efi_partitions | grep "$root_disk"; list_efi_partitions | grep -v "$root_disk")
+                do
+                        # prefer EFI partition on root disk
+                        if [ -z "$efi_part" ]; then
+                                # preselect the first of the EFI partitions found
+                                echo "$part:/boot/efi::auto"
+                                efi_part="$part"
+                        else
+                                # list other possible EFI partitions in hdmap but don't select them
+                                echo "$part:::"
+                        fi
+                done
                 for part in $(list_partitions -usage filesystem)
                 do
-                        if is_removeable "$part" && [ "$(get_disk "$part")" != "$root_disk" ]; then
+                        disk="$(get_disk "$part")"
+                        if [ -z "$efi_part" ] && [ "$disk" = "$root_disk" ] && \
+                           [ "$(get_filesystem_type $part)" = "DOS" ]; then
+                                case "$(blkid -p -s PTTYPE -o value "$disk")" in
+                                gpt)
+                                        efi_part="$part"
+                                        ;;
+                                dos)
+                                        # only primary MSDOS partitions can be EFI partitions
+                                        partnr="${part/$disk}"
+                                        partnr="${partnr//[^0-9]}"
+                                        [ -n "$partnr" -a "$partnr" -ge 1 -a "$partnr" -le 4 ] && efi_part="$part"
+                                        ;;
+                                esac
+                                if [ "$efi_part" ]; then
+                                        echo "$efi_part:/boot/efi::auto"
+                                        continue
+                                fi
+                        fi
+                        if is_removeable "$part" && [ "$disk" != "$root_disk" ]; then
                                 echo "$part:::"
                         else
                                 echo "$part:/media/$(basename "$part")::auto"
diff --git a/backend/modules/partitions b/backend/modules/partitions
index b586d17..9af0b96 100644
--- a/backend/modules/partitions
+++ b/backend/modules/partitions
@@ -169,6 +169,24 @@ function list_linux_partitions()
     ) | sort -u
 }
 
+# Synopsis: list_efi_partitions
+#
+# This function lists all partitions from the disks (by list_all_disks) which have partition Id 0xef (= EFI) and DOS filesystem
+# Output example:
+#   /dev/sda1
+#   /dev/sdb1
+function list_linux_partitions()
+{
+    for part in $(list_all_partitions)
+    do
+        case "$(blkid -p -s PART_ENTRY_TYPE -o value "$part")" in
+            0xef|c12a7328-f81f-11d2-ba4b-00a0c93ec93b)
+                [ "$(get_filesystem_type $part)" = "DOS" ] && echo "$part"
+                ;;
+        esac
+    done
+}
+
 # Synopsis: list_swap_partitions
 #
 # This function lists all partitions or lvm from the disks (by list_all_disks) which have partition Id 0x82 (= Linux swap)
-- 
cgit v1.0