grub2/grub2-default-distributor.patch

202 lines
4.6 KiB
Diff

v1:
As long as VERSION in /etc/os-release has been commented out for rolling
release, we can replace openSUSE Tumbleweed specific handling for grub
distributor with a generic one.
v2:
Use /usr/lib/os-release as fallback to /etc/os-release
Index: grub-2.06/grub-core/osdep/unix/config.c
===================================================================
--- grub-2.06.orig/grub-core/osdep/unix/config.c
+++ grub-2.06/grub-core/osdep/unix/config.c
@@ -61,6 +61,131 @@ grub_util_get_localedir (void)
return LOCALEDIR;
}
+#ifdef __linux__
+static char *
+os_release_get_val (const char *buf, const char *key)
+{
+ const char *ptr = buf;
+ char *ret;
+
+ while (*ptr && grub_isspace(*ptr))
+ ptr++;
+
+ if (*ptr == '#')
+ return NULL;
+
+ if (grub_strncmp (ptr, key, grub_strlen (key)) != 0)
+ return NULL;
+
+ ptr += grub_strlen (key);
+ if (*ptr++ != '=' || *ptr == '\0')
+ return NULL;
+
+ if (*ptr == '"' || *ptr == '\'')
+ {
+ char c = *ptr;
+ int i = 0;
+ char *tmp, *ptmp;
+
+ if (*++ptr == '\0')
+ return NULL;
+
+ tmp = grub_strdup (ptr);
+ if ((ptmp = grub_strrchr (tmp, c)))
+ *ptmp = '\0';
+
+ ret = malloc (grub_strlen (tmp) + 1);
+ ptmp = tmp;
+ while (*ptmp)
+ {
+ if (*ptmp != '\\' || *(ptmp + 1) != c)
+ ret[i++] = *ptmp;
+ ++ptmp;
+ }
+
+ grub_free (tmp);
+ ret[i] = '\0';
+ }
+ else
+ {
+ char *pret;
+
+ ret = grub_strdup (ptr);
+ if ((pret = grub_strchr (ret, ' ')))
+ *pret = '\0';
+ }
+
+ return ret;
+}
+
+static char*
+grub_util_default_distributor (void)
+{
+ char *cfgfile;
+ char buf[1024];
+ FILE *fp = NULL;
+ char *os_name = NULL;
+ char *os_version = NULL;
+
+ cfgfile = grub_util_path_concat (2, GRUB_SYSCONFDIR, "os-release");
+ if (!grub_util_is_regular (cfgfile))
+ {
+ grub_free (cfgfile);
+ cfgfile = grub_util_path_concat (2, "/usr/lib", "os-release");
+ if (!grub_util_is_regular (cfgfile))
+ {
+ grub_free (cfgfile);
+ return NULL;
+ }
+ }
+
+ fp = grub_util_fopen (cfgfile, "r");
+
+ if (!fp)
+ {
+ grub_util_warn (_("cannot open configuration file `%s': %s"),
+ cfgfile, strerror (errno));
+ grub_free (cfgfile);
+ return NULL;
+ }
+
+ grub_free (cfgfile);
+
+ while (fgets (buf, sizeof (buf), fp))
+ {
+ if (buf[grub_strlen(buf) - 1] == '\n')
+ buf[grub_strlen(buf) - 1] = '\0';
+
+ if (!os_name
+ && (os_name = os_release_get_val (buf, "NAME")))
+ continue;
+ if (!os_version
+ && (os_version = os_release_get_val (buf, "VERSION")))
+ continue;
+ if (os_name && os_version)
+ break;
+ }
+
+ fclose (fp);
+
+ if (os_name && os_version)
+ {
+ char *os_name_version;
+
+ os_name_version = grub_xasprintf ("%s %s", os_name, os_version);
+
+ grub_free (os_name);
+ grub_free (os_version);
+
+ return os_name_version;
+ }
+
+ grub_free (os_version);
+
+ return os_name;
+}
+#endif
+
void
grub_util_load_config (struct grub_util_config *cfg)
{
@@ -125,7 +250,17 @@ grub_util_load_config (struct grub_util_
waitpid (pid, NULL, 0);
}
if (f)
- return;
+ {
+#ifdef __linux__
+ if (!cfg->grub_distributor || cfg->grub_distributor[0] == '\0')
+ {
+ if (cfg->grub_distributor)
+ grub_free (cfg->grub_distributor);
+ cfg->grub_distributor = grub_util_default_distributor ();
+ }
+#endif
+ return;
+ }
f = grub_util_fopen (cfgfile, "r");
if (f)
@@ -136,4 +271,13 @@ grub_util_load_config (struct grub_util_
else
grub_util_warn (_("cannot open configuration file `%s': %s"),
cfgfile, strerror (errno));
+
+#ifdef __linux__
+ if (!cfg->grub_distributor || cfg->grub_distributor[0] == '\0')
+ {
+ if (cfg->grub_distributor)
+ grub_free (cfg->grub_distributor);
+ cfg->grub_distributor = grub_util_default_distributor ();
+ }
+#endif
}
Index: grub-2.06/util/grub-mkconfig.in
===================================================================
--- grub-2.06.orig/util/grub-mkconfig.in
+++ grub-2.06/util/grub-mkconfig.in
@@ -225,6 +225,19 @@ GRUB_ACTUAL_DEFAULT="$GRUB_DEFAULT"
if [ "x${GRUB_ACTUAL_DEFAULT}" = "xsaved" ] ; then GRUB_ACTUAL_DEFAULT="`"${grub_editenv}" - list | sed -n '/^saved_entry=/ s,^saved_entry=,,p'`" ; fi
+if [ x"${GRUB_DISTRIBUTOR}" = x ] ; then
+ for i in "${sysconfdir}/os-release" "/usr/lib/os-release" ; do
+ if [ -f "$i" ] ; then
+ . "$i"
+ break
+ fi
+ done
+ if [ x"${NAME}" != x ] && [ x"${VERSION}" != x ] ; then
+ GRUB_DISTRIBUTOR="${NAME} ${VERSION}"
+ else
+ GRUB_DISTRIBUTOR="${NAME}"
+ fi
+fi
# These are defined in this script, export them here so that user can
# override them.