]> code.delx.au - refind/commitdiff
0.6.11 release.
authorsrs5694 <srs5694@users.sourceforge.net>
Mon, 13 May 2013 17:36:57 +0000 (13:36 -0400)
committersrs5694 <srs5694@users.sourceforge.net>
Mon, 13 May 2013 17:36:57 +0000 (13:36 -0400)
19 files changed:
CREDITS.txt
NEWS.txt
docs/refind/bootmode.html
docs/refind/configfile.html
docs/refind/drivers.html
docs/refind/features.html
docs/refind/getting.html
docs/refind/index.html
docs/refind/installing.html
docs/refind/linux.html
docs/refind/revisions.html
docs/refind/secureboot.html
docs/refind/themes.html
docs/refind/using.html
filesystems/fsw_efi.c
gptsync/gptsync.h
install.sh
refind.spec
refind/main.c

index 72cadfb5cd69f53b12f0009ca12a3fed04cd1b86..174e6efd2c1618b9ef764fb1b30a528acb5c1283 100644 (file)
@@ -80,6 +80,9 @@ Icons and graphics:
 * The Linux Mint icon comes from the Linux Mint 11.1 user guide
   (http://ftp.heanet.ie/pub/linuxmint.com/docs/user-guide/)
 
+* The Kuubunut icon comes from "doctormo" on deviantart, at
+  http://doctormo.deviantart.com/art/Ubuntu-Icons-171616850.
+
 * The Arch Linux icon was created by ~IDRGSKYWALKER on Deviant Art
   (http://idrgskywalker.deviantart.com/art/Arch-Linux-Logo-186211022).
 
index 5c34faa7f0b882d76f3a328c36b74adf8b2e5d51..d240d413518129be56e2dbdbcba3a2c58d995d7f 100644 (file)
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -1,6 +1,22 @@
-0.6.10 (?/??/2013):
+0.6.11 (5/13/2013):
 -------------------
 
+- New feature: rEFInd now ignores symbolic links to files on filesystems
+  that support them. This prevents the "vmlinuz" symbolic link that some
+  distributions create in the root directory from appearing in the loader
+  list. Note that this does NOT affect symbolic links to directories.
+
+- Added icons for Lubuntu and Kubuntu.
+
+- Improved the install.sh script so that it does a better job dealing with
+  directory names that contain spaces.
+
+- rEFInd now tries to guess the Linux distribution type based on the kernel
+  filename (Fedora and RHEL only) or the "ID" or "NAME" variables in
+  /etc/os-release on the kernel's partition. None of these is guaranteed to
+  work. A fallback of the Tux penguin icon remains in place in case rEFInd
+  can't find anything substantive enough for a guess.
+
 - Added "EFI\opensuse" to the locations searched for MOK utilities, since
   OpenSUSE now uses that name.
 
index 0d80c833cf2e99a282b5769102c8991396df28c3..2e50505667b689aadaba6d76465e68009518a3e1 100644 (file)
@@ -15,7 +15,7 @@
 href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>\r
 \r
 <p>Originally written: 3/14/2012; last Web page update:\r
-5/5/2013, referencing rEFInd 0.6.10</p>\r
+5/13/2013, referencing rEFInd 0.6.11</p>\r
 \r
 \r
 <p>I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!</p>\r
index 62438d3169010feb5cd2d6d86def4e042c291ee9..6b2e68c50f47a9799c288b997042c8f5fbb6d4a2 100644 (file)
@@ -15,7 +15,7 @@
 href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
 
 <p>Originally written: 3/14/2012; last Web page update:
-5/5/2013, referencing rEFInd 0.6.10</p>
+5/13/2013, referencing rEFInd 0.6.11</p>
 
 
 <p>I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!</p>
index bd77d9dc438b1c1032ce0e02f0da804d9bc04099..15ac439f18740d44fbeaa335ef0f24e54824c30e 100644 (file)
@@ -15,7 +15,7 @@
 href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
 
 <p>Originally written: 4/19/2012; last Web page update:
-5/5/2013, referencing rEFInd 0.6.10</p>
+5/13/2013, referencing rEFInd 0.6.11</p>
 
 
 <p>I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!</p>
@@ -293,7 +293,7 @@ fs0: <tt class="userinput">map -r</tt>
 
 <p>Since the ext2fs and ReiserFS drivers share a common origin, it should come as no surprise that they perform in much the same way no matter which version (rEFIt, Clover, or rEFInd) you use. The NTFS driver from the Clover Tools package is nice and speedy, so if for some reason you need to place a boot loader on an NTFS volume, this driver might be worth tracking down.</p>
 
-<p>Although ext2fs, ext3fs, ext4fs, and ReiserFS are all case-sensitive, these drivers treat them in a case-insensitive way. Symbolic links work, which opens up possibilities for configuration, such as using a single kernel binary for multiple Linux distributions, with a link in one subdirectory pointing to a file in another directory. (If you try this, though, be sure to use <i>relative</i> links, as in <tt>../otherdist/bzImage.efi</tt>, at least if the partition is not Linux's root filesystem.)</p>
+<p>Although ext2fs, ext3fs, ext4fs, and ReiserFS are all case-sensitive, these drivers treat them in a case-insensitive way. Symbolic links work; however, rEFInd 0.6.11 and later ignore symbolic links, since many distributions use them in a way that creates redundant or non-functional entries in the rEFInd menu. You should be able to use hard links if you want to use a single kernel file in multiple ways (say for two distributions).</p>
 
 </ul>
 
index 44d09bd80d04c9a01ee8576f291ffd3c22ad0821..818c72d4fea9b6372c3a1b8acb81c552fd1d0924 100644 (file)
@@ -15,7 +15,7 @@
 href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
 
 <p>Originally written: 3/14/2012; last Web page update:
-5/5/2013, referencing rEFInd 0.6.10</p>
+5/13/2013, referencing rEFInd 0.6.11</p>
 
 <p>I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!</p>
 
index 528fac461ed79a30958149b5ebf0d28909418abe..5ff4f723a2b6a3dccbb649b83ee6d4fe1706dae1 100644 (file)
@@ -15,7 +15,7 @@
 href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
 
 <p>Originally written: 3/14/2012; last Web page update:
-5/5/2013, referencing rEFInd 0.6.10</p>
+5/13/2013, referencing rEFInd 0.6.11</p>
 
 <p>I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!</p>
 
@@ -136,7 +136,7 @@ href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
 <ul>
 
 <li><b><a
-    href="http://sourceforge.net/projects/refind/files/0.6.10/refind-src-0.6.10.zip/download">A
+    href="http://sourceforge.net/projects/refind/files/0.6.11/refind-src-0.6.11.zip/download">A
     source code zip file</a></b>&mdash;This is useful if you want to compile
     the software locally. Note that I use Linux with the <a
     href="https://sourceforge.net/projects/tianocore/">TianoCore EFI
@@ -145,7 +145,7 @@ href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
     development tools are also supported.</li>
 
 <li><b><a
-    href="http://sourceforge.net/projects/refind/files/0.6.10/refind-bin-0.6.10.zip/download">A
+    href="http://sourceforge.net/projects/refind/files/0.6.11/refind-bin-0.6.11.zip/download">A
     binary zip file</a></b>&mdash;Download this if you want to install
     rEFInd and/or its filesystem drivers on an <i>x</i>86 or <i>x</i>86-64
     computer and have no need to test rEFInd first by booting it on an
@@ -155,14 +155,14 @@ href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
     href="installing.html">Installing rEFInd</a> page. Some users of Arch
     Linux have reported problems booting some specific Arch Linux kernels
     with rEFInd and some other tools. For them, a <a
-    href="http://sourceforge.net/projects/refind/files/0.6.10/refind-bin-gnuefi-0.6.10.zip/download">variant
+    href="http://sourceforge.net/projects/refind/files/0.6.11/refind-bin-gnuefi-0.6.11.zip/download">variant
     package</a> exists in which the <i>x</i>86-64 binary was compiled with
     GNU-EFI rather than the usual TianoCore EDK2. This change helps some
     users with this problem; but using GNU-EFI also means that this version
     can't launch BIOS-mode OSes.</li>
 
 <li><b><a
-    href="http://sourceforge.net/projects/refind/files/0.6.10/refind-0.6.10-1.x86_64.rpm/download">A
+    href="http://sourceforge.net/projects/refind/files/0.6.11/refind-0.6.11-1.x86_64.rpm/download">A
     binary RPM file</a></b>&mdash;If you use an RPM-based <i>x</i>86-64
     Linux system such as Fedora or openSUSE, you can install the binary RPM
     package rather than use the binary zip file. (I don't provide an
@@ -171,13 +171,13 @@ href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
     rEFInd</a> page) as part of the installation process. Distribution
     maintainers can examine the <tt>refind.spec</tt> file in the source
     package and tweak it to their needs. The <a
-    href="http://sourceforge.net/projects/refind/files/0.6.10/refind-0.6.10-1.src.rpm/download">source
+    href="http://sourceforge.net/projects/refind/files/0.6.11/refind-0.6.11-1.src.rpm/download">source
     RPM file</a> might or might not build on your system as-is; it relies
     on assumptions about the locations of the GNU-EFI development
     files.</li>
 
 <li><b><a
-    href="http://sourceforge.net/projects/refind/files/0.6.10/refind_0.6.10-1_amd64.deb/download">A
+    href="http://sourceforge.net/projects/refind/files/0.6.11/refind_0.6.11-1_amd64.deb/download">A
     binary Debian package</a></b>&mdash;If you use an <i>x</i>86-64 version
     of Debian, Ubuntu, Mint, or another Debian-based distribution, you can
     install from this package, which was converted from the binary RPM
@@ -199,7 +199,7 @@ href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
 <p class="sidebar"><b>Note:</b> At the moment, neither the bootable CD-R image file nor the bootable USB flash drive image file supports booting with Secure Boot active.</p>
 
 <li><b><a
-    href="http://sourceforge.net/projects/refind/files/0.6.10/refind-cd-0.6.10.zip/download">A
+    href="http://sourceforge.net/projects/refind/files/0.6.11/refind-cd-0.6.11.zip/download">A
     CD-R image file</a></b>&mdash;This download contains the same files as
     the binary zip file, but you can burn it to a CD-R to test rEFInd
     (and its filesystem drivers) without installing it first. (It boots on
@@ -223,7 +223,7 @@ on <tt>/dev/sdd</tt>. This procedure should work even on a BIOS-booted
 computer.</p>
 
 <li><b><a
-    href="http://sourceforge.net/projects/refind/files/0.6.10/refind-flashdrive-0.6.10.zip/download">A
+    href="http://sourceforge.net/projects/refind/files/0.6.11/refind-flashdrive-0.6.11.zip/download">A
     USB flash drive image file</a></b>&mdash;Although you     can create
     your own rEFInd USB flash drive, you may find it easier to download
     this version and copy it to your USB drive with <tt>dd</tt> or some
index b0e3a35de0644ca8dc6b825921953d35e4568571..686e5f7f12577160f653445c3128c35d9e86f492 100644 (file)
@@ -15,7 +15,7 @@
 href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
 
 <p>Originally written: 3/14/2012; last Web page update:
-5/5/2013, referencing rEFInd 0.6.10</p>
+5/13/2013, referencing rEFInd 0.6.11</p>
 
 
 <p>I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!</p>
@@ -152,7 +152,7 @@ href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
 
 <li class="tight"><a href="features.html">rEFInd Features</a>&mdash;An overview of rEFInd's features</li>
 
-<li class="tight"><a href="getting.html">Getting rEFInd</a>&mdash;Links to obtain rEFInd</li>
+<li class="tight"><a href="getting.html">Getting rEFInd</a>&mdash;Links to download rEFInd</li>
 
 <li class="tight"><a href="installing.html">Installing rEFInd</a>&mdash;Instructions for installing rEFInd, using Linux, OS X, and Windows</li>
 
index d3b54245b273210b2aedcb94425faeab9285e27b..936e51c30099b82557991be8cc89bda5c0111484 100644 (file)
@@ -15,7 +15,7 @@
 href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
 
 <p>Originally written: 3/14/2012; last Web page update:
-5/5/2013, referencing rEFInd 0.6.10</p>
+5/13/2013, referencing rEFInd 0.6.11</p>
 
 
 <p>I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!</p>
@@ -206,11 +206,11 @@ href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
 
 <p>Beginning with version 0.6.2, I've included RPM and Debian package files for rEFInd. If you have a working RPM-based or Debian-based Linux installation that boots in EFI mode, using one of these files is likely to be the easiest way to install rEFInd: You need only download the file and issue an appropriate installation command. In some cases, double-clicking the package in your file manager will install it. If that doesn't work, a command like the following will install the RPM on an RPM-based system:</p>
 
-<pre class="listing"># <tt class="userinput">rpm -Uvh refind-0.6.10-1.x86_64.rpm</tt></pre>
+<pre class="listing"># <tt class="userinput">rpm -Uvh refind-0.6.11-1.x86_64.rpm</tt></pre>
 
 <p>On a Debian-based system, the equivalent command is:</p>
 
-<pre class="listing"># <tt class="userinput">dpkg -i refind_0.6.10-1_amd64.deb</tt></pre>
+<pre class="listing"># <tt class="userinput">dpkg -i refind_0.6.11-1_amd64.deb</tt></pre>
 
 <p>Either command produces output similar to that described for <a href="#installsh">using the <tt>install.sh</tt> script,</a> so you can check it for error messages and other signs of trouble. The package file installs rEFInd and registers it with the EFI to be the default boot loader. The script that runs as part of the installation process tries to determine if you're using Secure Boot, and if so it will try to configure rEFInd to launch using shim; however, this won't work correctly on all systems. Ubuntu 12.10 users who are booting with Secure Boot active should be wary, since the resulting installation will probably try to use Ubuntu's version of shim, which won't work correctly with rEFInd.</p>
 
index a69d36fe91ef299ccdedef72ad1271e478da4ac8..d886d36b0154a06b7cceb5d446309c44f15680f3 100644 (file)
@@ -15,7 +15,7 @@
 href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
 
 <p>Originally written: 3/19/2012; last Web page update:
-5/5/2013, referencing rEFInd 0.6.10</p>
+5/13/2013, referencing rEFInd 0.6.11</p>
 
 
 <p>I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!</p>
index 8454ff93518eb6f14de7e0d6884a80a8edcfd10d..4377524cf29c7bf694232e34a1df5f4291f05262 100644 (file)
@@ -14,7 +14,7 @@
 <p class="subhead">by Roderick W. Smith, <a
 href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
 
-<p>Last Web page update: 5/5/2013</p>
+<p>Last Web page update: 5/11/2013</p>
 
 <p>I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!</p>
 
@@ -130,6 +130,8 @@ href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
 
 <ul>
 
+<li><b>0.6.11 (5/13/2013)</b>&mdash;Two new features may have a noticeable affect for many users: First, rEFInd now ignores symbolic links on filesystems that support them. I've implemented this change because I've been receiving too many reports from users who want to remove redundant or non-functional Linux boot entries caused by symbolic links created by distributions. Although this is possible by editing the <tt>dont_scan_dirs</tt> or <tt>dont_scan_files</tt> options in <tt>refind.conf</tt>, telling users how to do this has become tedious. If you <i>want</i> to use links to create multiple entries for one kernel or boot loader, use hard links instead of symbolic links. The second major user-visible change is that rEFInd now tries to guess the distribution type based on the naming of the kernel file (effective only for Fedora and RHEL) or the contents of the <tt>/etc/os-release</tt> file (effective only if the installation does <i>not</i> have a separate </tt>/boot</tt> partition or if <tt>/etc/os-release</tt> is copied to that location on the partition that holds the kernel). There are several other minor cosmetic issues that some users may notice, including icons for Lubuntu and Kubuntu and a change in the name of the "Reboot to Firmware User Interface" option to "Reboot to Computer Setup Utility." I've also fixed a bug in <tt>gptsync</tt> that could cause it to hang if the disk had too few GPT partitions. Finally, I've improved the <tt>install.sh</tt> script so that it works better from a path with directory names that include spaces.</li>
+
 <li><b>0.6.10 (5/5/2013)</b>&mdash;This version adds a number of minor improvements: The ability to create multiple screen shots under a sequence of names rather than using just one name; a new screen saver feature, activated by the <tt>screensaver</tt> token in <tt>refind.conf</tt>; and an option to reboot the computer into the firmware's setup utility on computers that support this feature. I've also added an OS for ChromeOS (<tt>os_chrome.icns</tt>), and I've updated the LodePNG library to the latest version, which might improve rendering of some PNG files.</li>
 
 <li><b>0.6.9 (4/25/2013)</b>&mdash;The most visible change to this version is to the rEFInd banner image, which now includes an icon provided by Erik Kemperman. The biggest change with this version is the inclusion of an updated version of <tt>gptsync</tt>, which is popular on Macs as a means of maintaining the <a href="http://www.rodsbooks.com/gdisk/hybrid.html">hybrid MBR</a> that's required to boot Windows in BIOS mode on that platform. Because hybrid MBRs are ugly and dangerous, though, the rEFInd <tt>install.sh</tt> script installs the program only under OS X, and even then it must be activated by uncommending the <tt>scanfor</tt> line in <tt>refind.conf</tt> and adding <tt>gptsync</tt> to its options list. If you want to use <tt>gptsync</tt> on a PC, you can, but you'll need to copy the program file manually to the ESP's <tt>EFI/tools</tt> directory. Other changes with this version include working around a suspected firmware bug that can cause hangs when rEFInd starts on some systems and changing the timeout code so that rEFInd will launch its default OS even if the computer is started without a keyboard.</li>
index 4f863cc2f07c8c929c38efc71a0d919957834e1c..cb54b6d155eaffefb1b65dd891a16cc3c9a1eec4 100644 (file)
@@ -15,7 +15,7 @@
 href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
 
 <p>Originally written: 11/13/2012; last Web page update:
-5/5/2013, referencing rEFInd 0.6.10</p>
+5/13/2013, referencing rEFInd 0.6.11</p>
 
 
 <p>I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!</p>
index 6bfdd40a3e72752a51c2f505b998dbaa980e83d3..771ab8d75c185dadec29e2536759fcd1b37ea916 100644 (file)
@@ -15,7 +15,7 @@
 href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
 
 <p>Originally written: 4/19/2012; last Web page update:
-5/5/2013, referencing rEFInd 0.6.10</p>
+5/13/2013, referencing rEFInd 0.6.11</p>
 
 
 <p>I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!</p>
index 7c1b0a7a88ceac3142af0b67331ccbec4397f5ad..60f98d1e82a07ad4c4a04affae4b89a1861aed16 100644 (file)
@@ -15,7 +15,7 @@
 href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com</a></p>
 
 <p>Originally written: 3/14/2012; last Web page update:
-5/5/2013, referencing rEFInd 0.6.10</p>
+5/13/2013, referencing rEFInd 0.6.11</p>
 
 
 <p>I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!</p>
index 55709d43ac52910b2eac3f1118e74e2f6452860f..057e7ad233b6d6dcf885a92ea8663b2341b2e35a 100644 (file)
@@ -98,7 +98,7 @@ EFI_GUID gEfiFileSystemVolumeLabelInfoIdGuid = EFI_FILE_SYSTEM_VOLUME_LABEL_INFO
 /** Helper macro for stringification. */
 #define FSW_EFI_STRINGIFY(x) #x
 /** Expands to the EFI driver name given the file system type name. */
-#define FSW_EFI_DRIVER_NAME(t) L"rEFInd 0.6.10 " FSW_EFI_STRINGIFY(t) L" File System Driver"
+#define FSW_EFI_DRIVER_NAME(t) L"rEFInd 0.6.11 " FSW_EFI_STRINGIFY(t) L" File System Driver"
 
 // function prototypes
 
index 17150e28dc14900b9bb9f01a57e51fac456dd1d7..fed07f08c5f4299d2782842856be39ec6b0e9a11 100644 (file)
@@ -35,7 +35,7 @@
  */
 /* Changes copyright (c) 2013 Roderick W. Smith */
 
-#define VERSION L"0.6.9"
+#define VERSION L"0.6.11"
 
 //
 // config
index 1d722e84570fc5a3dd5e04c5c05c9123bf8b5d4d..4edb69a3e0ed54289ecff021c9f28c40e9a3782d 100755 (executable)
 #    "--usedefault {devicefile}" to install as default
 #           (/EFI/BOOT/BOOTX64.EFI and similar) to the specified device
 #           (/dev/sdd1 or whatever) without registering with the NVRAM.
+#    "--root {dir}" to specify installation using the specified directory
+#           as the system's root
 #    "--alldrivers" to install all drivers along with regular files
 #    "--nodrivers" to suppress driver installation (default in Linux is
 #           driver used on /boot; --nodrivers is OS X default)
 #    "--shim {shimfile}" to install a shim.efi file for Secure Boot
 #    "--localkeys" to re-sign x86-64 binaries with a locally-generated key
+#    "--yes" to assume a "yes" response to all prompts
 #
 # The "esp" option is valid only on Mac OS X; it causes
 # installation to the EFI System Partition (ESP) rather than
@@ -29,6 +32,8 @@
 #
 # Revision history:
 #
+# 0.6.11  -- Improvements in script's ability to handle directories with spaces
+#            in their names
 # 0.6.9   -- Install gptsync on Macs
 # 0.6.8   -- Bug fix: ESP scan now uses "uniq".
 # 0.6.6   -- Bug fix: Upgrade drivers when installed to EFI/BOOT. Also enable
@@ -84,17 +89,17 @@ GetParams() {
          --esp | --ESP) InstallToEspOnMac=1
               ;;
          --usedefault) TargetDir=/EFI/BOOT
-              TargetPart=$2
+              TargetPart="$2"
               TargetX64="bootx64.efi"
               TargetIA32="bootia32.efi"
               shift
               ;;
-         --root) RootDir=$2
+         --root) RootDir="$2"
               shift
               ;;
          --localkeys) LocalKeys=1
               ;;
