]> TLD Linux GIT Repositories - packages/grub2.git/commitdiff
- grub2 from PLD
authorMarcin Krol <hawk@tld-linux.org>
Sat, 20 Apr 2013 17:57:06 +0000 (17:57 +0000)
committerMarcin Krol <hawk@tld-linux.org>
Sat, 20 Apr 2013 17:57:06 +0000 (17:57 +0000)
27 files changed:
Issue-separate-DNS-queries-for-ipv4-and-ipv6.patch [new file with mode: 0644]
add-GRUB-DISABLE-SUBMENU-option.patch [new file with mode: 0644]
add-X-option-to-printf-functions.patch [new file with mode: 0644]
add-vlan-tag-support.patch [new file with mode: 0644]
choose-preferred-initrd.patch [new file with mode: 0644]
dhcp-client-id-and-uuid-options-added.patch [new file with mode: 0644]
fix-http-crash.patch [new file with mode: 0644]
grub-custom.cfg [new file with mode: 0644]
grub-garbage.patch [new file with mode: 0644]
grub-lvmdevice.patch [new file with mode: 0644]
grub-mkconfig-diagnostics.patch [new file with mode: 0644]
grub.sysconfig [new file with mode: 0644]
grub2-awk.patch [new file with mode: 0644]
grub2-fonts_path.patch [new file with mode: 0644]
grub2-gets.patch [new file with mode: 0644]
grub2-tftp_fix.patch [new file with mode: 0644]
grub2.spec [new file with mode: 0644]
ignore-kernel-symlinks.patch [new file with mode: 0644]
just-say-linux.patch [new file with mode: 0644]
pld-mkconfigdir.patch [new file with mode: 0644]
pld-sysconfdir.patch [new file with mode: 0644]
posix.patch [new file with mode: 0644]
ppc.patch [new file with mode: 0644]
search-for-specific-config-file-for-netboot.patch [new file with mode: 0644]
sort-version.patch [new file with mode: 0644]
update-grub [new file with mode: 0644]
update-grub.8 [new file with mode: 0644]

