56d25d
From 5a5b33da8239428245f3595848f10c0f184041b3 Mon Sep 17 00:00:00 2001
622d0f
From: Peter Jones <pjones@redhat.com>
622d0f
Date: Mon, 18 Nov 2013 14:44:13 -0500
56d25d
Subject: [PATCH 04/41] Honor "linux16" and "initrd16"
622d0f
622d0f
Resolves: rhbz#1031192
ae2804
Resolves: rhbz#1034743
622d0f
622d0f
Signed-off-by: Peter Jones <pjones@redhat.com>
622d0f
---
ae2804
 grubby.c                 | 63 ++++++++++++++++++++++---------
ae2804
 test.sh                  | 16 ++++++++
622d0f
 test/grub2.10            | 84 +++++++++++++++++++++++++++++++++++++++++
622d0f
 test/grub2.11            | 97 +++++++++++++++++++++++++++++++++++++++++++++++
622d0f
 test/results/add/g2-1.10 | 96 +++++++++++++++++++++++++++++++++++++++++++++++
622d0f
 test/results/add/g2-1.11 | 98 ++++++++++++++++++++++++++++++++++++++++++++++++
ae2804
 6 files changed, 437 insertions(+), 17 deletions(-)
622d0f
 create mode 100644 test/grub2.10
622d0f
 create mode 100644 test/grub2.11
622d0f
 create mode 100644 test/results/add/g2-1.10
622d0f
 create mode 100644 test/results/add/g2-1.11
622d0f
622d0f
diff --git a/grubby.c b/grubby.c
56d25d
index d91a847..aa228c3 100644
622d0f
--- a/grubby.c
622d0f
+++ b/grubby.c
622d0f
@@ -90,7 +90,9 @@ enum lineType_e {
622d0f
     LT_SET_VARIABLE = 1 << 19,
622d0f
     LT_KERNEL_EFI   = 1 << 20,
622d0f
     LT_INITRD_EFI   = 1 << 21,
622d0f
-    LT_UNKNOWN      = 1 << 22,
622d0f
+    LT_KERNEL_16    = 1 << 22,
622d0f
+    LT_INITRD_16    = 1 << 23,
622d0f
+    LT_UNKNOWN      = 1 << 24,
622d0f
 };
622d0f
 
622d0f
 struct singleLine {
622d0f
@@ -220,8 +222,10 @@ struct keywordTypes grub2Keywords[] = {
622d0f
     { "fallback",   LT_FALLBACK,    ' ' },
622d0f
     { "linux",      LT_KERNEL,      ' ' },
622d0f
     { "linuxefi",   LT_KERNEL_EFI,  ' ' },
622d0f
+    { "linux16",    LT_KERNEL_16,   ' ' },
622d0f
     { "initrd",     LT_INITRD,      ' ', ' ' },
622d0f
     { "initrdefi",  LT_INITRD_EFI,  ' ', ' ' },
622d0f
+    { "initrd16",   LT_INITRD_16,   ' ', ' ' },
622d0f
     { "module",     LT_MBMODULE,    ' ' },
622d0f
     { "kernel",     LT_HYPER,       ' ' },
622d0f
     { NULL, 0, 0 },
775cb0
@@ -395,11 +399,11 @@ static int isquote(char q)
622d0f
 }
622d0f
 
622d0f
 static int iskernel(enum lineType_e type) {
622d0f
-    return (type == LT_KERNEL || type == LT_KERNEL_EFI);
622d0f
+    return (type == LT_KERNEL || type == LT_KERNEL_EFI || type == LT_KERNEL_16);
622d0f
 }
622d0f
 
622d0f
 static int isinitrd(enum lineType_e type) {
622d0f
-    return (type == LT_INITRD || type == LT_INITRD_EFI);
622d0f
+    return (type == LT_INITRD || type == LT_INITRD_EFI || type == LT_INITRD_16);
622d0f
 }
622d0f
 
622d0f
 char *grub2ExtractTitle(struct singleLine * line) {
775cb0
@@ -717,6 +721,17 @@ static enum lineType_e preferredLineType(enum lineType_e type,
622d0f
 	default:
622d0f
 	    return type;
622d0f
 	}
ae2804
+#if defined(__i386__) || defined(__x86_64__)
622d0f
+    } else if (cfi == &grub2ConfigType) {
622d0f
+	switch (type) {
622d0f
+	case LT_KERNEL:
622d0f
+	    return LT_KERNEL_16;
622d0f
+	case LT_INITRD:
622d0f
+	    return LT_INITRD_16;
622d0f
+	default:
622d0f
+	    return type;
622d0f
+	}
ae2804
+#endif
622d0f
     }
622d0f
     return type;
622d0f
 }