-         --shim) ShimSource=$2
+         --shim) ShimSource="$2"
               shift
               ;;
          --drivers | --alldrivers) InstallDrivers="all"
@@ -111,15 +116,15 @@ GetParams() {
       shift
    done
 
-   if [[ $InstallToEspOnMac == 1 && $TargetDir == '/EFI/BOOT' ]] ; then
+   if [[ $InstallToEspOnMac == 1 && "$TargetDir" == '/EFI/BOOT' ]] ; then
       echo "You may use --esp OR --usedefault, but not both! Aborting!"
       exit 1
    fi
-   if [[ $RootDir != '/' && $TargetDir == '/EFI/BOOT' ]] ; then
+   if [[ "$RootDir" != '/' && "$TargetDir" == '/EFI/BOOT' ]] ; then
       echo "You may use --usedefault OR --root, but not both! Aborting!"
       exit 1
    fi
-   if [[ $RootDir != '/' && $InstallToEspOnMac == 1 ]] ; then
+   if [[ "$RootDir" != '/' && $InstallToEspOnMac == 1 ]] ; then
       echo "You may use --root OR --esp, but not both! Aborting!"
       exit 1
    fi
@@ -149,33 +154,33 @@ CheckForFiles() {
    # is found, even on the wrong platform. This is because the platform
    # hasn't yet been determined. This could obviously be improved, but it
    # would mean restructuring lots more code....
-   if [[ ! -f $RefindDir/refind_ia32.efi && ! -f $RefindDir/refind_x64.efi ]] ; then
+   if [[ ! -f "$RefindDir/refind_ia32.efi" && ! -f "$RefindDir/refind_x64.efi" ]] ; then
       echo "The rEFInd binary file is missing! Aborting installation!"
       exit 1
    fi
 
-   if [[ -f $RefindDir/refind.conf-sample ]] ; then
-      ConfFile=$RefindDir/refind.conf-sample
-   elif [[ -f $ThisDir/refind.conf-sample ]] ; then
-      ConfFile=$ThisDir/refind.conf-sample
+   if [[ -f "$RefindDir/refind.conf-sample" ]] ; then
+      ConfFile="$RefindDir/refind.conf-sample"
+   elif [[ -f "$ThisDir/refind.conf-sample" ]] ; then
+      ConfFile="$ThisDir/refind.conf-sample"
    else
       echo "The sample configuration file is missing! Aborting installation!"
       exit 1
    fi
 
-   if [[ -d $RefindDir/icons ]] ; then
-      IconsDir=$RefindDir/icons
-   elif [[ -d $ThisDir/icons ]] ; then
-      IconsDir=$ThisDir/icons
+   if [[ -d "$RefindDir/icons" ]] ; then
+      IconsDir="$RefindDir/icons"
+   elif [[ -d "$ThisDir/icons" ]] ; then
+      IconsDir="$ThisDir/icons"
    else
       echo "The icons directory is missing! Aborting installation!"
       exit 1
    fi
 
-   if [[ $ShimSource != "none" ]] ; then
-      if [[ -f $ShimSource ]] ; then
+   if [[ "$ShimSource" != "none" ]] ; then
+      if [[ -f "$ShimSource" ]] ; then
          TargetX64="grubx64.efi"
-         MokManagerSource=`dirname $ShimSource`/MokManager.efi
+         MokManagerSource=`dirname "$ShimSource"`/MokManager.efi
       else
          echo "The specified shim file, $ShimSource, doesn't exist!"
          echo "Aborting installation!"
@@ -187,12 +192,12 @@ CheckForFiles() {
 # Helper for CopyRefindFiles; copies shim files (including MokManager, if it's
 # available) to target.
 CopyShimFiles() {
-   cp -fb $ShimSource $InstallDir/$TargetDir/$TargetShim
+   cp -fb "$ShimSource" "$InstallDir/$TargetDir/$TargetShim"
    if [[ $? != 0 ]] ; then
       Problems=1
    fi
-   if [[ -f $MokManagerSource ]] ; then
-      cp -fb $MokManagerSource $InstallDir/$TargetDir/
+   if [[ -f "$MokManagerSource" ]] ; then
+      cp -fb "$MokManagerSource" "$InstallDir/$TargetDir/"
    fi
    if [[ $? != 0 ]] ; then
       Problems=1
@@ -202,12 +207,9 @@ CopyShimFiles() {
 # Copy the public keys to the installation medium
 CopyKeys() {
    if [[ $LocalKeys == 1 ]] ; then
-      mkdir -p $InstallDir/$TargetDir/keys/
-      cp $EtcKeysDir/$LocalKeysBase.cer $InstallDir/$TargetDir/keys/
-      cp $EtcKeysDir/$LocalKeysBase.crt $InstallDir/$TargetDir/keys/
-#    else
-#       cp $ThisDir/refind.cer $InstallDir/$TargetDir/keys/
-#       cp $ThisDir/refind.crt $InstallDir/$TargetDir/keys/
+      mkdir -p "$InstallDir/$TargetDir/keys/"
+      cp "$EtcKeysDir/$LocalKeysBase.cer" "$InstallDir/$TargetDir/keys/"
+      cp "$EtcKeysDir/$LocalKeysBase.crt" "$InstallDir/$TargetDir/keys/"
    fi
 } # CopyKeys()
 
@@ -216,10 +218,10 @@ CopyKeys() {
 # architecture code (ia32 or x64).
 CopyDrivers() {
    if [[ $InstallDrivers == "all" ]] ; then
-      mkdir -p $InstallDir/$TargetDir/drivers_$1
-      cp $RefindDir/drivers_$1/*_$1.efi $InstallDir/$TargetDir/drivers_$1/ 2> /dev/null
-      cp $ThisDir/drivers_$1/*_$1.efi $InstallDir/$TargetDir/drivers_$1/ 2> /dev/null
-   elif [[ $InstallDrivers == "boot" && -x `which blkid` ]] ; then
+      mkdir -p "$InstallDir/$TargetDir/drivers_$1"
+      cp "$ThisDir"/drivers_$1/*_$1.efi "$InstallDir/$TargetDir/drivers_$1/" 2> /dev/null
+      cp "$RefindDir"/drivers_$1/*_$1.efi "$InstallDir/$TargetDir/drivers_$1/" 2> /dev/null
+   elif [[ "$InstallDrivers" == "boot" && -x `which blkid` ]] ; then
       BootPart=`df /boot | grep dev | cut -f 1 -d " "`
       BootFS=`blkid -o export $BootPart 2> /dev/null | grep TYPE= | cut -f 2 -d =`
       DriverType=""
@@ -238,9 +240,9 @@ CopyDrivers() {
       esac
       if [[ -n $BootFS ]] ; then
          echo "Installing driver for $BootFS (${DriverType}_$1.efi)"
-         mkdir -p $InstallDir/$TargetDir/drivers_$1
-         cp $RefindDir/drivers_$1/${DriverType}_$1.efi $InstallDir/$TargetDir/drivers_$1/ 2> /dev/null
-         cp $ThisDir/drivers_$1/${DriverType}_$1.efi $InstallDir/$TargetDir/drivers_$1/ 2> /dev/null
+         mkdir -p "$InstallDir/$TargetDir/drivers_$1"
+         cp "$ThisDir/drivers_$1/${DriverType}_$1.efi" "$InstallDir/$TargetDir/drivers_$1/" 2> /dev/null
+         cp "$RefindDir/drivers_$1/${DriverType}_$1.efi" "$InstallDir/$TargetDir/drivers_$1"/ 2> /dev/null
       fi
    fi
 }
@@ -251,9 +253,9 @@ CopyDrivers() {
 CopyTools() {
    mkdir -p $InstallDir/EFI/tools
    if [[ $OSName == 'Darwin' ]] ; then
-      cp -f $RefindDir/tools_$1/gptsync_$1.efi $InstallDir/EFI/tools/
-      if [[ -f $InstallDir/EFI/tools/gptsync.efi ]] ; then
-         mv $InstallDir/EFI/tools/gptsync.efi $InstallDir/EFI/tools/gptsync.efi-disabled
+      cp -f "$RefindDir/tools_$1/gptsync_$1.efi" "$InstallDir/EFI/tools/"
+      if [[ -f "$InstallDir/EFI/tools/gptsync.efi" ]] ; then
+         mv "$InstallDir/EFI/tools/gptsync.efi" "$InstallDir/EFI/tools/gptsync.efi-disabled"
          echo "Found old gptsync.efi; disabling it by renaming it to gptsync.efi-disabled"
       fi
    fi
@@ -262,23 +264,23 @@ CopyTools() {
 # Copy the rEFInd files to the ESP or OS X root partition.
 # Sets Problems=1 if any critical commands fail.
 CopyRefindFiles() {
-   mkdir -p $InstallDir/$TargetDir
-   if [[ $TargetDir == '/EFI/BOOT' ]] ; then
-      cp $RefindDir/refind_ia32.efi $InstallDir/$TargetDir/$TargetIA32 2> /dev/null
+   mkdir -p "$InstallDir/$TargetDir"
+   if [[ "$TargetDir" == '/EFI/BOOT' ]] ; then
+      cp "$RefindDir/refind_ia32.efi" "$InstallDir/$TargetDir/$TargetIA32" 2> /dev/null
       if [[ $? != 0 ]] ; then
          echo "Note: IA32 (x86) binary not installed!"
       fi
-      cp $RefindDir/refind_x64.efi $InstallDir/$TargetDir/$TargetX64 2> /dev/null
+      cp "$RefindDir/refind_x64.efi" "$InstallDir/$TargetDir/$TargetX64" 2> /dev/null
       if [[ $? != 0 ]] ; then
          Problems=1
       fi
-      if [[ $ShimSource != "none" ]] ; then
+      if [[ "$ShimSource" != "none" ]] ; then
          TargetShim="bootx64.efi"
          CopyShimFiles
       fi
       if [[ $InstallDrivers == "all" ]] ; then
-         cp -r $RefindDir/drivers_* $InstallDir/$TargetDir/ 2> /dev/null
-         cp -r $ThisDir/drivers_* $InstallDir/$TargetDir/ 2> /dev/null
+         cp -r "$RefindDir"/drivers_* "$InstallDir/$TargetDir/" 2> /dev/null
+         cp -r "$ThisDir"/drivers_* "$InstallDir/$TargetDir/" 2> /dev/null
       elif [[ $Upgrade == 1 ]] ; then
          if [[ $Platform == 'EFI64' ]] ; then
             CopyDrivers x64
@@ -291,7 +293,7 @@ CopyRefindFiles() {
       Refind=""
       CopyKeys
    elif [[ $Platform == 'EFI64' || $TargetDir == "/EFI/Microsoft/Boot" ]] ; then
-      cp $RefindDir/refind_x64.efi $InstallDir/$TargetDir/$TargetX64
+      cp "$RefindDir/refind_x64.efi" "$InstallDir/$TargetDir/$TargetX64"
       if [[ $? != 0 ]] ; then
          Problems=1
       fi
@@ -299,21 +301,21 @@ CopyRefindFiles() {
       CopyTools x64
       Refind="refind_x64.efi"
       CopyKeys
-      if [[ $ShimSource != "none" ]] ; then
-         if [[ $TargetShim == "default" ]] ; then
-            TargetShim=`basename $ShimSource`
+      if [[ "$ShimSource" != "none" ]] ; then
+         if [[ "$TargetShim" == "default" ]] ; then
+            TargetShim=`basename "$ShimSource"`
          fi
          CopyShimFiles
-         Refind=$TargetShim
+         Refind="$TargetShim"
          if [[ $LocalKeys == 0 ]] ; then
             echo "Storing copies of rEFInd Secure Boot public keys in $EtcKeysDir"
-            mkdir -p $EtcKeysDir
-            cp $ThisDir/keys/refind.cer $EtcKeysDir 2> /dev/null
-            cp $ThisDir/keys/refind.crt $EtcKeysDir 2> /dev/null
+            mkdir -p "$EtcKeysDir"
+            cp "$ThisDir/keys/refind.cer" "$EtcKeysDir" 2> /dev/null
+            cp "$ThisDir/keys/refind.crt" "$EtcKeysDir" 2> /dev/null
          fi
       fi
    elif [[ $Platform == 'EFI32' ]] ; then
-      cp $RefindDir/refind_ia32.efi $InstallDir/$TargetDir/$TargetIA32
+      cp "$RefindDir/refind_ia32.efi" "$InstallDir/$TargetDir/$TargetIA32"
       if [[ $? != 0 ]] ; then
          Problems=1
       fi
@@ -326,23 +328,23 @@ CopyRefindFiles() {
    fi
    echo "Copied rEFInd binary files"
    echo ""
-   if [[ -d $InstallDir/$TargetDir/icons ]] ; then
-      rm -rf $InstallDir/$TargetDir/icons-backup &> /dev/null
-      mv -f $InstallDir/$TargetDir/icons $InstallDir/$TargetDir/icons-backup
+   if [[ -d "$InstallDir/$TargetDir/icons" ]] ; then
+      rm -rf "$InstallDir/$TargetDir/icons-backup" &> /dev/null
+      mv -f "$InstallDir/$TargetDir/icons" "$InstallDir/$TargetDir/icons-backup"
       echo "Notice: Backed up existing icons directory as icons-backup."
    fi
-   cp -r $IconsDir $InstallDir/$TargetDir
+   cp -r "$IconsDir" "$InstallDir/$TargetDir"
    if [[ $? != 0 ]] ; then
       Problems=1
    fi
-   mkdir -p $InstallDir/$TargetDir/keys
-   cp -rf $ThisDir/keys/*.[cd]er $InstallDir/$TargetDir/keys/ 2> /dev/null
-   cp -rf $EtcKeysDir/*.[cd]er $InstallDir/$TargetDir/keys/ 2> /dev/null
-   if [[ -f $InstallDir/$TargetDir/refind.conf ]] ; then
+   mkdir -p "$InstallDir/$TargetDir/keys"
+   cp -rf "$ThisDir"/keys/*.[cd]er "$InstallDir/$TargetDir/keys/" 2> /dev/null
+   cp -rf "$EtcKeysDir"/*.[cd]er "$InstallDir/$TargetDir/keys/" 2> /dev/null
+   if [[ -f "$InstallDir/$TargetDir/refind.conf" ]] ; then
       echo "Existing refind.conf file found; copying sample file as refind.conf-sample"
       echo "to avoid overwriting your customizations."
       echo ""
-      cp -f $ConfFile $InstallDir/$TargetDir
+      cp -f "$ConfFile" "$InstallDir/$TargetDir"
       if [[ $? != 0 ]] ; then
          Problems=1
       fi
@@ -350,29 +352,29 @@ CopyRefindFiles() {
       echo "Copying sample configuration file as refind.conf; edit this file to configure"
       echo "rEFInd."
       echo ""
-      cp -f $ConfFile $InstallDir/$TargetDir/refind.conf
+      cp -f "$ConfFile" "$InstallDir/$TargetDir/refind.conf"
       if [[ $? != 0 ]] ; then
          Problems=1
       fi
    fi
    if [[ $DeleteRefindDir == 1 ]] ; then
       echo "Deleting the temporary directory $RefindDir"
-      rm -r $RefindDir
+      rm -r "$RefindDir"
    fi
 } # CopyRefindFiles()
 
 # Mount the partition the user specified with the --usedefault option
 MountDefaultTarget() {
    InstallDir=/tmp/refind_install
-   mkdir -p $InstallDir
+   mkdir -p "$InstallDir"
    if [[ $OSName == 'Darwin' ]] ; then
-      mount -t msdos $TargetPart $InstallDir
+      mount -t msdos "$TargetPart" "$InstallDir"
    elif [[ $OSName == 'Linux' ]] ; then
-      mount -t vfat $TargetPart $InstallDir
+      mount -t vfat "$TargetPart" "$InstallDir"
    fi
    if [[ $? != 0 ]] ; then
       echo "Couldn't mount $TargetPart ! Aborting!"
-      rmdir $InstallDir
+      rmdir "$InstallDir"
       exit 1
    fi
    UnmountEsp=1
@@ -392,11 +394,11 @@ MountOSXESP() {
    Temp=`diskutil list | grep " EFI "`
    Esp=/dev/`echo $Temp | cut -f 5 -d ' '`
    # If the ESP is mounted, use its current mount point....
-   Temp=`df | grep $Esp`
+   Temp=`df | grep "$Esp"`
    InstallDir=`echo $Temp | cut -f 6 -d ' '`
-   if [[ $InstallDir == '' ]] ; then
+   if [[ "$InstallDir" == '' ]] ; then
       mkdir /Volumes/ESP &> /dev/null
-      mount -t msdos $Esp /Volumes/ESP
+      mount -t msdos "$Esp" /Volumes/ESP
       if [[ $? != 0 ]] ; then
          echo "Unable to mount ESP! Aborting!\n"
          exit 1
@@ -410,20 +412,20 @@ MountOSXESP() {
 # Sets Problems=1 if problems found during the installation.
 InstallOnOSX() {
    echo "Installing rEFInd on OS X...."
-   if [[ $TargetDir == "/EFI/BOOT" ]] ; then
+   if [[ "$TargetDir" == "/EFI/BOOT" ]] ; then
       MountDefaultTarget
-   elif [[ $InstallToEspOnMac == "1" ]] ; then
+   elif [[ "$InstallToEspOnMac" == "1" ]] ; then
       MountOSXESP
    else
       InstallDir="$RootDir/"
    fi
-   echo "Installing rEFInd to the partition mounted at '$InstallDir'"
+   echo "Installing rEFInd to the partition mounted at $InstallDir"
    Platform=`ioreg -l -p IODeviceTree | grep firmware-abi | cut -d "\"" -f 4`
    CopyRefindFiles
    if [[ $InstallToEspOnMac == "1" ]] ; then
-      bless --mount $InstallDir --setBoot --file $InstallDir/$TargetDir/$Refind
-   elif [[ $TargetDir != "/EFI/BOOT" ]] ; then
-      bless --setBoot --folder $InstallDir/$TargetDir --file $InstallDir/$TargetDir/$Refind
+      bless --mount "$InstallDir" --setBoot --file "$InstallDir/$TargetDir/$Refind"
+   elif [[ "$TargetDir" != "/EFI/BOOT" ]] ; then
+      bless --setBoot --folder "$InstallDir/$TargetDir" --file "$InstallDir/$TargetDir/$Refind"
    fi
    if [[ $? != 0 ]] ; then
       Problems=1
@@ -465,7 +467,7 @@ InstallOnOSX() {
 # test can produce false alarms. A better test is highly desirable.
 CheckSecureBoot() {
    VarFile=`ls -d /sys/firmware/efi/vars/SecureBoot* 2> /dev/null`
-   if [[ -n $VarFile  && $TargetDir != '/EFI/BOOT' && $ShimSource == "none" ]] ; then
+   if [[ -n "$VarFile" && "$TargetDir" != '/EFI/BOOT' && "$ShimSource" == "none" ]] ; then
       echo ""
       echo "CAUTION: Your computer appears to support Secure Boot, but you haven't"
       echo "specified a valid shim.efi file source. If you've disabled Secure Boot and"
@@ -482,7 +484,7 @@ CheckSecureBoot() {
       fi
    fi
 
-   if [[ $ShimSource != "none" && ! -n $VarFile ]] ; then
+   if [[ "$ShimSource" != "none" && ! -n "$VarFile" ]] ; then
       echo ""
       echo "You've specified installing using a shim.efi file, but your computer does not"
       echo "appear to be running in Secure Boot mode. Although installing in this way"
@@ -500,7 +502,7 @@ CheckSecureBoot() {
       fi
    fi
 
-   if [[ $LocalKeys != 0 && ! -n $VarFile ]] ; then
+   if [[ $LocalKeys != 0 && ! -n "$VarFile" ]] ; then
       echo ""
       echo "You've specified re-signing your rEFInd binaries with locally-generated keys,"
       echo "but your computer does not appear to be running in Secure Boot mode. The"
@@ -523,39 +525,39 @@ CheckSecureBoot() {
 # $EtcKeysDir (/etc/refind.d/keys). If they're not present, generate them using
 # openssl.
 GenerateKeys() {
-   PrivateKey=$EtcKeysDir/$LocalKeysBase.key
-   CertKey=$EtcKeysDir/$LocalKeysBase.crt
-   DerKey=$EtcKeysDir/$LocalKeysBase.cer
+   PrivateKey="$EtcKeysDir/$LocalKeysBase.key"
+   CertKey="$EtcKeysDir/$LocalKeysBase.crt"
+   DerKey="$EtcKeysDir/$LocalKeysBase.cer"
    OpenSSL=`which openssl 2> /dev/null`
 
    # Do the work only if one or more of the necessary keys is missing
    # TODO: Technically, we don't need the DerKey; but if it's missing and openssl
    # is also missing, this will fail. This could be improved.
-   if [[ ! -f $PrivateKey || ! -f $CertKey || ! -f $DerKey ]] ; then
+   if [[ ! -f "$PrivateKey" || ! -f "$CertKey" || ! -f "$DerKey" ]] ; then
       echo "Generating a fresh set of local keys...."
-      mkdir -p $EtcKeysDir
-      chmod 0700 $EtcKeysDir
-      if [[ ! -x $OpenSSL ]] ; then
+      mkdir -p "$EtcKeysDir"
+      chmod 0700 "$EtcKeysDir"
+      if [[ ! -x "$OpenSSL" ]] ; then
          echo "Can't find openssl, which is required to create your private signing keys!"
          echo "Aborting!"
          exit 1
       fi
-      if [[ -f $PrivateKey ]] ; then
+      if [[ -f "$PrivateKey" ]] ; then
          echo "Backing up existing $PrivateKey"
-         cp -f $PrivateKey $PrivateKey.backup 2> /dev/null
+         cp -f "$PrivateKey" "$PrivateKey.backup" 2> /dev/null
       fi
-      if [[ -f $CertKey ]] ; then
+      if [[ -f "$CertKey" ]] ; then
          echo "Backing up existing $CertKey"
-         cp -f $CertKey $CertKey.backup 2> /dev/null
+         cp -f "$CertKey" "$CertKey.backup" 2> /dev/null
       fi
-      if [[ -f $DerKey ]] ; then
+      if [[ -f "$DerKey" ]] ; then
          echo "Backing up existing $DerKey"
-         cp -f $DerKey $DerKey.backup 2> /dev/null
+         cp -f "$DerKey" "$DerKey.backup" 2> /dev/null
       fi
-      $OpenSSL req -new -x509 -newkey rsa:2048 -keyout $PrivateKey -out $CertKey \
-                   -nodes -days 3650 -subj "/CN=Locally-generated rEFInd key/"
-      $OpenSSL x509 -in $CertKey -out $DerKey -outform DER
-      chmod 0600 $PrivateKey
+      "$OpenSSL" req -new -x509 -newkey rsa:2048 -keyout "$PrivateKey" -out "$CertKey" \
+                     -nodes -days 3650 -subj "/CN=Locally-generated rEFInd key/"
+      "$OpenSSL" x509 -in "$CertKey" -out "$DerKey" -outform DER
+      chmod 0600 "$PrivateKey"
    else
       echo "Using existing local keys...."
    fi
@@ -568,7 +570,7 @@ GenerateKeys() {
 # appropriately.
 # Aborts script on error
 SignOneBinary() {
-   $SBSign --key $PrivateKey --cert $CertKey --output $2 $1
+   $SBSign --key "$PrivateKey" --cert "$CertKey" --output "$2" "$1"
    if [[ $? != 0 ]] ; then
       echo "Problem signing the binary $1! Aborting!"
       exit 1
@@ -582,24 +584,27 @@ ReSignBinaries() {
    SBSign=`which sbsign 2> /dev/null`
    echo "Found sbsign at $SBSign"
    TempDir="/tmp/refind_local"
-   if [[ ! -x $SBSign ]] ; then
+   if [[ ! -x "$SBSign" ]] ; then
       echo "Can't find sbsign, which is required to sign rEFInd with your own keys!"
       echo "Aborting!"
       exit 1
    fi
    GenerateKeys
-   mkdir -p $TempDir/drivers_x64
-   cp $RefindDir/refind.conf-sample $TempDir 2> /dev/null
-   cp $ThisDir/refind.conf-sample $TempDir 2> /dev/null
-   cp $RefindDir/refind_ia32.efi $TempDir 2> /dev/null
-   cp -a $RefindDir/drivers_ia32 $TempDir 2> /dev/null
-   cp -a $ThisDir/drivers_ia32 $TempDir 2> /dev/null
-   SignOneBinary $RefindDir/refind_x64.efi $TempDir/refind_x64.efi
-   for Driver in `ls $RefindDir/drivers_x64/*.efi $ThisDir/drivers_x64/*.efi 2> /dev/null` ; do
-      TempName=`basename $Driver`
-      SignOneBinary $Driver $TempDir/drivers_x64/$TempName
+   mkdir -p "$TempDir/drivers_x64"
+   cp "$RefindDir/refind.conf-sample $TempDir" 2> /dev/null
+   cp "$ThisDir/refind.conf-sample $TempDir" 2> /dev/null
+   cp "$RefindDir/refind_ia32.efi $TempDir" 2> /dev/null
+   cp -a "$RefindDir/drivers_ia32 $TempDir" 2> /dev/null
+   cp -a "$ThisDir/drivers_ia32 $TempDir" 2> /dev/null
+   SignOneBinary "$RefindDir/refind_x64.efi" "$TempDir/refind_x64.efi"
+   SaveIFS=$IFS
+   IFS=$(echo -en "\n\b")
+   for Driver in `ls "$RefindDir"/drivers_x64/*.efi "$ThisDir"/drivers_x64/*.efi 2> /dev/null` ; do
+      TempName=`basename "$Driver"`
+      SignOneBinary "$Driver" "$TempDir/drivers_x64/$TempName"
    done
-   RefindDir=$TempDir
+   IFS=$SaveIFS
+   RefindDir="$TempDir"
    DeleteRefindDir=1
 }
 
@@ -608,14 +613,15 @@ ReSignBinaries() {
 # either location.
 # Sets InstallDir to the ESP mount point.
 FindLinuxESP() {
-   EspLine=`df $RootDir/boot/efi 2> /dev/null | grep boot/efi`
-   if [[ ! -n $EspLine ]] ; then
-      EspLine=`df $RootDir/boot | grep boot`
+   EspLine=`df "$RootDir/boot/efi" 2> /dev/null | grep boot/efi`
+   if [[ ! -n "$EspLine" ]] ; then
+      EspLine=`df "$RootDir"/boot | grep boot`
    fi
    InstallDir=`echo $EspLine | cut -d " " -f 6`
-   if [[ -n $InstallDir ]] ; then
-      EspFilesystem=`grep $InstallDir /etc/mtab | uniq | cut -d " " -f 3`
+   if [[ -n "$InstallDir" ]] ; then
+      EspFilesystem=`grep "$InstallDir" /etc/mtab | uniq | cut -d " " -f 3`
    fi
+   echo "EspFilesystem is '$EspFilesystem'"
    if [[ $EspFilesystem != 'vfat' ]] ; then
       echo "$RootDir/boot/efi doesn't seem to be on a VFAT filesystem. The ESP must be"
       echo "mounted at $RootDir/boot or $RootDir/boot/efi and it must be VFAT! Aborting!"
@@ -629,23 +635,23 @@ FindLinuxESP() {
 AddBootEntry() {
    InstallIt="0"
    Efibootmgr=`which efibootmgr 2> /dev/null`
-   if [[ $Efibootmgr ]] ; then
-      InstallDisk=`grep $InstallDir /etc/mtab | cut -d " " -f 1 | cut -c 1-8`
-      PartNum=`grep $InstallDir /etc/mtab | cut -d " " -f 1 | cut -c 9-10`
-      EntryFilename=$TargetDir/$Refind
+   if [[ "$Efibootmgr" ]] ; then
+      InstallDisk=`grep "$InstallDir" /etc/mtab | cut -d " " -f 1 | cut -c 1-8`
+      PartNum=`grep "$InstallDir" /etc/mtab | cut -d " " -f 1 | cut -c 9-10`
+      EntryFilename="$TargetDir/$Refind"
       EfiEntryFilename=`echo ${EntryFilename//\//\\\}`
       EfiEntryFilename2=`echo ${EfiEntryFilename} | sed s/\\\\\\\\/\\\\\\\\\\\\\\\\/g`
-      ExistingEntry=`$Efibootmgr -v | grep -i $EfiEntryFilename2`
+      ExistingEntry=`"$Efibootmgr" -v | grep -i "$EfiEntryFilename2"`
 
-      if [[ $ExistingEntry ]] ; then
-         ExistingEntryBootNum=`echo $ExistingEntry | cut -c 5-8`
-         FirstBoot=`$Efibootmgr | grep BootOrder | cut -c 12-15`
-         if [[ $ExistingEntryBootNum != $FirstBoot ]] ; then
+      if [[ "$ExistingEntry" ]] ; then
+         ExistingEntryBootNum=`echo "$ExistingEntry" | cut -c 5-8`
+         FirstBoot=`"$Efibootmgr" | grep BootOrder | cut -c 12-15`
+         if [[ "$ExistingEntryBootNum" != "$FirstBoot" ]] ; then
             echo "An existing rEFInd boot entry exists, but isn't set as the default boot"
             echo "manager. The boot order is being adjusted to make rEFInd the default boot"
             echo "manager. If this is NOT what you want, you should use efibootmgr to"
             echo "manually adjust your EFI's boot order."
-            $Efibootmgr -b $ExistingEntryBootNum -B &> /dev/null
+            "$Efibootmgr" -b $ExistingEntryBootNum -B &> /dev/null
             InstallIt="1"
          fi
       else
@@ -654,7 +660,7 @@ AddBootEntry() {
 
       if [[ $InstallIt == "1" ]] ; then
          echo "Installing it!"
-         $Efibootmgr -c -l $EfiEntryFilename -L "rEFInd Boot Manager" -d $InstallDisk -p $PartNum &> /dev/null
+         "$Efibootmgr" -c -l "$EfiEntryFilename" -L "rEFInd Boot Manager" -d $InstallDisk -p $PartNum &> /dev/null
          if [[ $? != 0 ]] ; then
             EfibootmgrProblems=1
             Problems=1
@@ -677,20 +683,20 @@ AddBootEntry() {
 
 # Create a minimal/sample refind_linux.conf file in /boot.
 GenerateRefindLinuxConf() {
-   if [[ -f $RLConfFile ]] ; then
+   if [[ -f "$RLConfFile" ]] ; then
       echo "Existing $RLConfFile found; not overwriting."
    else
       if [[ -f "$RootDir/etc/default/grub" ]] ; then
          # We want the default options used by the distribution, stored here....
          source "$RootDir/etc/default/grub"
       fi
-      RootFS=`df $RootDir | grep dev | cut -f 1 -d " "`
-      StartOfDevname=`echo $RootFS | cut -b 1-7`
-      if [[ $StartOfDevname == "/dev/sd" || $StartOfDevName == "/dev/hd" ]] ; then
+      RootFS=`df "$RootDir" | grep dev | cut -f 1 -d " "`
+      StartOfDevname=`echo "$RootFS" | cut -b 1-7`
+      if [[ "$StartOfDevname" == "/dev/sd" || "$StartOfDevName" == "/dev/hd" ]] ; then
          # Identify root filesystem by UUID rather than by device node, if possible
-         Uuid=`blkid -o export $RootFS 2> /dev/null | grep UUID=`
+         Uuid=`blkid -o export "$RootFS" 2> /dev/null | grep UUID=`
          if [[ -n $Uuid ]] ; then
-            RootFS=$Uuid
+            RootFS="$Uuid"
          fi
       fi
       DefaultOptions="$GRUB_CMDLINE_LINUX $GRUB_CMDLINE_LINUX_DEFAULT"
@@ -753,21 +759,21 @@ DetermineTargetDir() {
    fi
 
    if [[ ! -d /sys/firmware/efi && $Upgrade == 0 ]] ; then     # BIOS-mode
-      FoundEfiFiles=`find $InstallDir/EFI/BOOT -name "*.efi" 2> /dev/null`
-      FoundConfFiles=`find $InstallDir -name "refind\.conf" 2> /dev/null`
-      if [[ ! -n $FoundConfFiles && -f $InstallDir/EFI/Microsoft/Boot/bootmgfw.efi ]] ; then
-         mv -n $InstallDir/EFI/Microsoft/Boot/bootmgfw.efi $InstallDir/EFI/Microsoft &> /dev/null
+      FoundEfiFiles=`find "$InstallDir/EFI/BOOT" -name "*.efi" 2> /dev/null`
+      FoundConfFiles=`find "$InstallDir" -name "refind\.conf" 2> /dev/null`
+      if [[ ! -n "$FoundConfFiles" && -f "$InstallDir/EFI/Microsoft/Boot/bootmgfw.efi" ]] ; then
+         mv -n "$InstallDir/EFI/Microsoft/Boot/bootmgfw.efi" "$InstallDir/EFI/Microsoft" &> /dev/null
          SetVarsForMsBoot
          echo "Running in BIOS mode with a suspected Windows installation; moving boot loader"
          echo "files so as to install to $InstallDir$TargetDir."
-      elif [[ ! -n $FoundEfiFiles ]] ; then  # In BIOS mode and no default loader; install as default loader
+      elif [[ ! -n "$FoundEfiFiles" ]] ; then  # In BIOS mode and no default loader; install as default loader
          SetVarsForBoot
          echo "Running in BIOS mode with no existing default boot loader; installing to"
          echo $InstallDir$TargetDir
       else
          echo "Running in BIOS mode with an existing default boot loader; backing it up and"
          echo "installing rEFInd in its place."
-         if [[ -d $InstallDir/EFI/BOOT-rEFIndBackup ]] ; then
+         if [[ -d "$InstallDir/EFI/BOOT-rEFIndBackup" ]] ; then
             echo ""
             echo "Caution: An existing backup of a default boot loader exists! If the current"
             echo "default boot loader and the backup are different boot loaders, the current"
@@ -781,7 +787,7 @@ DetermineTargetDir() {
                exit 0
             fi
          fi
-         mv -n $InstallDir/EFI/BOOT $InstallDir/EFI/BOOT-rEFIndBackup
+         mv -n "$InstallDir/EFI/BOOT" "$InstallDir/EFI/BOOT-rEFIndBackup"
          SetVarsForBoot
       fi
    fi # BIOS-mode
@@ -807,10 +813,10 @@ InstallOnLinux() {
       # abort. Not in BIOS mode, though, since that could be used on an emergency
       # disc to try to recover a troubled Linux installation.
       if [[ -d /sys/firmware/efi ]] ; then
-         if [[ $ShimSource != "none" && $TargetDir != "/BOOT/EFI" ]] ; then
+         if [[ "$ShimSource" != "none" && "$TargetDir" != "/BOOT/EFI" ]] ; then
             echo ""
-            echo "CAUTION: Neither rEFInd nor shim currently supports 32-bit systems, so you"
-            echo "should not use the --shim option to install on such systems. Aborting!"
+            echo "CAUTION: shim does not currently supports 32-bit systems, so you should not"
+            echo "use the --shim option to install on such systems. Aborting!"
             echo ""
             exit 1
          fi
@@ -841,7 +847,7 @@ InstallOnLinux() {
 
    CheckSecureBoot
    CopyRefindFiles
-   if [[ $TargetDir != "/EFI/BOOT" && $TargetDir != "/EFI/Microsoft/Boot" ]] ; then
+   if [[ "$TargetDir" != "/EFI/BOOT" && "$TargetDir" != "/EFI/Microsoft/Boot" ]] ; then
       AddBootEntry
       GenerateRefindLinuxConf
    fi
@@ -854,13 +860,13 @@ InstallOnLinux() {
 #
 
 OSName=`uname -s`
-GetParams $@
+GetParams "$@"
 ThisDir="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 RefindDir="$ThisDir/refind"
 ThisScript="$ThisDir/`basename $0`"
 if [[ `whoami` != "root" ]] ; then
    echo "Not running as root; attempting to elevate privileges via sudo...."
-   sudo $ThisScript "$@"
+   sudo "$ThisScript" "$@"
    if [[ $? != 0 ]] ; then
       echo "This script must be run as root (or using sudo). Exiting!"
       exit 1
@@ -870,11 +876,11 @@ if [[ `whoami` != "root" ]] ; then
 fi
 CheckForFiles
 if [[ $OSName == 'Darwin' ]] ; then
-   if [[ $ShimSource != "none" ]] ; then
+   if [[ "$ShimSource" != "none" ]] ; then
       echo "The --shim option is not supported on OS X! Exiting!"
       exit 1
    fi
-   if [[ $LocalKeys != 0 ]] ; then
+   if [[ "$LocalKeys" != 0 ]] ; then
       echo "The --localkeys option is not supported on OS X! Exiting!"
       exit 1
    fi
@@ -903,7 +909,7 @@ if [[ $UnmountEsp ]] ; then
    umount $InstallDir
 fi
 
-if [[ $InstallDir == /tmp/refind_install ]] ; then
+if [[ "$InstallDir" == /tmp/refind_install ]] ; then
 #   sleep 5
-   rmdir $InstallDir
+   rmdir "$InstallDir"
 fi
index 2e4d392752f8aac89104c3647b8107fb5c836268..34e3bfa831faea9faf62ef50e5cc393ace087f59 100644 (file)
@@ -1,6 +1,6 @@
 Summary: EFI boot manager software
 Name: refind
-Version: 0.6.10
+Version: 0.6.11
 Release: 1%{?dist}
 Summary: EFI boot manager software
 License: GPLv3
@@ -154,5 +154,5 @@ fi
 # wiping out the just-updated files.
 
 %changelog
-* Sun Feb 3 2013 R Smith <rodsmith@rodsbooks.com> - 0.6.9
-- Created spec file for 0.6.9 release
+* Mon May 13 2013 R Smith <rodsmith@rodsbooks.com> - 0.6.11
+- Created spec file for 0.6.11 release
index cd0fb24cd13adc55a13829d2981e2545b50645cc..a11dea96000a58791690980ce672f42ec5fbb88b 100644 (file)
@@ -124,7 +124,7 @@ REFIT_CONFIG GlobalConfig = { FALSE, FALSE, 0, 0, 0, DONT_CHANGE_TEXT_MODE, 20,
                                 0, 0, 0, 0, 0, 0 }
                             };
 
-const EFI_GUID GlobalGuid = EFI_GLOBAL_VARIABLE;
+EFI_GUID GlobalGuid = EFI_GLOBAL_VARIABLE;
 
 // Structure used to hold boot loader filenames and time stamps in
 // a linked list; used to sort entries within a directory.
@@ -144,7 +144,7 @@ static VOID AboutrEFInd(VOID)
 
     if (AboutMenu.EntryCount == 0) {
         AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT);
-        AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.6.10.2");
+        AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.6.11");
         AddMenuInfoLine(&AboutMenu, L"");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012-2013 Roderick W. Smith");
@@ -322,19 +322,17 @@ static EFI_STATUS StartEFIImage(IN EFI_DEVICE_PATH *DevicePath,
 
 // From gummiboot: Retrieve a raw EFI variable.
 // Returns EFI status
-static EFI_STATUS EfivarGetRaw(const EFI_GUID *vendor, CHAR16 *name, CHAR8 **buffer, UINTN *size) {
+static EFI_STATUS EfivarGetRaw(EFI_GUID *vendor, CHAR16 *name, CHAR8 **buffer, UINTN *size) {
    CHAR8 *buf;
    UINTN l;
    EFI_STATUS err;
-   EFI_GUID vendor2;
 
-   CopyMem(&vendor2, vendor, sizeof(EFI_GUID));
    l = sizeof(CHAR16 *) * EFI_MAXIMUM_VARIABLE_SIZE;
    buf = AllocatePool(l);
    if (!buf)
       return EFI_OUT_OF_RESOURCES;
 
-   err = refit_call5_wrapper(RT->GetVariable, name, &vendor2, NULL, &l, buf);
+   err = refit_call5_wrapper(RT->GetVariable, name, vendor, NULL, &l, buf);
    if (EFI_ERROR(err) == EFI_SUCCESS) {
       *buffer = buf;
       if (size)
@@ -345,16 +343,14 @@ static EFI_STATUS EfivarGetRaw(const EFI_GUID *vendor, CHAR16 *name, CHAR8 **buf
 } // EFI_STATUS EfivarGetRaw()
 
 // From gummiboot: Set an EFI variable
-static EFI_STATUS EfivarSetRaw(const EFI_GUID *vendor, CHAR16 *name, CHAR8 *buf, UINTN size, BOOLEAN persistent) {
+static EFI_STATUS EfivarSetRaw(EFI_GUID *vendor, CHAR16 *name, CHAR8 *buf, UINTN size, BOOLEAN persistent) {
    UINT32 flags;
-   EFI_GUID vendor2;
 
-   CopyMem(&vendor2, vendor, sizeof(EFI_GUID));
    flags = EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS;
    if (persistent)
       flags |= EFI_VARIABLE_NON_VOLATILE;
 
-   return refit_call5_wrapper(RT->SetVariable, name, &vendor2, flags, size, buf);
+   return refit_call5_wrapper(RT->SetVariable, name, vendor, flags, size, buf);
 } // EFI_STATUS EfivarSetRaw()
 
 // From gummiboot: Reboot the computer into its built-in user interface
@@ -811,6 +807,34 @@ static CHAR16 * GetMainLinuxOptions(IN CHAR16 * LoaderPath, IN REFIT_VOLUME *Vol
    return (FullOptions);
 } // static CHAR16 * GetMainLinuxOptions()
 
+// Try to guess the name of the Linux distribution & add that name to
+// OSIconName list.
+static VOID GuessLinuxDistribution(CHAR16 **OSIconName, REFIT_VOLUME *Volume, CHAR16 *LoaderPath) {
+   UINTN       FileSize = 0;
+   REFIT_FILE  File;
+   CHAR16**    TokenList;
+   UINTN       TokenCount = 0;
+
+   // If on Linux root fs, /etc/os-release file probably has clues....
+   if (FileExists(Volume->RootDir, L"etc\\os-release") &&
+       (ReadFile(Volume->RootDir, L"etc\\os-release", &File, &FileSize) == EFI_SUCCESS)) {
+      do {
+         TokenCount = ReadTokenLine(&File, &TokenList);
+         if ((TokenCount > 1) && ((StriCmp(TokenList[0], L"ID") == 0) || (StriCmp(TokenList[0], L"NAME") == 0))) {
+            MergeStrings(OSIconName, TokenList[1], L',');
+         } // if
+         FreeTokenLine(&TokenList, &TokenCount);
+      } while (TokenCount > 0);
+      MyFreePool(File.Buffer);
+   } // if
+
+   // Search for clues in the kernel's filename....
+   if (StriSubCmp(L".fc", LoaderPath))
+      MergeStrings(OSIconName, L"fedora", L',');
+   if (StriSubCmp(L".el", LoaderPath))
+      MergeStrings(OSIconName, L"redhat", L',');
+} // VOID GuessLinuxDistribution()
+
 // Sets a few defaults for a loader entry -- mainly the icon, but also the OS type
 // code and shortcut letter. For Linux EFI stub loaders, also sets kernel options
 // that will (with luck) work fairly automatically.
@@ -862,6 +886,7 @@ VOID SetLoaderDefaults(LOADER_ENTRY *Entry, CHAR16 *LoaderPath, REFIT_VOLUME *Vo
 
    // detect specific loaders
    if (StriSubCmp(L"bzImage", LoaderPath) || StriSubCmp(L"vmlinuz", LoaderPath)) {
+      GuessLinuxDistribution(&OSIconName, Volume, LoaderPath);
       MergeStrings(&OSIconName, L"linux", L',');
       Entry->OSType = 'L';
       if (ShortcutLetter == 0)
@@ -872,6 +897,10 @@ VOID SetLoaderDefaults(LOADER_ENTRY *Entry, CHAR16 *LoaderPath, REFIT_VOLUME *Vo
       MergeStrings(&OSIconName, L"refit", L',');
       Entry->OSType = 'R';
       ShortcutLetter = 'R';
+   } else if (StriSubCmp(L"refind", LoaderPath)) {
+      MergeStrings(&OSIconName, L"refind", L',');
+      Entry->OSType = 'R';
+      ShortcutLetter = 'R';
    } else if (StriCmp(LoaderPath, MACOSX_LOADER_PATH) == 0) {
       if (Volume->VolIconImage != NULL) { // custom icon file found
          Entry->me.Image = Volume->VolIconImage;
@@ -1100,6 +1129,38 @@ static BOOLEAN DuplicatesFallback(IN REFIT_VOLUME *Volume, IN CHAR16 *FileName)
    return AreIdentical;
 } // BOOLEAN DuplicatesFallback()
 
+// Returns FALSE if two measures of file size are identical for a single file,
+// TRUE if not or if the file can't be opened and the other measure is non-0.
+// Despite the function's name, this isn't really a direct test of symbolic
+// link status, since EFI doesn't officially support symlinks. It does seem
+// to be a reliable indicator, though. (OTOH, some disk errors might cause a
+// file to fail to open, which would return a false positive -- but as I use
+// this function to exclude symbolic links from the list of boot loaders,
+// that would be fine, since such boot loaders wouldn't work.)
+static BOOLEAN IsSymbolicLink(REFIT_VOLUME *Volume, CHAR16 *Path, EFI_FILE_INFO *DirEntry) {
+   EFI_FILE_HANDLE FileHandle;
+   EFI_FILE_INFO   *FileInfo = NULL;
+   EFI_STATUS      Status;
+   UINTN           FileSize2 = 0;
+   CHAR16          *FileName;
+
+   FileName = StrDuplicate(Path);
+   MergeStrings(&FileName, DirEntry->FileName, L'\\');
+   CleanUpPathNameSlashes(FileName);
+
+   Status = refit_call5_wrapper(Volume->RootDir->Open, Volume->RootDir, &FileHandle, FileName, EFI_FILE_MODE_READ, 0);
+   if (Status == EFI_SUCCESS) {
+      FileInfo = LibFileInfo(FileHandle);
+      if (FileInfo != NULL)
+         FileSize2 = FileInfo->FileSize;
+   }
+
+   MyFreePool(FileName);
+   MyFreePool(FileInfo);
+
+   return (DirEntry->FileSize != FileSize2);
+} // BOOLEAN IsSymbolicLink()
+
 // Scan an individual directory for EFI boot loader files and, if found,
 // add them to the list. Exception: Ignores FALLBACK_FULLNAME, which is picked
 // up in ScanEfiFiles(). Sorts the entries within the loader directory so that
@@ -1126,6 +1187,7 @@ static BOOLEAN ScanLoaderDir(IN REFIT_VOLUME *Volume, IN CHAR16 *Path, IN CHAR16
               StriCmp(Extension, L".png") == 0 ||
               (StriCmp(DirEntry->FileName, FALLBACK_BASENAME) == 0 && (StriCmp(Path, L"EFI\\BOOT") == 0)) ||
               StriSubCmp(L"shell", DirEntry->FileName) ||
+              IsSymbolicLink(Volume, Path, DirEntry) || /* is symbolic link */
               IsIn(DirEntry->FileName, GlobalConfig.DontScanFiles))
                 continue;   // skip this