diff --git a/Issue-separate-DNS-queries-for-ipv4-and-ipv6.patch b/Issue-separate-DNS-queries-for-ipv4-and-ipv6.patch
new file mode 100644 (file)
index 0000000..953f2bd
--- /dev/null
@@ -0,0 +1,230 @@
+From 3e00d82827f80461f9fe6da37acd84235c08e5a5 Mon Sep 17 00:00:00 2001
+From: Gustavo Luiz Duarte <gustavold@linux.vnet.ibm.com>
+Date: Fri, 28 Sep 2012 19:42:07 -0400
+Subject: [PATCH] Issue separate DNS queries for ipv4 and ipv6
+
+Adding multiple questions on a single DNS query is not supportted by
+most DNS servers. This patch issues two separate DNS queries
+sequentially for ipv4 and then for ipv6.
+
+There are 4 possible config options:
+ DNS_OPTION_IPV4: issue only one ipv4 query
+ DNS_OPTION_IPV6: issue only one ipv6 query
+ DNS_OPTION_PREFER_IPV4: issue the ipv4 query first and fallback to ipv6
+ DNS_OPTION_PREFER_IPV6: issue the ipv6 query first and fallback to ipv4
+However, there is no code yet to set such config option. The default is
+DNS_OPTION_PREFER_IPV4.
+
+Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=860829
+---
+ grub-core/net/dns.c | 99 ++++++++++++++++++++++++++++++++++++-----------------
+ include/grub/net.h  |  9 +++++
+ 2 files changed, 76 insertions(+), 32 deletions(-)
+
+diff --git a/grub-core/net/dns.c b/grub-core/net/dns.c
+index 3381ea7..725725c 100644
+--- a/grub-core/net/dns.c
++++ b/grub-core/net/dns.c
+@@ -34,6 +34,14 @@ struct dns_cache_element
+ #define DNS_CACHE_SIZE 1021
+ #define DNS_HASH_BASE 423
++typedef enum grub_dns_qtype_id
++  {
++    GRUB_DNS_QTYPE_A = 1,
++    GRUB_DNS_QTYPE_AAAA = 28
++  } grub_dns_qtype_id_t;
++
++static grub_dns_option_t dns_type_option = DNS_OPTION_PREFER_IPV4;
++
+ static struct dns_cache_element dns_cache[DNS_CACHE_SIZE];
+ static struct grub_net_network_level_address *dns_servers;
+ static grub_size_t dns_nservers, dns_servers_alloc;
+@@ -410,13 +418,13 @@ recv_hook (grub_net_udp_socket_t sock __attribute__ ((unused)),
+   return GRUB_ERR_NONE;
+ }
+-grub_err_t
+-grub_net_dns_lookup (const char *name,
++static grub_err_t
++grub_net_dns_lookup_qtype (const char *name,
+                    const struct grub_net_network_level_address *servers,
+                    grub_size_t n_servers,
+                    grub_size_t *naddresses,
+                    struct grub_net_network_level_address **addresses,
+-                   int cache)
++                   int cache, grub_dns_qtype_id_t qtype)
+ {
+   grub_size_t send_servers = 0;
+   grub_size_t i, j;
+@@ -471,8 +479,7 @@ grub_net_dns_lookup (const char *name,
+                          + GRUB_NET_MAX_LINK_HEADER_SIZE
+                          + GRUB_NET_UDP_HEADER_SIZE
+                          + sizeof (struct dns_header)
+-                         + grub_strlen (name) + 2 + 4
+-                         + 2 + 4);
++                         + grub_strlen (name) + 2 + 4);
+   if (!nb)
+     {
+       grub_free (data.name);
+@@ -482,7 +489,7 @@ grub_net_dns_lookup (const char *name,
+                       + GRUB_NET_MAX_LINK_HEADER_SIZE
+                       + GRUB_NET_UDP_HEADER_SIZE);
+   grub_netbuff_put (nb, sizeof (struct dns_header)
+-                  + grub_strlen (name) + 2 + 4 + 2 + 4);
++                  + grub_strlen (name) + 2 + 4);
+   head = (struct dns_header *) nb->data;
+   optr = (grub_uint8_t *) (head + 1);
+   for (iptr = name; *iptr; )
+@@ -509,18 +516,7 @@ grub_net_dns_lookup (const char *name,
+   /* Type: A.  */
+   *optr++ = 0;
+-  *optr++ = 1;
+-
+-  /* Class.  */
+-  *optr++ = 0;
+-  *optr++ = 1;
+-
+-  /* Compressed name.  */
+-  *optr++ = 0xc0;
+-  *optr++ = 0x0c;
+-  /* Type: AAAA.  */
+-  *optr++ = 0;
+-  *optr++ = 28;
++  *optr++ = qtype;
+   /* Class.  */
+   *optr++ = 0;
+@@ -529,7 +525,7 @@ grub_net_dns_lookup (const char *name,
+   head->id = data.id;
+   head->flags = FLAGS_RD;
+   head->ra_z_r_code = 0;
+-  head->qdcount = grub_cpu_to_be16_compile_time (2);
++  head->qdcount = grub_cpu_to_be16_compile_time (1);
+   head->ancount = grub_cpu_to_be16_compile_time (0);
+   head->nscount = grub_cpu_to_be16_compile_time (0);
+   head->arcount = grub_cpu_to_be16_compile_time (0);
+@@ -587,16 +583,47 @@ grub_net_dns_lookup (const char *name,
+   if (*data.naddresses)
+     return GRUB_ERR_NONE;
+   if (data.dns_err)
+-    return grub_error (GRUB_ERR_NET_NO_DOMAIN,
+-                     N_("no DNS record found"));
+-    
++    {
++      grub_dprintf ("dns", "%s. QTYPE: %u QNAME: %s\n",
++                    N_("no DNS record found"), qtype, name);
++      return GRUB_ERR_NET_NO_DOMAIN;
++    }
+   if (err)
+     {
+       grub_errno = err;
+       return err;
+     }
+-  return grub_error (GRUB_ERR_TIMEOUT,
+-                   N_("no DNS reply received"));
++  grub_dprintf ("dns", "%s. QTYPE: %u QNAME: %s\n",
++                N_("no DNS reply received"), qtype, name);
++  return GRUB_ERR_TIMEOUT;
++}
++
++grub_err_t
++grub_net_dns_lookup (const char *name,
++                   const struct grub_net_network_level_address *servers,
++                   grub_size_t n_servers,
++                   grub_size_t *naddresses,
++                   struct grub_net_network_level_address **addresses,
++                   int cache)
++{
++  if (dns_type_option == DNS_OPTION_IPV6 || dns_type_option == DNS_OPTION_PREFER_IPV6)
++      grub_net_dns_lookup_qtype (name, servers, n_servers, naddresses,
++                                 addresses, cache, GRUB_DNS_QTYPE_AAAA);
++  else
++      grub_net_dns_lookup_qtype (name, servers, n_servers, naddresses,
++                                 addresses, cache, GRUB_DNS_QTYPE_A);
++  if (!*naddresses)
++    {
++      if (dns_type_option == DNS_OPTION_PREFER_IPV4)
++          grub_net_dns_lookup_qtype (name, servers, n_servers, naddresses,
++                                     addresses, cache, GRUB_DNS_QTYPE_AAAA);
++      else if (dns_type_option == DNS_OPTION_PREFER_IPV6)
++          grub_net_dns_lookup_qtype (name, servers, n_servers, naddresses,
++                                     addresses, cache, GRUB_DNS_QTYPE_A);
++    }
++  if (!*naddresses)
++      return GRUB_ERR_NET_NO_DOMAIN;
++  return GRUB_ERR_NONE;
+ }
+ static grub_err_t
+@@ -604,22 +631,28 @@ grub_cmd_nslookup (struct grub_command *cmd __attribute__ ((unused)),
+                  int argc, char **args)
+ {
+   grub_err_t err;
+-  grub_size_t naddresses, i;
++  struct grub_net_network_level_address cmd_server;
++  struct grub_net_network_level_address *servers;
++  grub_size_t nservers, i, naddresses = 0;
+   struct grub_net_network_level_address *addresses = 0;
+   if (argc != 2 && argc != 1)
+     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("two arguments expected"));
+   if (argc == 2)
+     {
+-      struct grub_net_network_level_address server;
+-      err = grub_net_resolve_address (args[1], &server);
++      err = grub_net_resolve_address (args[1], &cmd_server);
+       if (err)
+       return err;
+-      err = grub_net_dns_lookup (args[0], &server, 1, &naddresses,
+-                               &addresses, 0);
++      servers = &cmd_server;
++      nservers = 1;
+     }
+   else
+-    err = grub_net_dns_lookup (args[0], dns_servers, dns_nservers, &naddresses,
+-                             &addresses, 0);
++    {
++      servers = dns_servers;
++      nservers = dns_nservers;
++    }
++
++  grub_net_dns_lookup (args[0], servers, nservers, &naddresses,
++                       &addresses, 0);
+   for (i = 0; i < naddresses; i++)
+     {
+@@ -628,7 +661,9 @@ grub_cmd_nslookup (struct grub_command *cmd __attribute__ ((unused)),
+       grub_printf ("%s\n", buf);
+     }
+   grub_free (addresses);
+-  return GRUB_ERR_NONE;
++  if (naddresses)
++    return GRUB_ERR_NONE;
++  return grub_error (GRUB_ERR_NET_NO_DOMAIN, N_("no DNS record found"));
+ }
+ static grub_err_t
+diff --git a/include/grub/net.h b/include/grub/net.h
+index 3877451..a7e5b2c 100644
+--- a/include/grub/net.h
++++ b/include/grub/net.h
+@@ -505,6 +505,15 @@ grub_err_t
+ grub_net_link_layer_resolve (struct grub_net_network_level_interface *inf,
+                            const grub_net_network_level_address_t *proto_addr,
+                            grub_net_link_level_address_t *hw_addr);
++
++typedef enum
++  {
++    DNS_OPTION_IPV4,
++    DNS_OPTION_IPV6,
++    DNS_OPTION_PREFER_IPV4,
++    DNS_OPTION_PREFER_IPV6
++  } grub_dns_option_t;
++
+ grub_err_t
+ grub_net_dns_lookup (const char *name,
+                    const struct grub_net_network_level_address *servers,
+-- 
+1.7.11.4
+
diff --git a/add-GRUB-DISABLE-SUBMENU-option.patch b/add-GRUB-DISABLE-SUBMENU-option.patch
new file mode 100644 (file)
index 0000000..54f733d
--- /dev/null
@@ -0,0 +1,114 @@
+From 81e46875469ae8b2a803e6457784801a0a7a7963 Mon Sep 17 00:00:00 2001
+From: Prarit Bhargava <prarit@redhat.com>
+Date: Thu, 7 Feb 2013 11:53:41 -0500
+Subject: [PATCH] add GRUB_DISABLE_SUBMENU option
+
+This patch adds the ability to disable the grub2 submenus from
+/etc/default/grub
+
+To disable the submenus
+
+echo 'GRUB_DISABLE_SUBMENU="true"' >> /etc/default/grub
+
+
+---
+ util/grub-mkconfig.in   |  3 ++-
+ util/grub.d/10_linux.in | 24 ++++++++++++++----------
+ 2 files changed, 16 insertions(+), 11 deletions(-)
+
+diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in
+index 516be86..354eb43 100644
+--- a/util/grub-mkconfig.in
++++ b/util/grub-mkconfig.in
+@@ -216,7 +216,8 @@ export GRUB_DEFAULT \
+   GRUB_INIT_TUNE \
+   GRUB_SAVEDEFAULT \
+   GRUB_ENABLE_CRYPTODISK \
+-  GRUB_BADRAM
++  GRUB_BADRAM \
++  GRUB_DISABLE_SUBMENU
+ if test "x${grub_cfg}" != "x"; then
+   rm -f "${grub_cfg}.new"
+diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
+index e2b8ab3..9427a39 100644
+--- a/util/grub.d/10_linux.in
++++ b/util/grub.d/10_linux.in
+@@ -240,17 +240,19 @@ while [ "x$list" != "x" ] ; do
+     linux_root_device_thisversion=${GRUB_DEVICE}
+   fi
+-  if [ "x$is_first_entry" = xtrue ]; then
+-    linux_entry "${OS}" "${version}" simple \
+-    "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
++  if [ "x${GRUB_DISABLE_SUBMENU}" != xtrue ]; then
++    if [ "x$is_first_entry" = xtrue ]; then
++      linux_entry "${OS}" "${version}" simple \
++      "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
+-    submenu_indentation="\t"
++      submenu_indentation="\t"
+     
+-    if [ -z "$boot_device_id" ]; then
+-      boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
++      if [ -z "$boot_device_id" ]; then
++        boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
++      fi
++      # TRANSLATORS: %s is replaced with an OS name
++      echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {"
+     fi
+-    # TRANSLATORS: %s is replaced with an OS name
+-    echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {"
+   fi
+   linux_entry "${OS}" "${version}" advanced \
+@@ -266,8 +268,10 @@ done
+ # If at least one kernel was found, then we need to
+ # add a closing '}' for the submenu command.
+-if [ x"$is_first_entry" != xtrue ]; then
+-  echo '}'
++if [ "x${GRUB_DISABLE_SUBMENU}" != xtrue ]; then
++  if [ x"$is_first_entry" != xtrue ]; then
++    echo '}'
++  fi
+ fi
+ echo "$title_correction_code"
+--- grub-2.00/util/grub.d/20_linux_xen.in~     2013-04-15 00:03:09.162253769 +0200
++++ grub-2.00/util/grub.d/20_linux_xen.in      2013-04-15 00:18:49.254774567 +0200
+@@ -232,7 +232,8 @@
+           linux_root_device_thisversion=${GRUB_DEVICE}
+       fi
+-      if [ "x$is_first_entry" = xtrue ]; then
++        if [ "x${GRUB_DISABLE_SUBMENU}" != xtrue ]; then
++        if [ "x$is_first_entry" = xtrue ]; then
+           linux_entry "${OS}" "${version}" "${xen_version}" simple \
+               "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" "${GRUB_CMDLINE_XEN} ${GRUB_CMDLINE_XEN_DEFAULT}"
+@@ -243,9 +244,10 @@
+           fi
+             # TRANSLATORS: %s is replaced with an OS name
+           echo "submenu '$(gettext_printf "Advanced options for %s (with Xen hypervisor)" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {"
+-      echo "  submenu '$(gettext_printf "Xen hypervisor, version %s" "${xen_version}" | grub_quote)' \$menuentry_id_option 'xen-hypervisor-$xen_version-$boot_device_id' {"
++          echo "      submenu '$(gettext_printf "Xen hypervisor, version %s" "${xen_version}" | grub_quote)' \$menuentry_id_option 'xen-hypervisor-$xen_version-$boot_device_id' {"
++        fi
++        is_first_entry=false
+       fi
+-      is_first_entry=false
+       linux_entry "${OS}" "${version}" "${xen_version}" advanced \
+           "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" "${GRUB_CMDLINE_XEN} ${GRUB_CMDLINE_XEN_DEFAULT}"
+@@ -256,8 +258,10 @@
+       list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
+     done
+-    if [ x"$is_first_entry" != xtrue ]; then
++    if [ "x${GRUB_DISABLE_SUBMENU}" != xtrue ]; then
++      if [ x"$is_first_entry" != xtrue ]; then
+       echo '  }'
++      fi
+     fi
+     xen_list=`echo $xen_list | tr ' ' '\n' | grep -vx $current_xen | tr '\n' ' '`
+ done
diff --git a/add-X-option-to-printf-functions.patch b/add-X-option-to-printf-functions.patch
new file mode 100644 (file)
index 0000000..63d7b79
--- /dev/null
@@ -0,0 +1,58 @@
+From 80f81f233bf74aac740d7a299d075ea46c9c7bd4 Mon Sep 17 00:00:00 2001
+From: Paulo Flabiano Smorigo <pfsmorigo@br.ibm.com>
+Date: Tue, 27 Nov 2012 16:58:39 -0200
+Subject: [PATCH 1/3] Add %X option to printf functions.
+
+---
+ grub-core/kern/misc.c |    7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c
+index 95d4624..8ac087a 100644
+--- a/grub-core/kern/misc.c
++++ b/grub-core/kern/misc.c
+@@ -596,7 +596,7 @@ grub_divmod64 (grub_uint64_t n, grub_uint64_t d, grub_uint64_t *r)
+ static char *
+ grub_lltoa (char *str, int c, unsigned long long n)
+ {
+-  unsigned base = (c == 'x') ? 16 : 10;
++  unsigned base = ((c == 'x') || (c == 'X')) ? 16 : 10;
+   char *p;
+   if ((long long) n < 0 && c == 'd')
+@@ -611,7 +611,7 @@ grub_lltoa (char *str, int c, unsigned long long n)
+     do
+       {
+       unsigned d = (unsigned) (n & 0xf);
+-      *p++ = (d > 9) ? d + 'a' - 10 : d + '0';
++      *p++ = (d > 9) ? d + ((c == 'x') ? 'a' : 'A') - 10 : d + '0';
+       }
+     while (n >>= 4);
+   else
+@@ -702,6 +702,7 @@ grub_vsnprintf_real (char *str, grub_size_t max_len, const char *fmt0, va_list a
+       {
+       case 'p':
+       case 'x':
++      case 'X':
+       case 'u':
+       case 'd':
+       case 'c':
+@@ -777,6 +778,7 @@ grub_vsnprintf_real (char *str, grub_size_t max_len, const char *fmt0, va_list a
+       switch (c)
+       {
+       case 'x':
++      case 'X':
+       case 'u':
+       case 'd':
+         if (longlongfmt)
+@@ -918,6 +920,7 @@ grub_vsnprintf_real (char *str, grub_size_t max_len, const char *fmt0, va_list a
+         longlongfmt |= (sizeof (void *) == sizeof (long long));
+         /* Fall through. */
+       case 'x':
++      case 'X':
+       case 'u':
+         unsig = 1;
+         /* Fall through. */
+-- 
+1.7.10.4
+
diff --git a/add-vlan-tag-support.patch b/add-vlan-tag-support.patch
new file mode 100644 (file)
index 0000000..be01c58
--- /dev/null
@@ -0,0 +1,185 @@
+From 5573f16fd05c1f8f310f2ead176b52ed6d4a08ec Mon Sep 17 00:00:00 2001
+From: Paulo Flabiano Smorigo <pfsmorigo@br.ibm.com>
+Date: Tue, 30 Oct 2012 15:19:39 -0200
+Subject: [PATCH] Add vlan-tag support
+
+This patch adds support for virtual LAN (VLAN) tagging. VLAN tagging allows
+multiple VLANs in a bridged network to share the same physical network link but
+maintain isolation:
+
+http://en.wikipedia.org/wiki/IEEE_802.1Q
+
+This patch should fix this bugzilla:
+https://bugzilla.redhat.com/show_bug.cgi?id=871563
+---
+ grub-core/kern/ieee1275/init.c   |    1 +
+ grub-core/kern/ieee1275/openfw.c |   30 +++++++++++++++++++++++++++
+ grub-core/net/ethernet.c         |   42 +++++++++++++++++++++++++++++++++++---
+ include/grub/ieee1275/ieee1275.h |    1 +
+ include/grub/net.h               |    2 ++
+ 5 files changed, 73 insertions(+), 3 deletions(-)
+
+diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
+index 5c45947..209cf8a 100644
+--- a/grub-core/kern/ieee1275/init.c
++++ b/grub-core/kern/ieee1275/init.c
+@@ -102,6 +102,7 @@ grub_machine_get_bootlocation (char **device, char **path)
+       char *dev, *canon;
+       char *ptr;
+       dev = grub_ieee1275_get_aliasdevname (bootpath);
++      grub_ieee1275_parse_net_options (bootpath);
+       canon = grub_ieee1275_canonicalise_devname (dev);
+       ptr = canon + grub_strlen (canon) - 1;
+       while (ptr > canon && (*ptr == ',' || *ptr == ':'))
+diff --git a/grub-core/kern/ieee1275/openfw.c b/grub-core/kern/ieee1275/openfw.c
+index c2b1bdf..9fdfafa 100644
+--- a/grub-core/kern/ieee1275/openfw.c
++++ b/grub-core/kern/ieee1275/openfw.c
+@@ -23,6 +23,7 @@
+ #include <grub/mm.h>
+ #include <grub/ieee1275/ieee1275.h>
+ #include <grub/net.h>
++#include <grub/env.h>
+ enum grub_ieee1275_parse_type
+ {
+@@ -413,6 +414,35 @@ fail:
+   return ret;
+ }
++int
++grub_ieee1275_parse_net_options (const char *path)
++{
++  char *comma;
++  char *args;
++  char *option = 0;
++
++  args = grub_ieee1275_get_devargs (path);
++  if (!args)
++    /* There is no option.  */
++    return -1;
++
++  do
++    {
++      comma = grub_strchr (args, ',');
++      if (! comma)
++        option = grub_strdup (args);
++      else
++        option = grub_strndup (args, (grub_size_t)(comma - args));
++      args = comma + 1;
++
++      if (! grub_strncmp(option, "vtag", 4))
++          grub_env_set ("vlan-tag", option + grub_strlen("vtag="));
++
++    } while (comma);
++
++  return 0;
++}
++
+ char *
+ grub_ieee1275_get_device_type (const char *path)
+ {
+diff --git a/grub-core/net/ethernet.c b/grub-core/net/ethernet.c
+index b38e2c8..5e45d46 100644
+--- a/grub-core/net/ethernet.c
++++ b/grub-core/net/ethernet.c
+@@ -23,6 +23,7 @@
+ #include <grub/net/arp.h>
+ #include <grub/net/netbuff.h>
+ #include <grub/net.h>
++#include <grub/env.h>
+ #include <grub/time.h>
+ #include <grub/net/arp.h>
+@@ -56,10 +57,19 @@ send_ethernet_packet (struct grub_net_network_level_interface *inf,
+ {
+   struct etherhdr *eth;
+   grub_err_t err;
++  grub_uint32_t vlantag = 0;
++  grub_uint8_t etherhdr_size;
+-  COMPILE_TIME_ASSERT (sizeof (*eth) < GRUB_NET_MAX_LINK_HEADER_SIZE);
++  etherhdr_size = sizeof (*eth);
++  COMPILE_TIME_ASSERT (sizeof (*eth) + 4 < GRUB_NET_MAX_LINK_HEADER_SIZE);
+-  err = grub_netbuff_push (nb, sizeof (*eth));
++  const char *vlantag_text = grub_env_get ("vlan-tag");
++  if (vlantag_text != 0) {
++      etherhdr_size += 4;
++      vlantag = grub_strtoul (vlantag_text, 0, 16);
++  }
++
++  err = grub_netbuff_push (nb, etherhdr_size);
+   if (err)
+     return err;
+   eth = (struct etherhdr *) nb->data;
+@@ -76,6 +86,19 @@ send_ethernet_packet (struct grub_net_network_level_interface *inf,
+       return err;
+       inf->card->opened = 1;
+     }
++
++  /* Check if a vlan-tag is needed. */
++  if (vlantag != 0)
++    {
++      /* Move eth type to the right */
++      grub_memcpy((char *) nb->data + etherhdr_size - 2,
++                  (char *) nb->data + etherhdr_size - 6, 2);
++
++      /* Add the tag in the middle */
++      grub_memcpy((char *) nb->data + etherhdr_size - 6,
++                  &vlantag, 4);
++    }
++
+   return inf->card->driver->send (inf->card, nb);
+ }
+@@ -90,10 +113,23 @@ grub_net_recv_ethernet_packet (struct grub_net_buff *nb,
+   grub_net_link_level_address_t hwaddress;
+   grub_net_link_level_address_t src_hwaddress;
+   grub_err_t err;
++  grub_uint8_t etherhdr_size = sizeof (*eth);
++
++  grub_uint16_t vlantag_identifier = 0;
++  grub_memcpy (&vlantag_identifier, nb->data + etherhdr_size - 2, 2);
++
++  /* Check if a vlan-tag is present. */
++  if (vlantag_identifier == VLANTAG_IDENTIFIER)
++    {
++      etherhdr_size += 4;
++      /* Move eth type to the original position */
++      grub_memcpy((char *) nb->data + etherhdr_size - 6,
++                  (char *) nb->data + etherhdr_size - 2, 2);
++    }
+   eth = (struct etherhdr *) nb->data;
+   type = grub_be_to_cpu16 (eth->type);
+-  err = grub_netbuff_pull (nb, sizeof (*eth));
++  err = grub_netbuff_pull (nb, etherhdr_size);
+   if (err)
+     return err;
+diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h
+index 416a544..a8cf093 100644
+--- a/include/grub/ieee1275/ieee1275.h
++++ b/include/grub/ieee1275/ieee1275.h
+@@ -210,5 +210,6 @@ char *EXPORT_FUNC(grub_ieee1275_canonicalise_devname) (const char *path);
+ char *EXPORT_FUNC(grub_ieee1275_get_aliasdevname) (const char *path);
+ char *EXPORT_FUNC(grub_ieee1275_canonicalise_devname) (const char *path);
+ char *EXPORT_FUNC(grub_ieee1275_get_device_type) (const char *path);
++int EXPORT_FUNC(grub_ieee1275_parse_net_options) (const char *path);
+ #endif /* ! GRUB_IEEE1275_HEADER */
+diff --git a/include/grub/net.h b/include/grub/net.h
+index a7e5b2c..f4fec17 100644
+--- a/include/grub/net.h
++++ b/include/grub/net.h
+@@ -532,4 +532,6 @@ extern char *grub_net_default_server;
+ #define GRUB_NET_TRIES 40
+ #define GRUB_NET_INTERVAL 400
++#define VLANTAG_IDENTIFIER 0x8100
++
+ #endif /* ! GRUB_NET_HEADER */
+-- 
+1.7.10.4
+
diff --git a/choose-preferred-initrd.patch b/choose-preferred-initrd.patch
new file mode 100644 (file)
index 0000000..f84e380
--- /dev/null
@@ -0,0 +1,50 @@
+--- grub-2.00/util/grub-mkconfig.in~   2013-04-15 00:03:09.162253769 +0200
++++ grub-2.00/util/grub-mkconfig.in    2013-04-15 01:39:22.112705322 +0200
+@@ -233,7 +233,8 @@
+   GRUB_SAVEDEFAULT \
+   GRUB_ENABLE_CRYPTODISK \
+   GRUB_BADRAM \
+-  GRUB_DISABLE_SUBMENU
++  GRUB_DISABLE_SUBMENU \
++  GRUB_PREFER_DRACUT
+ if test "x${grub_cfg}" != "x"; then
+   rm -f "${grub_cfg}.new"
+--- grub-2.00/util/grub.d/10_linux.in~ 2013-04-15 00:03:09.162253769 +0200
++++ grub-2.00/util/grub.d/10_linux.in  2013-04-15 01:38:26.992181771 +0200
+@@ -191,10 +191,12 @@
+   linux_root_device_thisversion="${LINUX_ROOT_DEVICE}"
+   initrd=
+-  for i in "initrd.img-${version}" "initrd-${version}.img" "initrd-${version}.gz" \
+-         "initrd-${version}" "initramfs-${version}.img" \
+-         "initrd.img-${alt_version}" "initrd-${alt_version}.img" \
+-         "initrd-${alt_version}" "initramfs-${alt_version}.img" \
++  if [ x"${GRUB_PREFER_DRACUT}" != "xtrue" ]; then
++        initrd_search_list="initrd.img-${version} initrd-${version}.img initrd-${version}.gz initrd-${version} initramfs-${version}.img initrd.img-${alt_version} initrd-${alt_version}.img initrd-${alt_version} initramfs-${alt_version}.img"
++  else
++        initrd_search_list="initramfs-${version}.img initrd.img-${version} initrd-${version}.img initrd-${version}.gz initrd-${version}  initramfs-${alt_version}.img initrd.img-${alt_version} initrd-${alt_version}.img initrd-${alt_version}"
++  fi
++  for i in $initrd_search_list \
+          "initramfs-genkernel-${version}" \
+          "initramfs-genkernel-${alt_version}" \
+          "initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \
+--- grub-2.00/util/grub.d/20_linux_xen.in~     2013-04-15 11:47:30.852286811 +0200
++++ grub-2.00/util/grub.d/20_linux_xen.in      2013-04-15 11:49:05.606550816 +0200
+@@ -212,10 +212,12 @@
+       linux_root_device_thisversion="${LINUX_ROOT_DEVICE}"
+       initrd=
+-      for i in "initrd.img-${version}" "initrd-${version}.img" "initrd-${version}.gz" \
+-         "initrd-${version}" "initramfs-${version}.img" \
+-         "initrd.img-${alt_version}" "initrd-${alt_version}.img" \
+-         "initrd-${alt_version}" "initramfs-${alt_version}.img" \
++      if [ x"${GRUB_PREFER_DRACUT}" != "xtrue" ]; then
++          initrd_search_list="initrd.img-${version} initrd-${version}.img initrd-${version}.gz initrd-${version} initramfs-${version}.img initrd.img-${alt_version} initrd-${alt_version}.img initrd-${alt_version} initramfs-${alt_version}.img"
++      else
++          initrd_search_list="initramfs-${version}.img initrd.img-${version} initrd-${version}.img initrd-${version}.gz initrd-${version}  initramfs-${alt_version}.img initrd.img-${alt_version} initrd-${alt_version}.img initrd-${alt_version}"
++      fi
++      for i in $initrd_search_list \
+          "initramfs-genkernel-${version}" \
+          "initramfs-genkernel-${alt_version}" \
+          "initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \
diff --git a/dhcp-client-id-and-uuid-options-added.patch b/dhcp-client-id-and-uuid-options-added.patch
new file mode 100644 (file)
index 0000000..c573936
--- /dev/null
@@ -0,0 +1,121 @@
+From d63a0b7fd665fae1dd34d3e86127b93dd87b8114 Mon Sep 17 00:00:00 2001
+From: Paulo Flabiano Smorigo <pfsmorigo@br.ibm.com>
+Date: Tue, 27 Nov 2012 17:18:53 -0200
+Subject: [PATCH 2/3] DHCP client ID and UUID options added.
+
+---
+ grub-core/net/bootp.c |   56 +++++++++++++++++++++++++++++++++++++++++--------
+ include/grub/net.h    |    2 ++
+ 2 files changed, 49 insertions(+), 9 deletions(-)
+
+diff --git a/grub-core/net/bootp.c b/grub-core/net/bootp.c
+index bc07d53..3b4130d 100644
+--- a/grub-core/net/bootp.c
++++ b/grub-core/net/bootp.c
+@@ -51,6 +51,14 @@ set_env_limn_ro (const char *intername, const char *suffix,
+   grub_register_variable_hook (varname, 0, grub_env_write_readonly);
+ }
++static char
++hexdigit (grub_uint8_t val)
++{
++  if (val < 10)
++    return val + '0';
++  return val + 'a' - 10;
++}
++
+ static void
+ parse_dhcp_vendor (const char *name, void *vend, int limit, int *mask)
+ {
+@@ -81,6 +89,9 @@ parse_dhcp_vendor (const char *name, void *vend, int limit, int *mask)
+       taglength = *ptr++;
++      grub_dprintf("net", "DHCP option %u (0x%02x) found with length %u.\n",
++                   tagtype, tagtype, taglength);
++
+       switch (tagtype)
+       {
+       case GRUB_NET_BOOTP_NETMASK:
+@@ -121,7 +132,9 @@ parse_dhcp_vendor (const char *name, void *vend, int limit, int *mask)
+               grub_net_add_dns_server (&s);
+               ptr += 4;
+             }
+-        }
++            /* Skip adittional increment */
++            continue;
++          }
+         break;
+       case GRUB_NET_BOOTP_HOSTNAME:
+         set_env_limn_ro (name, "hostname", (char *) ptr, taglength);
+@@ -139,6 +152,39 @@ parse_dhcp_vendor (const char *name, void *vend, int limit, int *mask)
+         set_env_limn_ro (name, "extensionspath", (char *) ptr, taglength);
+         break;
++        case GRUB_NET_BOOTP_CLIENT_ID:
++        set_env_limn_ro (name, "clientid", (char *) ptr, taglength);
++          break;
++
++        case GRUB_NET_BOOTP_CLIENT_UUID:
++            {
++              if (taglength != 17)
++                break;
++
++              /* The format is 9cfe245e-d0c8-bd45-a79f-54ea5fbd3d97 */
++
++              ptr += 1;
++              taglength -= 1;
++
++              char *val = grub_malloc (2 * taglength + 4 + 1);
++              int i = 0;
++              int j = 0;
++              for (i = 0; i < taglength; i++)
++                {
++                  val[2 * i + j] = hexdigit (ptr[i] >> 4);
++                  val[2 * i + 1 + j] = hexdigit (ptr[i] & 0xf);
++
++                  if ((i == 3) || (i == 5) || (i == 7) || (i == 9))
++                    {
++                      j++;
++                      val[2 * i + 1+ j] = '-';
++                    }
++                }
++
++              set_env_limn_ro (name, "clientuuid", (char *) val, 2 * taglength + 4);
++            }
++          break;
++
+         /* If you need any other options please contact GRUB
+            developpement team.  */
+       }
+@@ -299,14 +345,6 @@ grub_net_process_dhcp (struct grub_net_buff *nb,
+     }
+ }
+-static char
+-hexdigit (grub_uint8_t val)
+-{
+-  if (val < 10)
+-    return val + '0';
+-  return val + 'a' - 10;
+-}
+-
+ static grub_err_t
+ grub_cmd_dhcpopt (struct grub_command *cmd __attribute__ ((unused)),
+                 int argc, char **args)
+diff --git a/include/grub/net.h b/include/grub/net.h
+index a7e5b2c..45348dd 100644
+--- a/include/grub/net.h
++++ b/include/grub/net.h
+@@ -423,6 +423,8 @@ enum
+     GRUB_NET_BOOTP_DOMAIN = 0x0f,
+     GRUB_NET_BOOTP_ROOT_PATH = 0x11,
+     GRUB_NET_BOOTP_EXTENSIONS_PATH = 0x12,
++    GRUB_NET_BOOTP_CLIENT_ID = 0x3d,
++    GRUB_NET_BOOTP_CLIENT_UUID = 0x61,
+     GRUB_NET_BOOTP_END = 0xff
+   };
+-- 
+1.7.10.4
+
diff --git a/fix-http-crash.patch b/fix-http-crash.patch
new file mode 100644 (file)
index 0000000..ac110c3
--- /dev/null
@@ -0,0 +1,28 @@
+From 4414df5e72937b0bb1c4a0bb66cd1132ec2a5720 Mon Sep 17 00:00:00 2001
+From: Gustavo Luiz Duarte <gustavold@linux.vnet.ibm.com>
+Date: Tue, 25 Sep 2012 18:40:55 -0400
+Subject: [PATCH] Fix crash on http
+
+Don't free file->data on receiving FIN flag since it is used all over without
+checking. http_close() will be called later to free that memory.
+https://bugzilla.redhat.com/show_bug.cgi?id=860834
+---
+ grub-core/net/http.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/grub-core/net/http.c b/grub-core/net/http.c
+index a7542d1..a5f6f31 100644
+--- a/grub-core/net/http.c
++++ b/grub-core/net/http.c
+@@ -386,7 +386,7 @@ http_establish (struct grub_file *file, grub_off_t offset, int initial)
+   data->sock = grub_net_tcp_open (file->device->net->server,
+                                 HTTP_PORT, http_receive,
+-                                http_err, http_err,
++                                http_err, NULL,
+                                 file);
+   if (!data->sock)
+     {
+-- 
+1.7.11.4
+
diff --git a/grub-custom.cfg b/grub-custom.cfg
new file mode 100644 (file)
index 0000000..078483f
--- /dev/null
@@ -0,0 +1,11 @@
+# Custom settings that go directly to /boot/grub/grub.cfg
+
+# This file provides an easy way to add custom menu entries.
+# Simply type the menu entries you want to add after this comment.
+
+set menu_color_normal=yellow/blue
+set menu_color_highlight=blue/cyan
+
+# This colorset is nice too:
+#set menu_color_normal=light-blue/black
+#set menu_color_highlight=light-cyan/blue
diff --git a/grub-garbage.patch b/grub-garbage.patch
new file mode 100644 (file)
index 0000000..2b6636f
--- /dev/null
@@ -0,0 +1,11 @@
+diff -dur grub-2.00.orig/util/grub-mkconfig_lib.in grub-2.00/util/grub-mkconfig_lib.in
+--- grub-2.00.orig/util/grub-mkconfig_lib.in   2012-06-27 17:27:53.000000000 +0200
++++ grub-2.00/util/grub-mkconfig_lib.in        2012-10-27 14:55:58.226216374 +0200
+@@ -178,6 +178,7 @@
+     case "$1" in
+       *.dpkg-*) return 1 ;; # debian dpkg
+       *.rpmsave|*.rpmnew) return 1 ;;
++      *.bak|*~|.*.swp) return 1 ;;    # backup and swap files from editors
+       README*|*/README*)  return 1 ;; # documentation
+     esac
+   else
diff --git a/grub-lvmdevice.patch b/grub-lvmdevice.patch
new file mode 100644 (file)
index 0000000..53324ec
--- /dev/null
@@ -0,0 +1,24 @@
+--- grub-1.97.1/util/grub-mkconfig.in~ 2009-11-17 17:02:16.626243372 +0200
++++ grub-1.97.1/util/grub-mkconfig.in  2009-11-17 17:02:08.346050859 +0200
+@@ -120,6 +120,21 @@
+ # Device containing our userland.  Typically used for root= parameter.
+ GRUB_DEVICE="`${grub_probe} --target=device /`"
++
++# Rewrite to sane LVM node (Code from PLD Linux geninitrd):
++# /dev/mapper/sys-rootfs -> /dev/sys/rootfs
++# /dev/mapper/blodnatt-blah--bleh -> /dev/blodnatt/blah-bleh
++# /dev/mapper/vg--meaw-root -> /dev/vg-meaw/root
++case "$GRUB_DEVICE" in
++/dev/mapper/*-*)
++      # change "--" to / (as "/" is impossible in LV name)
++      local dev=$(awk -vdev="${GRUB_DEVICE#/dev/mapper/}" 'BEGIN{gsub(/--/, "/", dev); print dev}')
++      local VG=$(awk -vdev="$dev" 'BEGIN{split(dev, v, "-"); gsub("/", "-", v[1]); print v[1]}')
++      local LV=$(awk -vdev="$dev" 'BEGIN{split(dev, v, "-"); gsub("/", "-", v[2]); print v[2]}')
++      GRUB_DEVICE=/dev/$VG/$LV
++;;
++esac
++
+ GRUB_DEVICE_UUID="`${grub_probe} --device ${GRUB_DEVICE} --target=fs_uuid 2> /dev/null`" || true
+ # Device containing our /boot partition.  Usually the same as GRUB_DEVICE.
diff --git a/grub-mkconfig-diagnostics.patch b/grub-mkconfig-diagnostics.patch
new file mode 100644 (file)
index 0000000..6f2ab81
--- /dev/null
@@ -0,0 +1,212 @@
+diff -dur grub-2.00.orig/util/grub-mkconfig.in grub-2.00/util/grub-mkconfig.in
+--- grub-2.00.orig/util/grub-mkconfig.in       2012-10-27 15:05:15.000000000 +0200
++++ grub-2.00/util/grub-mkconfig.in    2012-10-27 15:14:32.787243346 +0200
+@@ -221,11 +236,16 @@
+ if test "x${grub_cfg}" != "x"; then
+   rm -f "${grub_cfg}.new"
+   oldumask=$(umask); umask 077
++  # open fd &3 for diagnostic messages
++  exec 3>&1
+   exec > "${grub_cfg}.new"
+   umask $oldumask
++else
++  # open fd &3 for diagnostic messages
++  exec 3>&2
+ fi
+-gettext "Generating grub.cfg ..." >&2
+-echo >&2
++gettext "Generating grub.cfg ..." >&3
++echo >&3
+ cat << EOF
+ #
+@@ -259,12 +279,15 @@
+     gettext_printf "Syntax errors are detected in generated GRUB config file.
+ Ensure that there are no errors in /etc/sysconfig/grub
+ and /etc/grub.d/* files or please file a bug report with
+-%s file attached." "${grub_cfg}.new" >&2
++%s file attached." "${grub_cfg}.new" >&3
+   else
+     # none of the children aborted with error, install the new grub.cfg
+     mv -f ${grub_cfg}.new ${grub_cfg}
+   fi
+ fi
+-gettext "done" >&2
+-echo >&2
++gettext "done" >&3
++echo >&3
++
++# close diagnostic stream
++exec 3>&-
+diff -dur grub-2.00.orig/util/grub.d/00_header.in grub-2.00/util/grub.d/00_header.in
+--- grub-2.00.orig/util/grub.d/00_header.in    2012-05-04 01:04:39.000000000 +0200
++++ grub-2.00/util/grub.d/00_header.in 2012-10-27 15:16:00.665356307 +0200
+@@ -219,7 +219,7 @@
+ if [ "x$gfxterm" = x1 ]; then
+     if [ "x$GRUB_THEME" != x ] && [ -f "$GRUB_THEME" ] \
+       && is_path_readable_by_grub "$GRUB_THEME"; then
+-      gettext_printf "Found theme: %s\n" "$GRUB_THEME" >&2
++      gettext_printf "Found theme: %s\n" "$GRUB_THEME" >&3
+       prepare_grub_to_access_device `${grub_probe} --target=device "$GRUB_THEME"`
+       cat << EOF
+@@ -255,12 +255,12 @@
+ EOF
+     elif [ "x$GRUB_BACKGROUND" != x ] && [ -f "$GRUB_BACKGROUND" ] \
+           && is_path_readable_by_grub "$GRUB_BACKGROUND"; then
+-      gettext_printf "Found background: %s\n" "$GRUB_BACKGROUND" >&2
++      gettext_printf "Found background: %s\n" "$GRUB_BACKGROUND" >&3
+       case "$GRUB_BACKGROUND" in 
+           *.png)         reader=png ;;
+           *.tga)         reader=tga ;;
+           *.jpg|*.jpeg)  reader=jpeg ;;
+-          *)             gettext "Unsupported image format" >&2; echo >&2; exit 1 ;;
++          *)             gettext "Unsupported image format" >&3; echo >&3; exit 1 ;;
+       esac
+       prepare_grub_to_access_device `${grub_probe} --target=device "$GRUB_BACKGROUND"`
+       cat << EOF
+diff -dur grub-2.00.orig/util/grub.d/10_hurd.in grub-2.00/util/grub.d/10_hurd.in
+--- grub-2.00.orig/util/grub.d/10_hurd.in      2012-03-04 21:10:04.000000000 +0100
++++ grub-2.00/util/grub.d/10_hurd.in   2012-10-27 15:16:00.665356307 +0200
+@@ -45,8 +45,8 @@
+     basename=`basename $i`
+     dirname=`dirname $i`
+     rel_dirname=`make_system_path_relative_to_its_root $dirname`
+-    gettext_printf "Found GNU Mach: %s" "$i" >&2
+-    echo >&2
++    gettext_printf "Found GNU Mach: %s" "$i" >&3
++    echo >&3
+     kernels="${kernels} ${rel_dirname}/${basename}"
+     at_least_one=true
+   fi
+@@ -60,8 +60,8 @@
+ for i in /hurd/${hurd_fs}.static /hurd/exec ; do
+   if test -e "$i" ; then
+-    gettext_printf "Found Hurd module: %s" "$i" >&2
+-    echo >&2
++    gettext_printf "Found Hurd module: %s" "$i" >&3
++    echo >&3
+     at_least_one=true
+   else
+     all_of_them=false
+@@ -74,8 +74,8 @@
+ fi
+ if ${all_of_them} && test -e /lib/ld.so.1 ; then : ; else
+-  gettext "Some Hurd stuff found, but not enough to boot." >&2
+-  echo >&2
++  gettext "Some Hurd stuff found, but not enough to boot." >&3
++  echo >&3
+   exit 1
+ fi
+diff -dur grub-2.00.orig/util/grub.d/10_kfreebsd.in grub-2.00/util/grub.d/10_kfreebsd.in
+--- grub-2.00.orig/util/grub.d/10_kfreebsd.in  2012-03-04 22:02:30.000000000 +0100
++++ grub-2.00/util/grub.d/10_kfreebsd.in       2012-10-27 15:16:00.668689695 +0200
+@@ -158,7 +158,7 @@
+ while [ "x$list" != "x" ] ; do
+   kfreebsd=`version_find_latest $list`
+-  gettext_printf "Found kernel of FreeBSD: %s\n" "$kfreebsd" >&2
++  gettext_printf "Found kernel of FreeBSD: %s\n" "$kfreebsd" >&3
+   basename=`basename $kfreebsd`
+   dirname=`dirname $kfreebsd`
+   rel_dirname=`make_system_path_relative_to_its_root $dirname`
+@@ -207,7 +207,7 @@
+     fi
+   done
+   if test -n "${module_dir}" ; then
+-    gettext_printf "Found kernel module directory: %s\n" "${module_dir}" >&2
++    gettext_printf "Found kernel module directory: %s\n" "${module_dir}" >&3
+     module_dir_rel=$(make_system_path_relative_to_its_root $module_dir)
+   fi
+diff -dur grub-2.00.orig/util/grub.d/10_linux.in grub-2.00/util/grub.d/10_linux.in
+--- grub-2.00.orig/util/grub.d/10_linux.in     2012-10-27 15:05:15.000000000 +0200
++++ grub-2.00/util/grub.d/10_linux.in  2012-10-27 15:16:00.668689695 +0200
+@@ -182,7 +182,7 @@
+ is_first_entry=true
+ while [ "x$list" != "x" ] ; do
+   linux=`version_find_latest $list`
+-  gettext_printf "Found linux image: %s\n" "$linux" >&2
++  gettext_printf "Found linux image: %s\n" "$linux" >&3
+   basename=`basename $linux`
+   dirname=`dirname $linux`
+   rel_dirname=`make_system_path_relative_to_its_root $dirname`
+@@ -220,7 +220,7 @@
+   fi
+   if test -n "${initrd}" ; then
+-    gettext_printf "Found initrd image: %s\n" "${dirname}/${initrd}" >&2
++    gettext_printf "Found initrd image: %s\n" "${dirname}/${initrd}" >&3
+   elif test -z "${initramfs}" ; then
+     # "UUID=" and "ZFS=" magic is parsed by initrd or initramfs.  Since there's
+     # no initrd or builtin initramfs, it can't work here.
+diff -dur grub-2.00.orig/util/grub.d/10_netbsd.in grub-2.00/util/grub.d/10_netbsd.in
+--- grub-2.00.orig/util/grub.d/10_netbsd.in    2012-03-04 20:47:35.000000000 +0100
++++ grub-2.00/util/grub.d/10_netbsd.in 2012-10-27 15:16:00.668689695 +0200
+@@ -155,7 +155,7 @@
+     continue
+   fi
+-  gettext_printf "Found NetBSD kernel: %s\n" "$k" >&2
++  gettext_printf "Found NetBSD kernel: %s\n" "$k" >&3
+   if [ "x$is_first_entry" = xtrue ]; then
+       netbsd_entry "knetbsd"   "$k" simple "${GRUB_CMDLINE_NETBSD_DEFAULT}"
+diff -dur grub-2.00.orig/util/grub.d/10_windows.in grub-2.00/util/grub.d/10_windows.in
+--- grub-2.00.orig/util/grub.d/10_windows.in   2012-03-04 22:11:43.000000000 +0100
++++ grub-2.00/util/grub.d/10_windows.in        2012-10-27 15:16:00.668689695 +0200
+@@ -82,7 +82,7 @@
+   # Get boot device.
+   dev=`${grub_probe} -t device "$dir" 2>/dev/null` || continue
+-  gettext_printf "Found %s on %s (%s)\n" "$OS" "$drv" "$dev" >&2
++  gettext_printf "Found %s on %s (%s)\n" "$OS" "$drv" "$dev" >&3
+   cat << EOF
+ menuentry '$(echo "$OS" | grub_quote)' \$menuentry_id_option '$osid-$(grub_get_device_id "${dev}")' {
+ EOF
+diff -dur grub-2.00.orig/util/grub.d/20_linux_xen.in grub-2.00/util/grub.d/20_linux_xen.in
+--- grub-2.00.orig/util/grub.d/20_linux_xen.in 2012-06-03 21:57:42.000000000 +0200
++++ grub-2.00/util/grub.d/20_linux_xen.in      2012-10-27 15:16:00.672023083 +0200
+@@ -203,7 +203,7 @@
+     fi
+     while [ "x$list" != "x" ] ; do
+       linux=`version_find_latest $list`
+-      gettext_printf "Found linux image: %s\n" "$linux" >&2
++      gettext_printf "Found linux image: %s\n" "$linux" >&3
+       basename=`basename $linux`
+       dirname=`dirname $linux`
+       rel_dirname=`make_system_path_relative_to_its_root $dirname`
+@@ -226,7 +226,7 @@
+           fi
+       done
+       if test -n "${initrd}" ; then
+-          gettext_printf "Found initrd image: %s\n" "${dirname}/${initrd}" >&2
++          gettext_printf "Found initrd image: %s\n" "${dirname}/${initrd}" >&3
+       else
+     # "UUID=" magic is parsed by initrds.  Since there's no initrd, it can't work here.
+           linux_root_device_thisversion=${GRUB_DEVICE}
+diff -dur grub-2.00.orig/util/grub.d/30_os-prober.in grub-2.00/util/grub.d/30_os-prober.in
+--- grub-2.00.orig/util/grub.d/30_os-prober.in 2012-03-04 21:52:03.000000000 +0100
++++ grub-2.00/util/grub.d/30_os-prober.in      2012-10-27 15:16:00.675356471 +0200
+@@ -117,7 +117,7 @@
+     LONGNAME="${LABEL}"
+   fi
+-  gettext_printf "Found %s on %s\n" "${LONGNAME}" "${DEVICE}" >&2
++  gettext_printf "Found %s on %s\n" "${LONGNAME}" "${DEVICE}" >&3
+   case ${BOOT} in
+     chain)
+@@ -267,7 +267,7 @@
+     *)
+       echo -n "  "
+       # TRANSLATORS: %s is replaced by OS name.
+-      gettext_printf "%s is not yet supported by grub-mkconfig.\n" "${LONGNAME}" >&2
++      gettext_printf "%s is not yet supported by grub-mkconfig.\n" "${LONGNAME}" >&3
+     ;;
+   esac
+ done
diff --git a/grub.sysconfig b/grub.sysconfig
new file mode 100644 (file)
index 0000000..6d0d599
--- /dev/null
@@ -0,0 +1,51 @@
+# Configuration file for grub.
+#
+# If you change this file, run 'update-grub' afterwards to update /boot/grub/grub.cfg.
+#
+# To enable auto generation of /boot/grub/grub.conf on kernel package
+# install, UPDATE_GRUB must be set to "yes".
+#UPDATE_GRUB=yes
+
+# Default entry to boot. Numeric value starting with 0.
+# Use special value 'saved' to stick with last booted entry. used with GRUB_SAVEDEFAULT
+GRUB_DEFAULT=0
+
+# save_default_entry
+#GRUB_SAVEDEFAULT=true
+
+GRUB_TIMEOUT=15
+
+# Unless `GRUB_DISABLE_RECOVERY' is set to `true', two menu entries
+# will be generated for each Linux kernel: one default entry and one
+# entry for recovery mode. This option lists command-line arguments
+# to add only to the default menu entry, after those listed in
+# `GRUB_CMDLINE_LINUX'.
+GRUB_CMDLINE_LINUX_DEFAULT="quiet panic=120"
+
+# Command-line arguments to add to menu entries for the Linux kernel.
+GRUB_CMDLINE_LINUX=""
+
+# Set to 'console' to disable graphical terminal (grub-pc only)
+#GRUB_TERMINAL=console
+
+# The resolution used on graphical terminal
+# note that you can use only modes which your graphic card supports via VBE
+# you can see them in real GRUB with the command `vbeinfo'
+#GRUB_GFXMODE=640x480
+
+# Disable GRUB to pass "root=UUID=xxx" parameter to Linux
+#GRUB_DISABLE_LINUX_UUID=true
+
+# Disable generation of recovery mode menu entries
+GRUB_DISABLE_RECOVERY="true"
+
+# Disable creating "advanced" submenus, just use flat list
+GRUB_DISABLE_SUBMENU="true"
+
+# Control which initial ramdisk should grub-mkconfig prefer when searching
+# default is initrd-*.gz created by geninitrd, uncomment to make it prefer
+# initramfs-*.img created by dracut
+#GRUB_PREFER_DRACUT="true"
+
+# Uncomment to get a beep at grub start
+#GRUB_INIT_TUNE="480 440 1"
diff --git a/grub2-awk.patch b/grub2-awk.patch
new file mode 100644 (file)
index 0000000..162fa5c
--- /dev/null
@@ -0,0 +1,12 @@
+diff -dur grub-2.00.orig/grub-core/Makefile.am grub-2.00/grub-core/Makefile.am
+--- grub-2.00.orig/grub-core/Makefile.am       2012-06-26 01:56:55.000000000 +0200
++++ grub-2.00/grub-core/Makefile.am    2012-10-27 15:19:54.321231750 +0200
+@@ -349,7 +349,7 @@
+ # generate global module dependencies list
+ moddep.lst: syminfo.lst genmoddep.awk video.lst
+-      cat $< | sort | awk -f $(srcdir)/genmoddep.awk > $@ || (rm -f $@; exit 1)
++      cat $< | sort | $(AWK) -f $(srcdir)/genmoddep.awk > $@ || (rm -f $@; exit 1)
+ platform_DATA += moddep.lst
+ CLEANFILES += config.log syminfo.lst moddep.lst
diff --git a/grub2-fonts_path.patch b/grub2-fonts_path.patch
new file mode 100644 (file)
index 0000000..bb91b08
--- /dev/null
@@ -0,0 +1,12 @@
+diff -dur -x '*~' grub-2.00.orig/configure.ac grub-2.00/configure.ac
+--- grub-2.00.orig/configure.ac        2012-10-28 09:47:24.000000000 +0100
++++ grub-2.00/configure.ac     2012-10-28 09:48:06.438240771 +0100
+@@ -940,7 +940,7 @@
+ if test x"$starfield_excuse" = x; then
+    for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz; do
+-     for dir in . /usr/src /usr/share/fonts/X11/misc /usr/share/fonts/truetype/ttf-dejavu /usr/share/fonts/dejavu; do
++     for dir in . /usr/share/fonts/TTF /usr/src /usr/share/fonts/X11/misc /usr/share/fonts/truetype/ttf-dejavu /usr/share/fonts/dejavu; do
+         if test -f "$dir/DejaVuSans.$ext"; then
+           DJVU_FONT_SOURCE="$dir/DejaVuSans.$ext"
+           break 2
diff --git a/grub2-gets.patch b/grub2-gets.patch
new file mode 100644 (file)
index 0000000..d74b1a7
--- /dev/null
@@ -0,0 +1,11 @@
+diff -dur grub-2.00.orig/grub-core/gnulib/stdio.in.h grub-2.00/grub-core/gnulib/stdio.in.h
+--- grub-2.00.orig/grub-core/gnulib/stdio.in.h 2010-12-01 15:45:43.000000000 +0100
++++ grub-2.00/grub-core/gnulib/stdio.in.h      2012-10-27 15:43:17.539201562 +0200
+@@ -141,7 +141,6 @@
+    so any use of gets warrants an unconditional warning.  Assume it is
+    always declared, since it is required by C89.  */
+ #undef gets
+-_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
+ #if @GNULIB_FOPEN@
+ # if @REPLACE_FOPEN@
diff --git a/grub2-tftp_fix.patch b/grub2-tftp_fix.patch
new file mode 100644 (file)
index 0000000..397a0d7
--- /dev/null
@@ -0,0 +1,36 @@
+http://bzr.savannah.gnu.org/lh/grub/trunk/grub/revision/4548
+
+diff -dur grub-2.00.orig/ChangeLog grub-2.00/ChangeLog
+--- grub-2.00.orig/ChangeLog   2012-06-28 02:06:26.000000000 +0200
++++ grub-2.00/ChangeLog        2012-10-28 10:52:48.619830487 +0100
+@@ -1,3 +1,9 @@
++2012-07-02  Vladimir Serbinenko  <phcoder@gmail.com>
++
++      * grub-core/net/tftp.c (ack): Fix endianness problem.
++      (tftp_receive): Likewise.
++      Reported by: Michael Davidsaver.
++
+ 2012-06-27  Vladimir Serbinenko  <phcoder@gmail.com>
+       * configure.ac: Bump version to 2.00.
+diff -dur grub-2.00.orig/grub-core/net/tftp.c grub-2.00/grub-core/net/tftp.c
+--- grub-2.00.orig/grub-core/net/tftp.c        2012-06-22 17:42:07.000000000 +0200
++++ grub-2.00/grub-core/net/tftp.c     2012-10-28 10:52:11.463407895 +0100
+@@ -143,7 +143,7 @@
+   tftph_ack = (struct tftphdr *) nb_ack.data;
+   tftph_ack->opcode = grub_cpu_to_be16 (TFTP_ACK);
+-  tftph_ack->u.ack.block = block;
++  tftph_ack->u.ack.block = grub_cpu_to_be16 (block);
+   err = grub_net_send_udp_packet (data->sock, &nb_ack);
+   if (err)
+@@ -225,7 +225,7 @@
+           grub_priority_queue_pop (data->pq);
+           if (file->device->net->packs.count < 50)
+-            err = ack (data, tftph->u.data.block);
++            err = ack (data, data->block + 1);
+           else
+             {
+               file->device->net->stall = 1;
diff --git a/grub2.spec b/grub2.spec
new file mode 100644 (file)
index 0000000..577fdb8
--- /dev/null
@@ -0,0 +1,575 @@
+# TODO
+# - reap out which in probe scripts and drop R: which
+# - subpackages? e.g. modules and utils
+# - check where is that locale path: /boot/grub/locale and fix it or change it
+# - grubemu notes
+#   --enable-grub-emu-usb conflicts with --enable-grub-emu-pci, emu-pci seems experimental
+#   - to build and install the `grub-emu' debugging utility we need to re-run build with --target=emu
+#   - put grub-emu to subpackage if it is fixed
+#
+# Conditional build:
+%bcond_with    grubemu # build grub-emu debugging utility
+%bcond_without efiemu  # build efiemu runtimes
+%bcond_without pc      # do not build for PC BIOS platform
+%bcond_without efi     # do not build for EFI platform
+
+%ifnarch %{ix86} %{x8664}
+%undefine      with_pc
+%endif
+%ifnarch %{ix86} %{x8664} ia64
+%undefine      with_efi
+%endif
+
+%ifnarch %{x8664}
+# non-x86_64 arch doesn't support this
+%undefine      with_efiemu
+%endif
+
+# the 'most natural' platform should go last
+%ifarch %{ix86} %{x8664} ia64
+%define                platforms %{?with_efi:efi} %{?with_pc:pc}
+%endif
+%ifarch ppc ppc64 sparc64
+%define                platforms ieee1275
+%endif
+%ifarch mips
+%define                platforms arc
+%endif
+%ifarch mipsel
+%define                platforms loongson
+%endif
+
+Summary:       GRand Unified Bootloader
+Summary(de.UTF-8):     GRUB2 - ein Bootloader für x86 und ppc
+Summary(hu.UTF-8):     GRUB2 - rendszerbetöltÅ‘ x86 Ã©s ppc gépekhez
+Summary(pl.UTF-8):     GRUB2 - bootloader dla x86 i ppc
+Summary(pt_BR.UTF-8):  Gerenciador de inicialização GRUB2
+Name:          grub2
+Version:       2.00
+Release:       2
+License:       GPL v2
+Group:         Base
+Source0:       http://ftp.gnu.org/gnu/grub/grub-%{version}.tar.xz
+# Source0-md5: a1043102fbc7bcedbf53e7ee3d17ab91
+Source1:       update-grub
+Source2:       update-grub.8
+Source3:       grub.sysconfig
+Source4:       grub-custom.cfg
+Patch1:                pld-sysconfdir.patch
+Patch2:                grub-garbage.patch
+Patch3:                grub-lvmdevice.patch
+Patch4:                pld-mkconfigdir.patch
+Patch5:                grub-mkconfig-diagnostics.patch
+Patch6:                ppc.patch
+Patch7:                %{name}-awk.patch
+Patch8:                posix.patch
+Patch9:                %{name}-gets.patch
+Patch10:       %{name}-fonts_path.patch
+Patch11:       %{name}-tftp_fix.patch
+Patch12:       add-vlan-tag-support.patch
+Patch13:       just-say-linux.patch
+Patch14:       add-GRUB-DISABLE-SUBMENU-option.patch
+Patch15:       add-X-option-to-printf-functions.patch
+Patch16:       dhcp-client-id-and-uuid-options-added.patch
+Patch17:       fix-http-crash.patch
+Patch18:       Issue-separate-DNS-queries-for-ipv4-and-ipv6.patch
+Patch19:       search-for-specific-config-file-for-netboot.patch
+Patch20:       ignore-kernel-symlinks.patch
+Patch21:       choose-preferred-initrd.patch
+URL:           http://www.gnu.org/software/grub/
+BuildRequires: autoconf >= 2.53
+BuildRequires: automake >= 1:1.11.1-1
+BuildRequires: bison
+BuildRequires: device-mapper-devel
+BuildRequires: flex >= 2.5.35
+BuildRequires: fonts-TTF-DejaVu
+BuildRequires: freetype-devel >= 2
+BuildRequires: gawk
+BuildRequires: gettext-devel
+BuildRequires: glibc-static
+BuildRequires: help2man
+BuildRequires: libfuse-devel
+BuildRequires: libtool
+BuildRequires: ncurses-devel
+BuildRequires: rpm >= 4.4.9-56
+BuildRequires: rpmbuild(macros) >= 1.213
+BuildRequires: sed >= 4.0
+BuildRequires: tar >= 1:1.22
+BuildRequires: texinfo
+BuildRequires: xz
+BuildRequires: xz-devel
+%ifarch %{x8664}
+BuildRequires: /usr/lib/libc.so
+%if "%{pld_release}" == "ac"
+BuildRequires: libgcc32
+%else
+BuildRequires: gcc-multilib
+%endif
+%endif
+Requires:      %{name}-platform = %{version}-%{release}
+Requires:      which
+%ifarch %{ix86} %{x8664}
+Suggests:      %{name}-platform-pc
+%endif
+Suggests:      cdrkit-mkisofs
+Suggests:      os-prober
+Provides:      bootloader
+Conflicts:     grub
+ExclusiveArch: %{ix86} %{x8664} ia64 mips mipsel ppc ppc64 sparc64
+BuildRoot:     %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
+
+%define                _sbindir        /sbin
+%define                _bindir         %{_sbindir}
+%define                _libdir         /lib
+%define                _datadir        %{_libdir}
+%define                _libexecdir     %{_libdir}/grub
+%define                _grubdir        /boot/grub
+%define                _localedir      /usr/share/locale
+
+# part of grub code is not relocable (these are not Linux libs)
+# stack protector also breaks non-Linux binaries
+# any kind of forced optimizations makes grub2 unreliable (random
+# reboots and hangs on boot menu screen)
+%define                filterout_c     -fPIC -O.
+%undefine      _ssp_cflags
+%undefine      _fortify_cflags
+
+%description
+GRUB is a GPLed bootloader intended to unify bootloading across x86
+operating systems. In addition to loading the Linux and *BSD kernels,
+it implements the Multiboot standard, which allows for flexible
+loading of multiple boot images (needed for modular kernels such as
+the GNU Hurd).
+
+GRUB 2 is derived from PUPA which was a research project to
+investigate the next generation of GRUB. GRUB 2 has been rewritten
+from scratch to clean up everything for modularity and portability.
+
+GRUB 2 targets at the following goals:
+- Scripting support, such as conditionals, loops, variables and
+  functions.
+- Graphical interface.
+- Dynamic loading of modules in order to extend itself at the run time
+  rather than at the build time.
+- Portability for various architectures.
+- Internationalization. This includes support for non-ASCII character
+  code, message catalogs like gettext, fonts, graphics console, and so
+  on.
+- Real memory management, to make GNU GRUB more extensible.
+- Modular, hierarchical, object-oriented framework for file systems,
+  files, devices, drives, terminals, commands, partition tables and OS
+  loaders.
+- Cross-platform installation which allows for installing GRUB from a
+  different architecture.
+- Rescue mode saves unbootable cases. Stage 1.5 was eliminated.
+- Fix design mistakes in GRUB Legacy, which could not be solved for
+  backward-compatibility, such as the way of numbering partitions.
+
+%description -l de.UTF-8
+GRUB (GRand Unified Boot-loader) ist ein Bootloader, der oft auf
+Rechnern eingesetzt wird, auf denen das freie Betriebssystem Linux
+läuft. GRUB löst den betagten LILO (Linux-Loader) ab.
+
+GRUB wurde innerhalb des GNU Hurd-Projektes als Boot-Loader entwickelt
+und wird unter der GPL vertrieben. Aufgrund seiner höheren
+Flexibilität verdrängt GRUB in vielen Linux-Distributionen den
+traditionellen Boot-Loader LILO.
+
+%description -l hu.UTF-8
+GRUB egy GPL liszenszű rendszerbetöltÅ‘. Linux Ã©s *BSD kernelek
+betöltése mellett támogatja a Multiboot standard-ot, amely lehetÅ‘vé
+teszi boot képek betöltését (moduláris kerneleknek kell, mint pl. a
+GNU Hurd).
+
+GRUB2 céljai a következÅ‘k:
+- szkriptelés támogatása, Ãºgymint feltételek, ciklusok, változók,
+  függvények.
+- grafikus felület
+- modulok dinamikus betöltése futási idÅ‘ben
+- hordozhatóság több architektúrára
+- többnyelvűség: nem-ASCII karakterek támogatása, Ã¼zenetkatalógusok,
+  mint gettext, betűtípusok, grafikus konzolon, Ã©s Ã­gy tovább
+- valós memória kezelés, amellyel még bÅ‘víthetÅ‘bbé tehetjük
+- moduláris, hierarchikus, objektum-orientált keretrendszer
+  fájlrendszerekhez, fájlokhoz, eszközökhöz, meghajtókhoz,
+  terminálokhoz, parancsokhoz, partíciós táblákhoz Ã©s OS betöltÅ‘khöz
+
+%description -l es.UTF-8
+Éste es GRUB - Grand Unified Boot Loader - un administrador de
+inicialización capaz de entrar en la mayoría de los sistemas
+operacionales libres - Linux, FreeBSD, NetBSD, GNU Mach, etc. como
+también en la mayoría de los sistemas operacionales comerciales para
+PC.
+
+El administrador GRUB puede ser una buena alternativa a LILO, para
+usuarios conmás experiencia y que deseen obtener más recursos de su
+cargador de inicialización (boot loader).
+
+%description -l pl.UTF-8
+GRUB jest bootloaderem na licencji GNU GPL, majÄ…cym na celu unifikacjÄ™
+procesu bootowania na systemach x86. Potrafi nie tylko Å‚adować jÄ…dra
+Linuksa i *BSD: posiada również implementacjÄ™ standardu Multiboot,
+który pozwala na elastyczne Å‚adowanie wielu obrazów bootowalnych
+(czego wymagajÄ… moduÅ‚owe jÄ…dra, takie jak GNU Hurd).
+
+%description -l pt_BR.UTF-8
+Esse Ã© o GRUB - Grand Unified Boot Loader - um gerenciador de boot
+capaz de entrar na maioria dos sistemas operacionais livres - Linux,
+FreeBSD, NetBSD, GNU Mach, etc. assim como na maioria dos sistemas
+operacionais comerciais para PC.
+
+O GRUB pode ser uma boa alternativa ao LILO, para usuários mais
+avançados e que querem mais recursos de seu boot loader.
+
+%package -n bash-completion-%{name}
+Summary:       bash-completion for GRUB
+Summary(pl.UTF-8):     Bashowe uzupeÅ‚nianie nazw dla GRUB-a
+Group:         Applications/Shells
+Requires:      bash-completion
+
+%description -n bash-completion-%{name}
+This package provides bash-completion for GRUB.
+
+%description -n bash-completion-%{name} -l pl.UTF-8
+Pakiet ten dostarcza bashowe uzupeÅ‚nianie nazw dla GRUB-a.
+
+%package platform-pc
+Summary:       PC BIOS platform support for GRUB
+Summary(pl.UTF-8):     ObsÅ‚uga platformy PC BIOS dla GRUB-a
+Group:         Base
+Provides:      %{name}-platform = %{version}-%{release}
+
+%description platform-pc
+PC BIOS platform support for GRUB.
+
+%description platform-pc -l pl.UTF-8
+ObsÅ‚uga platformy PC BIOS dla GRUB-a.
+
+%package platform-efi
+Summary:       (U)EFI platform support for GRUB
+Summary(pl.UTF-8):     ObsÅ‚uga platformy (U)EFI dla GRUB-a
+Group:         Base
+Suggests:      efibootmgr
+Provides:      %{name}-platform = %{version}-%{release}
+
+%description platform-efi
+(U)EFI platform support for GRUB.
+
+%description platform-efi -l pl.UTF-8
+ObsÅ‚uga platformy (U)EFI dla GRUB-a.
+
+%package mkfont
+Summary:       GRUB font files converter
+Summary(pl.UTF-8):     Konwerter plików fontów GRUB-a
+Group:         Base
+
+%description mkfont
+Converts common font file formats into PF2.
+
+%description mkfont -l pl.UTF-8
+Program do konwersji popularnych formatów plików fontów do PF2.
+
+%package theme-starfield
+Summary:       starfield theme for GRUB
+Summary(pl.UTF-8):     Motyw starfield dla GRUB-a
+Group:         Base
+
+%description theme-starfield
+starfield theme for GRUB.
+
+%description theme-starfield -l pl.UTF-8
+Motyw starfield dla GRUB-a.
+
+%prep
+%setup -q -n grub-%{version}
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
+%patch4 -p1
+%patch5 -p1
+%patch6 -p1
+%patch7 -p1
+%patch8 -p1
+%patch9 -p1
+%patch10 -p1
+%patch11 -p1
+%patch12 -p1
+%patch13 -p1
+%patch14 -p1
+%patch15 -p1
+%patch16 -p1
+%patch17 -p1
+%patch18 -p1
+%patch19 -p1
+%patch20 -p1
+%patch21 -p1
+
+%build
+# if gold is used then grub doesn't even boot
+# https://savannah.gnu.org/bugs/?34539
+# http://sourceware.org/bugzilla/show_bug.cgi?id=14196
+install -d our-ld
+ln -s /usr/bin/ld.bfd our-ld/ld
+export PATH=$(pwd)/our-ld:$PATH
+
+cp -f /usr/share/automake/config.sub .
+%{__libtoolize}
+%{__aclocal} -I m4
+%{__autoheader}
+echo timestamp > stamp-h.in
+%{__autoconf}
+%{__automake}
+
+for platform in %{platforms} ; do
+       install -d build-${platform}
+       cd build-${platform}
+
+       if [ "$platform" != "efi" ] ; then
+               platform_opts="--enable-efiemu%{!?with_efiemu:=no}"
+       else
+               platform_opts=""
+       fi
+
+       ln -s ../configure .
+       # mawk stalls at ./genmoddep.awk, so force gawk
+       AWK=gawk \
+       %configure \
+               --with-platform=${platform} \
+               --disable-werror \
+       %if %{with grubemu}
+               --enable-grub-emu-usb \
+               --enable-grub-emu-sdl \
+               --enable-grub-emu-pci \
+       %endif
+               $platform_opts \
+               TARGET_LDFLAGS=-static
+
+       %{__make}
+       cd ..
+done
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+for platform in %{platforms} ; do
+       cd build-${platform}
+       %{__make} install \
+               pkgdatadir=%{_libexecdir} \
+               pkglibdir=%{_libexecdir} \
+               DESTDIR=$RPM_BUILD_ROOT
+       cd ..
+done
+
+# not in Th (?)
+%{__rm} -r $RPM_BUILD_ROOT%{_localedir}/de@hebrew
+%{__rm} -r $RPM_BUILD_ROOT%{_localedir}/en@{arabic,cyrillic,greek,hebrew,piglatin}
+
+%find_lang grub
+
+# this must be after 'make install'
+install -d $RPM_BUILD_ROOT%{_libexecdir}/locale
+
+install -d $RPM_BUILD_ROOT%{_grubdir}
+cp -p docs/grub.cfg $RPM_BUILD_ROOT%{_grubdir}
+
+# grub.d/41_custom
+cp -p %{SOURCE4} $RPM_BUILD_ROOT%{_grubdir}/custom.cfg
+%{__rm} $RPM_BUILD_ROOT/lib/grub.d/40_custom
+
+install -p %{SOURCE1} $RPM_BUILD_ROOT%{_sbindir}/update-grub
+cp -p %{SOURCE2} $RPM_BUILD_ROOT%{_mandir}/man8/update-grub.8
+
+install -d $RPM_BUILD_ROOT/etc/sysconfig
+cp -p %{SOURCE3} $RPM_BUILD_ROOT/etc/sysconfig/grub
+
+# rm -f, because it sometimes exists, sometimes not, depending which texlive you have installed
+rm -f $RPM_BUILD_ROOT%{_infodir}/dir
+
+# platform specific, unnecessarily always installed
+%ifnarch %{ix86} %{x8664}
+%{__rm} $RPM_BUILD_ROOT{%{_sbindir}/grub-bios-setup,%{_mandir}/man8/grub-bios-setup.8}
+%endif
+%ifnarch sparc64
+%{__rm} $RPM_BUILD_ROOT{%{_sbindir}/grub-sparc64-setup,%{_mandir}/man8/grub-sparc64-setup.8}
+%endif
+
+# core.img - bootable image generated by grub-mkimage(1) via grub-install(1)
+touch $RPM_BUILD_ROOT%{_grubdir}/core.img
+touch $RPM_BUILD_ROOT%{_grubdir}/device.map
+
+# needs to be exactly 1KiB
+# but we're ghosting it. so whom are we kidding here? :P (maybe %config it in future?)
+dd bs=1024 if=/dev/zero count=1 of=$RPM_BUILD_ROOT%{_grubdir}/grubenv
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%post -p %{_sbindir}/postshell
+-/usr/sbin/fix-info-dir -c %{_infodir}
+
+%postun -p %{_sbindir}/postshell
+-/usr/sbin/fix-info-dir -c %{_infodir}
+
+%triggerpostun -- %{name} < 2.00-2
+# Note this trigger on version upgrade needed only for upgrade from
+# old grub2 packages which contained modules in /boot/grub
+# or were built with optimizations enabled
+# don't do anything on --downgrade
+if [ $1 -le 1 ]; then
+       exit 0
+fi
+echo "Grub was upgraded, trying to setup it to boot sector"
+/sbin/grub-install '(hd0)' || :
+
+%triggerpostun -- %{name} < 1.99-7.3
+# migrate /etc/grub.d/custom.cfg.rpmsave  -> /boot/grub/custom.cfg
+if [ -f %{_sysconfdir}/grub.d/custom.cfg.rpmsave ]; then
+       cp -f %{_grubdir}/custom.cfg{,.rpmnew}
+       mv -f  %{_sysconfdir}/grub.d/custom.cfg.rpmsave %{_grubdir}/custom.cfg
+fi
+
+%files -f grub.lang
+%defattr(644,root,root,755)
+%doc AUTHORS ChangeLog NEWS README THANKS TODO
+%config(noreplace) %verify(not md5 mtime size) /etc/sysconfig/grub
+%attr(755,root,root) %{_sbindir}/grub-editenv
+%attr(755,root,root) %{_sbindir}/grub-fstest
+%attr(755,root,root) %{_sbindir}/grub-kbdcomp
+%attr(755,root,root) %{_sbindir}/grub-install
+%attr(755,root,root) %{_sbindir}/grub-menulst2cfg
+%attr(755,root,root) %{_sbindir}/grub-mkconfig
+%attr(755,root,root) %{_sbindir}/grub-mklayout
+%attr(755,root,root) %{_sbindir}/grub-mknetdir
+%attr(755,root,root) %{_sbindir}/grub-mkpasswd-pbkdf2
+%attr(755,root,root) %{_sbindir}/grub-mkrelpath
+%attr(755,root,root) %{_sbindir}/grub-mkrescue
+%attr(755,root,root) %{_sbindir}/grub-mkstandalone
+%attr(755,root,root) %{_sbindir}/grub-mount
+%attr(755,root,root) %{_sbindir}/grub-ofpathname
+%attr(755,root,root) %{_sbindir}/grub-reboot
+%attr(755,root,root) %{_sbindir}/grub-script-check
+%attr(755,root,root) %{_sbindir}/grub-set-default
+%attr(755,root,root) %{_sbindir}/update-grub
+%ifarch %{ix86} %{x8664}
+%attr(755,root,root) %{_sbindir}/grub-bios-setup
+%{_mandir}/man8/grub-bios-setup.8*
+%endif
+%ifarch %{ix86} %{x8664}
+%attr(755,root,root) %{_sbindir}/grub-mkimage
+%{_mandir}/man1/grub-mkimage.1*
+%else
+%attr(755,root,root) %{_sbindir}/grub-probe
+%{_mandir}/man8/grub-probe.8*
+%endif
+%ifarch sparc64
+%attr(755,root,root) %{_sbindir}/grub-sparc64-setup
+%{_mandir}/man8/grub-sparc64-setup.8*
+%endif
+%{_mandir}/man1/grub-editenv.1*
+%{_mandir}/man1/grub-fstest.1*
+%{_mandir}/man1/grub-kbdcomp.1*
+%{_mandir}/man1/grub-menulst2cfg.1*
+%{_mandir}/man1/grub-mklayout.1*
+%{_mandir}/man1/grub-mkpasswd-pbkdf2.1*
+%{_mandir}/man1/grub-mkrelpath.1*
+%{_mandir}/man1/grub-mkrescue.1*
+%{_mandir}/man1/grub-mkstandalone.1*
+%{_mandir}/man1/grub-mount.1*
+%{_mandir}/man1/grub-script-check.1*
+%{_mandir}/man8/grub-install.8*
+%{_mandir}/man8/grub-mkconfig.8*
+%{_mandir}/man8/grub-mknetdir.8*
+%{_mandir}/man8/grub-ofpathname.8*
+%{_mandir}/man8/grub-reboot.8*
+%{_mandir}/man8/grub-set-default.8*
+%{_mandir}/man8/update-grub.8*
+%if %{with grubemu}
+%attr(755,root,root) %{_sbindir}/grub-emu
+%{_mandir}/man8/grub-emu.8*
+%endif
+%{_libexecdir}/grub-mkconfig_lib
+
+%dir %{_grubdir}
+%dir %{_libexecdir}
+# XXX: check this locale dir location and if it is neccesaary to exist on /boot
+
+%dir %{_libexecdir}/locale
+%config(noreplace) %verify(not md5 mtime size) %{_grubdir}/grub.cfg
+%config(noreplace) %verify(not md5 mtime size) %{_grubdir}/custom.cfg
+
+# generated by grub at runtime
+%ghost %{_grubdir}/device.map
+%ghost %{_grubdir}/core.img
+%ghost %{_grubdir}/grubenv
+
+%dir /lib/grub.d
+%doc /lib/grub.d/README
+%attr(755,root,root) /lib/grub.d/00_header
+%attr(755,root,root) /lib/grub.d/10_linux
+%attr(755,root,root) /lib/grub.d/20_linux_xen
+%attr(755,root,root) /lib/grub.d/30_os-prober
+%attr(755,root,root) /lib/grub.d/41_custom
+
+%ifarch %{ix86} %{x8664}
+%attr(755,root,root) %{_sbindir}/grub-probe
+%{_mandir}/man8/grub-probe.8*
+%endif
+
+%{_infodir}/grub*.info*
+
+%dir %{_datadir}/grub/themes
+
+%if %{with pc}
+%files platform-pc
+%defattr(644,root,root,755)
+%dir %{_libexecdir}/*-pc
+%{_libexecdir}/*-pc/modinfo.sh
+%{_libexecdir}/*-pc/*.exec
+%{_libexecdir}/*-pc/*.image
+%{_libexecdir}/*-pc/*.lst
+%{_libexecdir}/*-pc/*.mod
+%{_libexecdir}/*-pc/*.module
+%{_libexecdir}/*-pc/lzma_decompress.img
+%{_libexecdir}/*-pc/config.h
+%{_libexecdir}/*-pc/gdb_grub
+%{_libexecdir}/*-pc/gmodule.pl
+%if %{with efiemu}
+%{_libexecdir}/*-pc/efiemu*.o
+%endif
+%{_libexecdir}/*-pc/kernel.img
+%ifarch %{ix86} %{x8664} sparc sparc64
+%{_libexecdir}/*-pc/boot.img
+%{_libexecdir}/*-pc/cdboot.img
+%{_libexecdir}/*-pc/diskboot.img
+%{_libexecdir}/*-pc/lnxboot.img
+%{_libexecdir}/*-pc/pxeboot.img
+%endif
+%endif
+
+%if %{with efi}
+%files platform-efi
+%defattr(644,root,root,755)
+%dir %{_libexecdir}/*-efi
+%{_libexecdir}/*-efi/modinfo.sh
+%{_libexecdir}/*-efi/*.exec
+%{_libexecdir}/*-efi/*.lst
+%{_libexecdir}/*-efi/*.mod
+%{_libexecdir}/*-efi/*.module
+%{_libexecdir}/*-efi/config.h
+%{_libexecdir}/*-efi/gdb_grub
+%{_libexecdir}/*-efi/gmodule.pl
+%{_libexecdir}/*-efi/kernel.img
+%endif
+
+%files mkfont
+%defattr(644,root,root,755)
+%attr(755,root,root) %{_sbindir}/grub-mkfont
+%{_mandir}/man1/grub-mkfont.1*
+
+%files theme-starfield
+%defattr(644,root,root,755)
+%{_datadir}/grub/themes/starfield
+
+%files -n bash-completion-%{name}
+%defattr(644,root,root,755)
+/etc/bash_completion.d/grub
diff --git a/ignore-kernel-symlinks.patch b/ignore-kernel-symlinks.patch
new file mode 100644 (file)
index 0000000..f854139
--- /dev/null
@@ -0,0 +1,12 @@
+--- grub-2.00/util/grub-mkconfig_lib.in~       2013-04-15 00:03:09.102253190 +0200
++++ grub-2.00/util/grub-mkconfig_lib.in        2013-04-15 00:54:39.189605003 +0200
+@@ -174,6 +174,9 @@
+ grub_file_is_not_garbage ()
+ {
++  if test -L "$1" ; then
++    return 1
++  fi
+   if test -f "$1" ; then
+     case "$1" in
+       *.dpkg-*) return 1 ;; # debian dpkg
diff --git a/just-say-linux.patch b/just-say-linux.patch
new file mode 100644 (file)
index 0000000..6cce32b
--- /dev/null
@@ -0,0 +1,45 @@
+From d4bd41f972c6e22b86c773cbba2a1e14f400a8be Mon Sep 17 00:00:00 2001
+From: Peter Jones <pjones@redhat.com>
+Date: Mon, 14 Mar 2011 14:27:42 -0400
+Subject: [PATCH] Don't say "GNU/Linux" in generated menus.
+
+---
+ util/grub.d/10_linux.in     |    4 ++--
+ util/grub.d/20_linux_xen.in |    4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
+index a09c3e6..0b0df78 100644
+--- a/util/grub.d/10_linux.in
++++ b/util/grub.d/10_linux.in
+@@ -29,9 +29,9 @@ export TEXTDOMAINDIR=@localedir@
+ CLASS="--class gnu-linux --class gnu --class os"
+ if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
+-  OS=GNU/Linux
++  OS="$(. /etc/os-release ; echo "$NAME $VERSION")"
+ else
+-  OS="${GRUB_DISTRIBUTOR} GNU/Linux"
++  OS="${GRUB_DISTRIBUTOR}"
+   CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1) ${CLASS}"
+ fi
+diff --git a/util/grub.d/20_linux_xen.in b/util/grub.d/20_linux_xen.in
+index ee49cd9..10422b0 100644
+--- a/util/grub.d/20_linux_xen.in
++++ b/util/grub.d/20_linux_xen.in
+@@ -29,9 +29,9 @@ export TEXTDOMAINDIR=@localedir@
+ CLASS="--class gnu-linux --class gnu --class os --class xen"
+ if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
+-  OS=GNU/Linux
++  OS="$(. /etc/os-release ; echo "$NAME $VERSION")"
+ else
+-  OS="${GRUB_DISTRIBUTOR} GNU/Linux"
++  OS="${GRUB_DISTRIBUTOR}"
+   CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1) ${CLASS}"
+ fi
+-- 
+1.7.4
+
diff --git a/pld-mkconfigdir.patch b/pld-mkconfigdir.patch
new file mode 100644 (file)
index 0000000..5d6943e
--- /dev/null
@@ -0,0 +1,24 @@
+diff -dur grub-2.00.orig/conf/Makefile.common grub-2.00/conf/Makefile.common
+--- grub-2.00.orig/conf/Makefile.common        2012-10-27 15:05:15.000000000 +0200
++++ grub-2.00/conf/Makefile.common     2012-10-27 15:06:09.135719113 +0200
+@@ -98,7 +98,7 @@
+ # Other variables
+-grubconfdir = $(sysconfdir)/grub.d
++grubconfdir = /lib/grub.d
+ platformdir = $(pkglibdir)/$(target_cpu)-$(platform)
+ starfielddir = $(pkgdatadir)/themes/starfield
+diff -dur grub-2.00.orig/util/grub-mkconfig.in grub-2.00/util/grub-mkconfig.in
+--- grub-2.00.orig/util/grub-mkconfig.in       2012-10-27 15:05:15.000000000 +0200
++++ grub-2.00/util/grub-mkconfig.in    2012-10-27 15:06:40.696227008 +0200
+@@ -35,7 +35,7 @@
+     pkgdatadir="${datadir}/@PACKAGE@"
+ fi
+ grub_cfg=""
+-grub_mkconfig_dir="${sysconfdir}"/grub.d
++grub_mkconfig_dir=/lib/grub.d
+ self=`basename $0`
diff --git a/pld-sysconfdir.patch b/pld-sysconfdir.patch
new file mode 100644 (file)
index 0000000..f53f128
--- /dev/null
@@ -0,0 +1,41 @@
+diff -dur grub-2.00.orig/util/grub-mkconfig.in grub-2.00/util/grub-mkconfig.in
+--- grub-2.00.orig/util/grub-mkconfig.in       2012-04-05 19:41:07.000000000 +0200
++++ grub-2.00/util/grub-mkconfig.in    2012-10-27 14:53:33.483981202 +0200
+@@ -140,8 +140,8 @@
+ # choosing Hurd filesystem module.
+ GRUB_FS="`${grub_probe} --device ${GRUB_DEVICE} --target=fs 2> /dev/null || echo unknown`"
+-if test -f ${sysconfdir}/default/grub ; then
+-  . ${sysconfdir}/default/grub
++if test -f ${sysconfdir}/sysconfig/grub ; then
++  . ${sysconfdir}/sysconfig/grub
+ fi
+ # XXX: should this be deprecated at some point?
+@@ -232,7 +232,7 @@
+ # DO NOT EDIT THIS FILE
+ #
+ # It is automatically generated by $self using templates
+-# from ${grub_mkconfig_dir} and settings from ${sysconfdir}/default/grub
++# from ${grub_mkconfig_dir} and settings from ${sysconfdir}/sysconfig/grub
+ #
+ EOF
+@@ -257,7 +257,7 @@
+   if ! ${grub_script_check} ${grub_cfg}.new; then
+     # TRANSLATORS: %s is replaced by filename
+     gettext_printf "Syntax errors are detected in generated GRUB config file.
+-Ensure that there are no errors in /etc/default/grub
++Ensure that there are no errors in /etc/sysconfig/grub
+ and /etc/grub.d/* files or please file a bug report with
+ %s file attached." "${grub_cfg}.new" >&2
+   else
+diff -dur grub-2.00.orig/util/grub.d/README grub-2.00/util/grub.d/README
+--- grub-2.00.orig/util/grub.d/README  2010-12-01 15:45:43.000000000 +0100
++++ grub-2.00/util/grub.d/README       2012-10-27 14:52:54.046709588 +0200
+@@ -8,4 +8,4 @@
+ The number namespace in-between is configurable by system installer and/or
+ administrator.  For example, you can add an entry to boot another OS as
+ 01_otheros, 11_otheros, etc, depending on the position you want it to occupy in
+-the menu; and then adjust the default setting via /etc/default/grub.
++the menu; and then adjust the default setting via /etc/sysconfig/grub.
diff --git a/posix.patch b/posix.patch
new file mode 100644 (file)
index 0000000..18ab55a
--- /dev/null
@@ -0,0 +1,9 @@
+--- grub-1.99/util/grub-mkconfig.in.wiget      2011-10-13 17:43:32.333505299 +0200
++++ grub-1.99/util/grub-mkconfig.in    2011-10-13 17:43:45.513070998 +0200
+@@ -1,5 +1,6 @@
+ #! /bin/sh
+ set -e
++set -o posix
+ # Generate grub.cfg by inspecting /boot contents.
+ # Copyright (C) 2006,2007,2008,2009,2010 Free Software Foundation, Inc.
diff --git a/ppc.patch b/ppc.patch
new file mode 100644 (file)
index 0000000..fde494c
--- /dev/null
+++ b/ppc.patch
@@ -0,0 +1,27 @@
+disable -m32 on ppc (gcc 3.3.6 does not like it)
+
+revert 'returns_twice' attribute for grub_setjmp.
+http://repo.or.cz/w/grub2.git/commitdiff/2c7825edcb18e9d0680a953f1475ef2caf6b0f0f
+
+--- grub-1.98/configure.ac~    2010-03-06 20:51:37.000000000 +0000
++++ grub-1.98/configure.ac     2010-07-19 13:59:46.468351205 +0000
+@@ -114,7 +114,7 @@
+ esac
+ case "$target_cpu" in
+-  i386 | powerpc) target_m32=1 ;;
++  i386) target_m32=1 ;;
+   x86_64 | sparc64) target_m64=1 ;;
+ esac
+--- grub-1.98/include/grub/powerpc/setjmp.h~   2010-03-06 20:51:37.000000000 +0000
++++ grub-1.98/include/grub/powerpc/setjmp.h    2010-07-19 16:37:03.616853413 +0000
+@@ -21,7 +21,7 @@
+ typedef unsigned long grub_jmp_buf[20];
+-int grub_setjmp (grub_jmp_buf env) __attribute__ ((returns_twice));
++int grub_setjmp (grub_jmp_buf env);
+ void grub_longjmp (grub_jmp_buf env, int val) __attribute__ ((noreturn));
+ #endif /* ! GRUB_SETJMP_CPU_HEADER */
diff --git a/search-for-specific-config-file-for-netboot.patch b/search-for-specific-config-file-for-netboot.patch
new file mode 100644 (file)
index 0000000..33e3793
--- /dev/null
@@ -0,0 +1,205 @@
+From 38d458ddd69cb7dd6e7f58f9e9f3197c6b6184f3 Mon Sep 17 00:00:00 2001
+From: Paulo Flabiano Smorigo <pfsmorigo@br.ibm.com>
+Date: Tue, 27 Nov 2012 17:22:07 -0200
+Subject: [PATCH 3/3] Search for specific config file for netboot
+
+This patch implements a search for a specific configuration when the config
+file is on a remoteserver. It uses the following order:
+   1) DHCP client UUID option.
+   2) MAC address (in lower case hexadecimal with dash separators);
+   3) IP (in upper case hexadecimal) or IPv6;
+   4) The original grub.cfg file.
+
+This procedure is similar to what is used by pxelinux and yaboot:
+http://www.syslinux.org/wiki/index.php/PXELINUX#config
+
+This should close the bugzilla:
+https://bugzilla.redhat.com/show_bug.cgi?id=873406
+---
+ grub-core/net/net.c     |  118 +++++++++++++++++++++++++++++++++++++++++++++++
+ grub-core/normal/main.c |   18 ++++++--
+ include/grub/net.h      |    3 ++
+ 3 files changed, 135 insertions(+), 4 deletions(-)
+
+diff --git a/grub-core/net/net.c b/grub-core/net/net.c
+index 01c5d32..49c32c5 100644
+--- a/grub-core/net/net.c
++++ b/grub-core/net/net.c
+@@ -1548,6 +1548,124 @@ grub_net_restore_hw (void)
+   return GRUB_ERR_NONE;
+ }
++grub_err_t
++grub_net_search_configfile (char *config)
++{
++  grub_size_t config_len;
++  char *suffix;
++
++  auto int search_through (grub_size_t num_tries, grub_size_t slice_size);
++  int search_through (grub_size_t num_tries, grub_size_t slice_size)
++    {
++      while (num_tries-- > 0)
++        {
++        grub_dprintf ("net", "probe %s\n", config);
++
++          grub_file_t file;
++          file = grub_file_open (config);
++
++          if (file)
++            {
++              grub_file_close (file);
++              grub_dprintf ("net", "found!\n");
++              return 0;
++            }
++          else
++            {
++              if (grub_errno == GRUB_ERR_IO)
++                grub_errno = GRUB_ERR_NONE;
++            }
++
++          if (grub_strlen (suffix) < slice_size)
++            break;
++
++          config[grub_strlen (config) - slice_size] = '\0';
++        }
++
++      return 1;
++    }
++
++  config_len = grub_strlen (config);
++  config[config_len] = '-';
++  suffix = config + config_len + 1;
++
++  struct grub_net_network_level_interface *inf;
++  FOR_NET_NETWORK_LEVEL_INTERFACES (inf)
++    {
++      /* By the Client UUID. */
++
++      char client_uuid_var[sizeof ("net_") + grub_strlen (inf->name) +
++                           sizeof ("_clientuuid") + 1];
++      grub_snprintf (client_uuid_var, sizeof (client_uuid_var),
++                     "net_%s_clientuuid", inf->name);
++
++      const char *client_uuid;
++      client_uuid = grub_env_get (client_uuid_var);
++
++      if (client_uuid)
++        {
++          grub_strcpy (suffix, client_uuid);
++          if (search_through (1, 0) == 0) return GRUB_ERR_NONE;
++        }
++
++      /* By the MAC address. */
++
++      /* Add ethernet type */
++      grub_strcpy (suffix, "01-");
++
++      grub_net_hwaddr_to_str (&inf->hwaddress, suffix + 3);
++
++      char *ptr;
++      for (ptr = suffix; *ptr; ptr++)
++        if (*ptr == ':')
++          *ptr = '-';
++
++      if (search_through (1, 0) == 0) return GRUB_ERR_NONE;
++
++      /* By IP address */
++
++      switch ((&inf->address)->type)
++        {
++        case GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4:
++            {
++              grub_uint32_t n = grub_be_to_cpu32 ((&inf->address)->ipv4);
++              grub_snprintf (suffix, GRUB_NET_MAX_STR_ADDR_LEN, "%02X%02X%02X%02X", \
++                             ((n >> 24) & 0xff), ((n >> 16) & 0xff), \
++                             ((n >> 8) & 0xff), ((n >> 0) & 0xff));
++
++              if (search_through (8, 1) == 0) return GRUB_ERR_NONE;
++              break;
++            }
++        case GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV6:
++            {
++              char buf[GRUB_NET_MAX_STR_ADDR_LEN];
++              struct grub_net_network_level_address base;
++              base.type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV6;
++              grub_memcpy (&base.ipv6, ((&inf->address)->ipv6), 16);
++              grub_net_addr_to_str (&base, buf);
++
++              for (ptr = buf; *ptr; ptr++)
++                if (*ptr == ':')
++                  *ptr = '-';
++
++              grub_snprintf (suffix, GRUB_NET_MAX_STR_ADDR_LEN, "%s", buf);
++              if (search_through (1, 0) == 0) return GRUB_ERR_NONE;
++              break;
++            }
++        case GRUB_NET_NETWORK_LEVEL_PROTOCOL_DHCP_RECV:
++          return grub_error (GRUB_ERR_BUG, "shouldn't reach here");
++        default:
++          return grub_error (GRUB_ERR_BUG,
++                             "unsupported address type %d", (&inf->address)->type);
++        }
++    }
++
++  /* Remove the remaining minus sign at the end. */
++  config[config_len] = '\0';
++
++  return GRUB_ERR_NONE;
++}
++
+ static struct grub_preboot *fini_hnd;
+ static grub_command_t cmd_addaddr, cmd_deladdr, cmd_addroute, cmd_delroute;
+diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c
+index aa0b3e5..cc519a5 100644
+--- a/grub-core/normal/main.c
++++ b/grub-core/normal/main.c
+@@ -32,6 +32,7 @@
+ #include <grub/i18n.h>
+ #include <grub/charset.h>
+ #include <grub/script_sh.h>
++#include <grub/net.h>
+ GRUB_MOD_LICENSE ("GPLv3+");
+@@ -379,10 +380,19 @@ grub_cmd_normal (struct grub_command *cmd __attribute__ ((unused)),
+       prefix = grub_env_get ("prefix");
+       if (prefix)
+-      {
+-        config = grub_xasprintf ("%s/grub.cfg", prefix);
+-        if (! config)
+-          goto quit;
++        {
++          grub_size_t config_len;
++          config_len = grub_strlen (prefix) +
++                      sizeof ("/grub.cfg-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX");
++          config = grub_malloc (config_len);
++
++          if (! config)
++            goto quit;
++
++          grub_snprintf (config, config_len, "%s/grub.cfg", prefix);
++
++          if (grub_strncmp (prefix + 1, "tftp", sizeof ("tftp") - 1) == 0)
++            grub_net_search_configfile (config);
+         grub_enter_normal_mode (config);
+         grub_free (config);
+diff --git a/include/grub/net.h b/include/grub/net.h
+index 45348dd..09b8d56 100644
+--- a/include/grub/net.h
++++ b/include/grub/net.h
+@@ -534,6 +534,9 @@ extern char *grub_net_default_server;
+ #define GRUB_NET_TRIES 40
+ #define GRUB_NET_INTERVAL 400
+
+ #define VLANTAG_IDENTIFIER 0x8100
++grub_err_t
++grub_net_search_configfile (char *config);
++
+ #endif /* ! GRUB_NET_HEADER */
+-- 
+1.7.10.4
+
diff --git a/sort-version.patch b/sort-version.patch
new file mode 100644 (file)
index 0000000..a0ed155
--- /dev/null
@@ -0,0 +1,29 @@
+grub-mkconfig does not get it right when sorting "recent kernel first":
+
+sort kernel versions correctly:
+
+Wrong:
+        echo    'Loading Linux 3.0.8-1 ...'
+        echo    'Loading Linux 3.0.4-2 ...'
+        echo    'Loading Linux 3.0.13-1 ...'
+        echo    'Loading Linux 3.0.12-2 ...'
+        echo    'Loading Linux 2.6.38.8-1 ...'
+
+Correct:
+        echo    'Loading Linux 3.0.13-1 ...'
+        echo    'Loading Linux 3.0.12-2 ...'
+        echo    'Loading Linux 3.0.8-1 ...'
+        echo    'Loading Linux 3.0.4-2 ...'
+        echo    'Loading Linux 2.6.38.8-1 ...'
+
+--- grub-1.99/util/grub-mkconfig_lib.in~       2012-01-12 00:47:28.626740879 +0200
++++ grub-1.99/util/grub-mkconfig_lib.in        2012-01-12 00:53:49.554292436 +0200
+@@ -165,7 +165,7 @@
+     a="$b"
+     b="$c"
+   fi
+-  if (echo "$a" ; echo "$b") | sort -n | head -n 1 | grep -qx "$b" ; then
++  if (echo "$a" ; echo "$b") | sort -V | head -n 1 | grep -qx "$b" ; then
+     return 0
+   else
+     return 1
diff --git a/update-grub b/update-grub
new file mode 100644 (file)
index 0000000..87c23b2
--- /dev/null
@@ -0,0 +1,26 @@
+#!/bin/sh
+# Setup locale from system config,
+# otherwise it would be inherited from running terminal
+
+if [ -f /etc/sysconfig/i18n ]; then
+       . /etc/sysconfig/i18n
+
+       [ "$LANG" ] && export LANG || unset LANG
+       [ "$LC_ADDRESS" ] && export LC_ADDRESS || unset LC_ADDRESS
+       [ "$LC_COLLATE" ] && export LC_COLLATE || unset LC_COLLATE
+       [ "$LC_CTYPE" ] && export LC_CTYPE || unset LC_CTYPE
+       [ "$LC_IDENTIFICATION" ] && export LC_IDENTIFICATION || unset LC_IDENTIFICATION
+       [ "$LC_MEASUREMENT" ] && export LC_MEASUREMENT || unset LC_MEASUREMENT
+       [ "$LC_MESSAGES" ] && export LC_MESSAGES || unset LC_MESSAGES
+       [ "$LC_MONETARY" ] && export LC_MONETARY || unset LC_MONETARY
+       [ "$LC_NAME" ] && export LC_NAME || unset LC_NAME
+       [ "$LC_NUMERIC" ] && export LC_NUMERIC || unset LC_NUMERIC
+       [ "$LC_PAPER" ] && export LC_PAPER || unset LC_PAPER
+       [ "$LC_TELEPHONE" ] && export LC_TELEPHONE || unset LC_TELEPHONE
+       [ "$LC_TIME" ] && export LC_TIME || unset LC_TIME
+       [ "$LC_ALL" ] && export LC_ALL || unset LC_ALL
+       [ "$LANGUAGE" ] && export LANGUAGE || unset LANGUAGE
+       [ "$LINGUAS" ] && export LINGUAS || unset LINGUAS
+fi
+
+exec grub-mkconfig -o /boot/grub/grub.cfg "$@"
diff --git a/update-grub.8 b/update-grub.8
new file mode 100644 (file)
index 0000000..fd621b2
--- /dev/null
@@ -0,0 +1,18 @@
+.\" Copyright 2009 Felix Zielcke
+.\" Licensed under GPL3+
+.TH UPDATE-GRUB "8" "November 2012"
+.SH NAME
+update-grub \- stub for grub-mkconfig
+.SH SYNOPSIS
+.B update-grub
+.SH DESCRIPTION
+.B update-grub
+is a stub for running
+.B grub-mkconfig -o /boot/grub/grub.cfg
+to generate a grub2 config file.
+.SH ENVIRONMENT
+locale is initialized from the system
+.B /etc/sysconfig/i18n
+file.
+.SH "SEE ALSO"
+.BR grub-mkconfig (8)