775cb0
@@ -1804,7 +1819,7 @@ int suitableImage(struct singleEntry * entry, const char * bootPrefix,
622d0f
 	return 0;
622d0f
     }
622d0f
 
622d0f
-    line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI, entry->lines);
622d0f
+    line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI|LT_KERNEL_16, entry->lines);
622d0f
     if (!line) {
622d0f
 	notSuitablePrintf(entry, 0, "no line found\n");
622d0f
 	return 0;
775cb0
@@ -1938,7 +1953,7 @@ struct singleEntry * findEntryByPath(struct grubConfig * config,
622d0f
 	entry = findEntryByIndex(config, indexVars[i]);
622d0f
 	if (!entry) return NULL;
622d0f
 
622d0f
-	line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI, entry->lines);
622d0f
+	line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI|LT_KERNEL_16, entry->lines);
622d0f
 	if (!line) return NULL;
622d0f
 
622d0f
 	if (index) *index = indexVars[i];
775cb0
@@ -1989,9 +2004,9 @@ struct singleEntry * findEntryByPath(struct grubConfig * config,
622d0f
 	    for (line = entry->lines; line; line = line->next) {
622d0f
 		enum lineType_e ct = checkType;
622d0f
 		if (entry->multiboot && checkType == LT_KERNEL)
622d0f
-		    ct = LT_KERNEL|LT_KERNEL_EFI|LT_MBMODULE|LT_HYPER;
622d0f
+		    ct = LT_KERNEL|LT_KERNEL_EFI|LT_MBMODULE|LT_HYPER|LT_KERNEL_16;
622d0f
 		else if (checkType & LT_KERNEL)
622d0f
-		    ct = checkType | LT_KERNEL_EFI;
622d0f
+		    ct = checkType | LT_KERNEL_EFI | LT_KERNEL_16;
622d0f
 		line = getLineByType(ct, line);
622d0f
 		if (!line)
622d0f
 		    break;  /* not found in this entry */
775cb0
@@ -2013,7 +2028,7 @@ struct singleEntry * findEntryByPath(struct grubConfig * config,
622d0f
 	     * non-Linux boot entries (could find netbsd etc, though, which is
622d0f
 	     * unfortunate)
622d0f
 	     */
622d0f
-	    if (line && getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI, entry->lines))
622d0f
+	    if (line && getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI|LT_KERNEL_16, entry->lines))
622d0f
 		break; /* found 'im! */
622d0f
 	}
622d0f
 
775cb0
@@ -2247,7 +2262,7 @@ void displayEntry(struct singleEntry * entry, const char * prefix, int index) {
622d0f
 
622d0f
     printf("index=%d\n", index);
622d0f
 
622d0f
-    line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI, entry->lines);
622d0f
+    line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI|LT_KERNEL_16, entry->lines);
622d0f
     if (!line) {
622d0f
         printf("non linux entry\n");
622d0f
         return;
775cb0
@@ -2312,7 +2327,7 @@ void displayEntry(struct singleEntry * entry, const char * prefix, int index) {
622d0f
 	printf("root=%s\n", s);
622d0f
     }
622d0f
 
622d0f
-    line = getLineByType(LT_INITRD|LT_INITRD_EFI, entry->lines);
622d0f
+    line = getLineByType(LT_INITRD|LT_INITRD_EFI|LT_INITRD_16, entry->lines);
622d0f
 
622d0f
     if (line && line->numElements >= 2) {
622d0f
 	if (!strncmp(prefix, line->elements[1].item, strlen(prefix)))
775cb0
@@ -2729,7 +2744,7 @@ struct singleLine * addLineTmpl(struct singleEntry * entry,
622d0f
 	insertElement(newLine, val, 1, cfi);
622d0f
 
622d0f
 	/* but try to keep the rootspec from the template... sigh */
622d0f
-	if (tmplLine->type & (LT_HYPER|LT_KERNEL|LT_MBMODULE|LT_INITRD|LT_KERNEL_EFI|LT_INITRD_EFI)) {
622d0f
+	if (tmplLine->type & (LT_HYPER|LT_KERNEL|LT_MBMODULE|LT_INITRD|LT_KERNEL_EFI|LT_INITRD_EFI|LT_KERNEL_16|LT_INITRD_16)) {
622d0f
 	    char * rootspec = getRootSpecifier(tmplLine->elements[1].item);
622d0f
 	    if (rootspec != NULL) {
622d0f
 		free(newLine->elements[1].item);
775cb0
@@ -3099,7 +3114,7 @@ int updateActualImage(struct grubConfig * cfg, const char * image,
622d0f
 	    firstElement = 2;
622d0f
 
622d0f
 	} else {
622d0f
-	    line = getLineByType(LT_KERNEL|LT_MBMODULE|LT_KERNEL_EFI, entry->lines);
622d0f
+	    line = getLineByType(LT_KERNEL|LT_MBMODULE|LT_KERNEL_EFI|LT_KERNEL_16, entry->lines);
622d0f
 	    if (!line) {
622d0f
 		/* no LT_KERNEL or LT_MBMODULE in this entry? */
622d0f
 		continue;
56d25d
@@ -3300,10 +3315,10 @@ int updateInitrd(struct grubConfig * cfg, const char * image,
622d0f
     if (!image) return 0;
622d0f
 
622d0f
     for (; (entry = findEntryByPath(cfg, image, prefix, &index)); index++) {
622d0f
-        kernelLine = getLineByType(LT_KERNEL|LT_KERNEL_EFI, entry->lines);
622d0f
+        kernelLine = getLineByType(LT_KERNEL|LT_KERNEL_EFI|LT_KERNEL_16, entry->lines);
622d0f
         if (!kernelLine) continue;
622d0f
 
622d0f
-        line = getLineByType(LT_INITRD|LT_INITRD_EFI, entry->lines);
622d0f
+        line = getLineByType(LT_INITRD|LT_INITRD_EFI|LT_INITRD_16, entry->lines);
622d0f
         if (line)
622d0f
             removeLine(entry, line);
622d0f
         if (prefix) {
56d25d
@@ -3314,8 +3329,21 @@ int updateInitrd(struct grubConfig * cfg, const char * image,
622d0f
 	endLine = getLineByType(LT_ENTRY_END, entry->lines);
622d0f
 	if (endLine)
622d0f
 	    removeLine(entry, endLine);
622d0f
-        line = addLine(entry, cfg->cfi, preferredLineType(LT_INITRD, cfg->cfi),
622d0f
-			kernelLine->indent, initrd);
622d0f
+	enum lineType_e lt;
622d0f
+	switch(kernelLine->type) {
622d0f
+	    case LT_KERNEL:
622d0f
+	        lt = LT_INITRD;
622d0f
+		break;
622d0f
+	    case LT_KERNEL_EFI:
622d0f
+	        lt = LT_INITRD_EFI;
622d0f
+		break;
622d0f
+	    case LT_KERNEL_16:
622d0f
+	        lt = LT_INITRD_16;
622d0f
+		break;
622d0f
+	    default:
622d0f
+	        lt = preferredLineType(LT_INITRD, cfg->cfi);
622d0f
+	}
622d0f
+        line = addLine(entry, cfg->cfi, lt, kernelLine->indent, initrd);
622d0f
         if (!line)
622d0f
 	    return 1;
622d0f
 	if (endLine) {
56d25d
@@ -3913,6 +3941,7 @@ int addNewKernel(struct grubConfig * config, struct singleEntry * template,
622d0f
 	switch (config->cfi->entryStart) {
622d0f
 	    case LT_KERNEL:
622d0f
 	    case LT_KERNEL_EFI:
622d0f
+	    case LT_KERNEL_16:
622d0f
 		if (new->multiboot && config->cfi->mbHyperFirst) {
622d0f
 		    /* fall through to LT_HYPER */
622d0f
 		} else {
56d25d
@@ -4471,7 +4500,7 @@ int main(int argc, const char ** argv) {
622d0f
 	if (!entry) return 0;
622d0f
 	if (!suitableImage(entry, bootPrefix, 0, flags)) return 0;
622d0f
 
622d0f
-	line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI, entry->lines);
622d0f
+	line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI|LT_KERNEL_16, entry->lines);
622d0f
 	if (!line) return 0;
622d0f
 
622d0f
         rootspec = getRootSpecifier(line->elements[1].item);
622d0f
diff --git a/test.sh b/test.sh
ae2804
index 17b40fe..5be4006 100755
622d0f
--- a/test.sh
622d0f
+++ b/test.sh
ae2804
@@ -536,6 +536,22 @@ if [ "$testgrub2" == "y" ]; then
622d0f
 
ae2804
     testing="GRUB2 --default-index with default=saved_entry and empty grubenv"
ae2804
     grub2DisplayTest grub2.8 defaultindex/0 --env grubenv.0 --default-index
ae2804
+
ae2804
+    testlinux16=n
ae2804
+    case $ARCH in
ae2804
+        ia32|x86_64) testlinux16=y ;;
ae2804
+    esac
ae2804
+
ae2804
+    if [ "$testlinux16" == "y" ]; then
ae2804
+        testing="GRUB2 add kernel with linux16"
ae2804
+        grub2Test grub2.10 add/g2-1.10 --add-kernel=/boot/new-kernel.img \
ae2804
+            --title='title' --initrd=/boot/new-initrd --boot-filesystem=/boot/ \
ae2804
+            --copy-default
ae2804
+
ae2804
+        testing="GRUB2 add initrd with linux16"
ae2804
+        grub2Test grub2.11 add/g2-1.11 --update-kernel=/boot/new-kernel.img \
ae2804
+            --initrd=/boot/new-initrd --boot-filesystem=/boot/
ae2804
+    fi
ae2804
 fi
622d0f
 
ae2804
 testing="YABOOT add kernel"
622d0f
diff --git a/test/grub2.10 b/test/grub2.10
622d0f
new file mode 100644
622d0f
index 0000000..d010783
622d0f
--- /dev/null
622d0f
+++ b/test/grub2.10
622d0f
@@ -0,0 +1,84 @@
622d0f
+#
622d0f
+# DO NOT EDIT THIS FILE
622d0f
+#
622d0f
+# It is automatically generated by grub2-mkconfig using templates
622d0f
+# from /etc/grub.d and settings from /etc/default/grub
622d0f
+#
622d0f
+
622d0f
+### BEGIN /etc/grub.d/00_header ###
622d0f
+if [ -s $prefix/grubenv ]; then
622d0f
+  load_env
622d0f
+fi
622d0f
+set default="0"
622d0f
+if [ "${prev_saved_entry}" ]; then
622d0f
+  set saved_entry="${prev_saved_entry}"
622d0f
+  save_env saved_entry
622d0f
+  set prev_saved_entry=
622d0f
+  save_env prev_saved_entry
622d0f
+  set boot_once=true
622d0f
+fi
622d0f
+
622d0f
+function savedefault {
622d0f
+  if [ -z "${boot_once}" ]; then
622d0f
+    saved_entry="${chosen}"
622d0f
+    save_env saved_entry
622d0f
+  fi
622d0f
+}
622d0f
+
622d0f
+function load_video {
622d0f
+  insmod vbe
622d0f
+  insmod vga
622d0f
+  insmod video_bochs
622d0f
+  insmod video_cirrus
622d0f
+}
622d0f
+
622d0f
+set timeout=5
622d0f
+### END /etc/grub.d/00_header ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/10_linux ###
622d0f
+menuentry 'Linux, with Fedora 2.6.38.8-32.fc15.x86_64' --class gnu-linux --class gnu --class os {
622d0f
+	load_video
622d0f
+	set gfxpayload=keep
622d0f
+	insmod part_msdos
622d0f
+	insmod ext2
622d0f
+	set root='(hd0,msdos1)'
622d0f
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
622d0f
+	echo	'Loading Fedora 2.6.38.8-32.fc15.x86_64 ...'
622d0f
+	linux16	/vmlinuz-2.6.38.8-32.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
622d0f
+	echo	'Loading initial ramdisk ...'
622d0f
+	initrd16	/initramfs-2.6.38.8-32.fc15.x86_64.img
622d0f
+}
622d0f
+menuentry 'Linux, with Linux 2.6.38.2-9.fc15.x86_64' --class gnu-linux --class gnu --class os {
622d0f
+	load_video
622d0f
+	set gfxpayload=keep
622d0f
+	insmod part_msdos
622d0f
+	insmod ext2
622d0f
+	set root='(hd0,msdos1)'
622d0f
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
622d0f
+	echo	'Loading Linux 2.6.38.2-9.fc15.x86_64 ...'
622d0f
+	linux16	/vmlinuz-2.6.38.2-9.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
622d0f
+	echo	'Loading initial ramdisk ...'
622d0f
+	initrd16	/initramfs-2.6.38.2-9.fc15.x86_64.img
622d0f
+}
622d0f
+### END /etc/grub.d/10_linux ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/20_linux_xen ###
622d0f
+### END /etc/grub.d/20_linux_xen ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/30_os-prober ###
622d0f
+### END /etc/grub.d/30_os-prober ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/40_custom ###
622d0f
+# This file provides an easy way to add custom menu entries.  Simply type the
622d0f
+# menu entries you want to add after this comment.  Be careful not to change
622d0f
+# the 'exec tail' line above.
622d0f
+### END /etc/grub.d/40_custom ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/41_custom ###
622d0f
+if [ -f  $prefix/custom.cfg ]; then
622d0f
+  source $prefix/custom.cfg;
622d0f
+fi
622d0f
+### END /etc/grub.d/41_custom ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/90_persistent ###
622d0f
+### END /etc/grub.d/90_persistent ###
622d0f
diff --git a/test/grub2.11 b/test/grub2.11
622d0f
new file mode 100644
622d0f
index 0000000..820880a
622d0f
--- /dev/null
622d0f
+++ b/test/grub2.11
622d0f
@@ -0,0 +1,97 @@
622d0f
+#
622d0f
+# DO NOT EDIT THIS FILE
622d0f
+#
622d0f
+# It is automatically generated by grub2-mkconfig using templates
622d0f
+# from /etc/grub.d and settings from /etc/default/grub
622d0f
+#
622d0f
+
622d0f
+### BEGIN /etc/grub.d/00_header ###
622d0f
+if [ -s $prefix/grubenv ]; then
622d0f
+  load_env
622d0f
+fi
622d0f
+set default="0"
622d0f
+if [ "${prev_saved_entry}" ]; then
622d0f
+  set saved_entry="${prev_saved_entry}"
622d0f
+  save_env saved_entry
622d0f
+  set prev_saved_entry=
622d0f
+  save_env prev_saved_entry
622d0f
+  set boot_once=true
622d0f
+fi
622d0f
+
622d0f
+function savedefault {
622d0f
+  if [ -z "${boot_once}" ]; then
622d0f
+    saved_entry="${chosen}"
622d0f
+    save_env saved_entry
622d0f
+  fi
622d0f
+}
622d0f
+
622d0f
+function load_video {
622d0f
+  insmod vbe
622d0f
+  insmod vga
622d0f
+  insmod video_bochs
622d0f
+  insmod video_cirrus
622d0f
+}
622d0f
+
622d0f
+set timeout=5
622d0f
+### END /etc/grub.d/00_header ###
622d0f
+
622d0f
+set superusers="foo bar  baz"
622d0f
+
622d0f
+### BEGIN /etc/grub.d/10_linux ###
622d0f
+menuentry 'title' --class gnu-linux --class gnu --class os {
622d0f
+	load_video
622d0f
+	set gfxpayload=keep
622d0f
+	insmod part_msdos
622d0f
+	insmod ext2
622d0f
+	set root='(hd0,msdos1)'
622d0f
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
622d0f
+	echo 'Loading title'
622d0f
+	linux16	/new-kernel.img root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
622d0f
+	echo 'Loading initial ramdisk ...'
622d0f
+}
622d0f
+menuentry 'Linux, with Linux 2.6.38.8-32.fc15.x86_64' --class gnu-linux --class gnu --class os {
622d0f
+	load_video
622d0f
+	set gfxpayload=keep
622d0f
+	insmod part_msdos
622d0f
+	insmod ext2
622d0f
+	set root='(hd0,msdos1)'
622d0f
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
622d0f
+	echo	'Loading Linux 2.6.38.8-32.fc15.x86_64 ...'
622d0f
+	linux16	/vmlinuz-2.6.38.8-32.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
622d0f
+	echo	'Loading initial ramdisk ...'
622d0f
+	initrd16	/initramfs-2.6.38.8-32.fc15.x86_64.img
622d0f
+}
622d0f
+menuentry 'Linux, with Linux 2.6.38.2-9.fc15.x86_64' --class gnu-linux --class gnu --class os {
622d0f
+	load_video
622d0f
+	set gfxpayload=keep
622d0f
+	insmod part_msdos
622d0f
+	insmod ext2
622d0f
+	set root='(hd0,msdos1)'
622d0f
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
622d0f
+	echo	'Loading Linux 2.6.38.2-9.fc15.x86_64 ...'
622d0f
+	linux16	/vmlinuz-2.6.38.2-9.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
622d0f
+	echo	'Loading initial ramdisk ...'
622d0f
+	initrd16	/initramfs-2.6.38.2-9.fc15.x86_64.img
622d0f
+}
622d0f
+### END /etc/grub.d/10_linux ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/20_linux_xen ###
622d0f
+### END /etc/grub.d/20_linux_xen ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/30_os-prober ###
622d0f
+### END /etc/grub.d/30_os-prober ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/40_custom ###
622d0f
+# This file provides an easy way to add custom menu entries.  Simply type the
622d0f
+# menu entries you want to add after this comment.  Be careful not to change
622d0f
+# the 'exec tail' line above.
622d0f
+### END /etc/grub.d/40_custom ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/41_custom ###
622d0f
+if [ -f  $prefix/custom.cfg ]; then
622d0f
+  source $prefix/custom.cfg;
622d0f
+fi
622d0f
+### END /etc/grub.d/41_custom ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/90_persistent ###
622d0f
+### END /etc/grub.d/90_persistent ###
622d0f
diff --git a/test/results/add/g2-1.10 b/test/results/add/g2-1.10
622d0f
new file mode 100644
622d0f
index 0000000..bb2c71c
622d0f
--- /dev/null
622d0f
+++ b/test/results/add/g2-1.10
622d0f
@@ -0,0 +1,96 @@
622d0f
+#
622d0f
+# DO NOT EDIT THIS FILE
622d0f
+#
622d0f
+# It is automatically generated by grub2-mkconfig using templates
622d0f
+# from /etc/grub.d and settings from /etc/default/grub
622d0f
+#
622d0f
+
622d0f
+### BEGIN /etc/grub.d/00_header ###
622d0f
+if [ -s $prefix/grubenv ]; then
622d0f
+  load_env
622d0f
+fi
622d0f
+set default="1"
622d0f
+if [ "${prev_saved_entry}" ]; then
622d0f
+  set saved_entry="${prev_saved_entry}"
622d0f
+  save_env saved_entry
622d0f
+  set prev_saved_entry=
622d0f
+  save_env prev_saved_entry
622d0f
+  set boot_once=true
622d0f
+fi
622d0f
+
622d0f
+function savedefault {
622d0f
+  if [ -z "${boot_once}" ]; then
622d0f
+    saved_entry="${chosen}"
622d0f
+    save_env saved_entry
622d0f
+  fi
622d0f
+}
622d0f
+
622d0f
+function load_video {
622d0f
+  insmod vbe
622d0f
+  insmod vga
622d0f
+  insmod video_bochs
622d0f
+  insmod video_cirrus
622d0f
+}
622d0f
+
622d0f
+set timeout=5
622d0f
+### END /etc/grub.d/00_header ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/10_linux ###
622d0f
+menuentry 'title' --class gnu-linux --class gnu --class os {
622d0f
+	load_video
622d0f
+	set gfxpayload=keep
622d0f
+	insmod part_msdos
622d0f
+	insmod ext2
622d0f
+	set root='(hd0,msdos1)'
622d0f
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
622d0f
+	echo 'Loading title'
622d0f
+	linux16	/new-kernel.img root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
622d0f
+	echo 'Loading initial ramdisk ...'
622d0f
+	initrd16	/new-initrd
622d0f
+}
622d0f
+menuentry 'Linux, with Fedora 2.6.38.8-32.fc15.x86_64' --class gnu-linux --class gnu --class os {
622d0f
+	load_video
622d0f
+	set gfxpayload=keep
622d0f
+	insmod part_msdos
622d0f
+	insmod ext2
622d0f
+	set root='(hd0,msdos1)'
622d0f
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
622d0f
+	echo	'Loading Fedora 2.6.38.8-32.fc15.x86_64 ...'
622d0f
+	linux16	/vmlinuz-2.6.38.8-32.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
622d0f
+	echo	'Loading initial ramdisk ...'
622d0f
+	initrd16	/initramfs-2.6.38.8-32.fc15.x86_64.img
622d0f
+}
622d0f
+menuentry 'Linux, with Linux 2.6.38.2-9.fc15.x86_64' --class gnu-linux --class gnu --class os {
622d0f
+	load_video
622d0f
+	set gfxpayload=keep
622d0f
+	insmod part_msdos
622d0f
+	insmod ext2
622d0f
+	set root='(hd0,msdos1)'
622d0f
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
622d0f
+	echo	'Loading Linux 2.6.38.2-9.fc15.x86_64 ...'
622d0f
+	linux16	/vmlinuz-2.6.38.2-9.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
622d0f
+	echo	'Loading initial ramdisk ...'
622d0f
+	initrd16	/initramfs-2.6.38.2-9.fc15.x86_64.img
622d0f
+}
622d0f
+### END /etc/grub.d/10_linux ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/20_linux_xen ###
622d0f
+### END /etc/grub.d/20_linux_xen ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/30_os-prober ###
622d0f
+### END /etc/grub.d/30_os-prober ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/40_custom ###
622d0f
+# This file provides an easy way to add custom menu entries.  Simply type the
622d0f
+# menu entries you want to add after this comment.  Be careful not to change
622d0f
+# the 'exec tail' line above.
622d0f
+### END /etc/grub.d/40_custom ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/41_custom ###
622d0f
+if [ -f  $prefix/custom.cfg ]; then
622d0f
+  source $prefix/custom.cfg;
622d0f
+fi
622d0f
+### END /etc/grub.d/41_custom ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/90_persistent ###
622d0f
+### END /etc/grub.d/90_persistent ###
622d0f
diff --git a/test/results/add/g2-1.11 b/test/results/add/g2-1.11
622d0f
new file mode 100644
622d0f
index 0000000..a11cb41
622d0f
--- /dev/null
622d0f
+++ b/test/results/add/g2-1.11
622d0f
@@ -0,0 +1,98 @@
622d0f
+#
622d0f
+# DO NOT EDIT THIS FILE
622d0f
+#
622d0f
+# It is automatically generated by grub2-mkconfig using templates
622d0f
+# from /etc/grub.d and settings from /etc/default/grub
622d0f
+#
622d0f
+
622d0f
+### BEGIN /etc/grub.d/00_header ###
622d0f
+if [ -s $prefix/grubenv ]; then
622d0f
+  load_env
622d0f
+fi
622d0f
+set default="0"
622d0f
+if [ "${prev_saved_entry}" ]; then
622d0f
+  set saved_entry="${prev_saved_entry}"
622d0f
+  save_env saved_entry
622d0f
+  set prev_saved_entry=
622d0f
+  save_env prev_saved_entry
622d0f
+  set boot_once=true
622d0f
+fi
622d0f
+
622d0f
+function savedefault {
622d0f
+  if [ -z "${boot_once}" ]; then
622d0f
+    saved_entry="${chosen}"
622d0f
+    save_env saved_entry
622d0f
+  fi
622d0f
+}
622d0f
+
622d0f
+function load_video {
622d0f
+  insmod vbe
622d0f
+  insmod vga
622d0f
+  insmod video_bochs
622d0f
+  insmod video_cirrus
622d0f
+}
622d0f
+
622d0f
+set timeout=5
622d0f
+### END /etc/grub.d/00_header ###
622d0f
+
622d0f
+set superusers="foo bar  baz"
622d0f
+
622d0f
+### BEGIN /etc/grub.d/10_linux ###
622d0f
+menuentry 'title' --class gnu-linux --class gnu --class os {
622d0f
+	load_video
622d0f
+	set gfxpayload=keep
622d0f
+	insmod part_msdos
622d0f
+	insmod ext2
622d0f
+	set root='(hd0,msdos1)'
622d0f
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
622d0f
+	echo 'Loading title'
622d0f
+	linux16	/new-kernel.img root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
622d0f
+	echo 'Loading initial ramdisk ...'
622d0f
+	initrd16 /new-initrd
622d0f
+}
622d0f
+menuentry 'Linux, with Linux 2.6.38.8-32.fc15.x86_64' --class gnu-linux --class gnu --class os {
622d0f
+	load_video
622d0f
+	set gfxpayload=keep
622d0f
+	insmod part_msdos
622d0f
+	insmod ext2
622d0f
+	set root='(hd0,msdos1)'
622d0f
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
622d0f
+	echo	'Loading Linux 2.6.38.8-32.fc15.x86_64 ...'
622d0f
+	linux16	/vmlinuz-2.6.38.8-32.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
622d0f
+	echo	'Loading initial ramdisk ...'
622d0f
+	initrd16	/initramfs-2.6.38.8-32.fc15.x86_64.img
622d0f
+}
622d0f
+menuentry 'Linux, with Linux 2.6.38.2-9.fc15.x86_64' --class gnu-linux --class gnu --class os {
622d0f
+	load_video
622d0f
+	set gfxpayload=keep
622d0f
+	insmod part_msdos
622d0f
+	insmod ext2
622d0f
+	set root='(hd0,msdos1)'
622d0f
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
622d0f
+	echo	'Loading Linux 2.6.38.2-9.fc15.x86_64 ...'
622d0f
+	linux16	/vmlinuz-2.6.38.2-9.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
622d0f
+	echo	'Loading initial ramdisk ...'
622d0f
+	initrd16	/initramfs-2.6.38.2-9.fc15.x86_64.img
622d0f
+}
622d0f
+### END /etc/grub.d/10_linux ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/20_linux_xen ###
622d0f
+### END /etc/grub.d/20_linux_xen ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/30_os-prober ###
622d0f
+### END /etc/grub.d/30_os-prober ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/40_custom ###
622d0f
+# This file provides an easy way to add custom menu entries.  Simply type the
622d0f
+# menu entries you want to add after this comment.  Be careful not to change
622d0f
+# the 'exec tail' line above.
622d0f
+### END /etc/grub.d/40_custom ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/41_custom ###
622d0f
+if [ -f  $prefix/custom.cfg ]; then
622d0f
+  source $prefix/custom.cfg;
622d0f
+fi
622d0f
+### END /etc/grub.d/41_custom ###
622d0f
+
622d0f
+### BEGIN /etc/grub.d/90_persistent ###
622d0f
+### END /etc/grub.d/90_persistent ###
622d0f
-- 
56d25d
2.4.3
622d0f