a5bd9f6
From fae25d35c12764fae63a85df467470d6a1120bd5 Mon Sep 17 00:00:00 2001
a5bd9f6
From: Vladimir 'phcoder' Serbinenko <phcoder@gmail.com>
a5bd9f6
Date: Sun, 3 Mar 2013 01:34:27 +0100
a5bd9f6
Subject: [PATCH 190/364] 	* grub-core/kern/env.c, include/grub/env.h:
a5bd9f6
 Change iterator through 	all vars to a macro. All users updated.
a5bd9f6
a5bd9f6
---
a5bd9f6
 ChangeLog                   |  5 ++++
a5bd9f6
 grub-core/efiemu/pnvram.c   | 64 ++++++++++++++++++++-------------------------
a5bd9f6
 grub-core/kern/corecmd.c    | 12 +++------
a5bd9f6
 grub-core/kern/env.c        | 39 +++++++--------------------
a5bd9f6
 grub-core/loader/i386/bsd.c | 46 ++++++++++++--------------------
a5bd9f6
 grub-core/loader/xnu.c      | 16 +++++-------
a5bd9f6
 include/grub/env.h          |  6 ++++-
a5bd9f6
 7 files changed, 74 insertions(+), 114 deletions(-)
a5bd9f6
a5bd9f6
diff --git a/ChangeLog b/ChangeLog
a5bd9f6
index f117127..5f9cde5 100644
a5bd9f6
--- a/ChangeLog
a5bd9f6
+++ b/ChangeLog
a5bd9f6
@@ -1,5 +1,10 @@
a5bd9f6
 2013-03-03  Vladimir Serbinenko  <phcoder@gmail.com>
a5bd9f6
 
a5bd9f6
+	* grub-core/kern/env.c, include/grub/env.h: Change iterator through
a5bd9f6
+	all vars to a macro. All users updated.
a5bd9f6
+
a5bd9f6
+2013-03-03  Vladimir Serbinenko  <phcoder@gmail.com>
a5bd9f6
+
a5bd9f6
 	* grub-core/disk/ieee1275/nand.c: Fix compilation on
a5bd9f6
 	i386-ieee1275.
a5bd9f6
 
a5bd9f6
diff --git a/grub-core/efiemu/pnvram.c b/grub-core/efiemu/pnvram.c
a5bd9f6
index 28d0050..c5c3d4b 100644
a5bd9f6
--- a/grub-core/efiemu/pnvram.c
a5bd9f6
+++ b/grub-core/efiemu/pnvram.c
a5bd9f6
@@ -102,9 +102,23 @@ nvram_set (void * data __attribute__ ((unused)))
a5bd9f6
   grub_uint32_t *accuracy
a5bd9f6
     = grub_efiemu_mm_obtain_request (accuracy_handle);
a5bd9f6
   char *nvramptr;
a5bd9f6
+  struct grub_env_var *var;
a5bd9f6
 
a5bd9f6
-  auto int iterate_env (struct grub_env_var *var);
a5bd9f6
-  int iterate_env (struct grub_env_var *var)
a5bd9f6
+  /* Copy to definitive loaction */
a5bd9f6
+  grub_dprintf ("efiemu", "preparing pnvram\n");
a5bd9f6
+
a5bd9f6
+  env = grub_env_get ("EfiEmu.pnvram.high_monotonic_count");
a5bd9f6
+  *high_monotonic_count = env ? grub_strtoul (env, 0, 0) : 1;
a5bd9f6
+  env = grub_env_get ("EfiEmu.pnvram.timezone");
a5bd9f6
+  *timezone = env ? grub_strtosl (env, 0, 0) : GRUB_EFI_UNSPECIFIED_TIMEZONE;
a5bd9f6
+  env = grub_env_get ("EfiEmu.pnvram.accuracy");
a5bd9f6
+  *accuracy = env ? grub_strtoul (env, 0, 0) : 50000000;
a5bd9f6
+  env = grub_env_get ("EfiEmu.pnvram.daylight");
a5bd9f6
+  *daylight = env ? grub_strtoul (env, 0, 0) : 0;
a5bd9f6
+
a5bd9f6
+  nvramptr = nvram;
a5bd9f6
+  grub_memset (nvram, 0, nvramsize);
a5bd9f6
+  FOR_SORTED_ENV (var)
a5bd9f6
   {
a5bd9f6
     char *guid, *attr, *name, *varname;
a5bd9f6
     struct efi_variable *efivar;
a5bd9f6
@@ -114,44 +128,41 @@ nvram_set (void * data __attribute__ ((unused)))
a5bd9f6
 
a5bd9f6
     if (grub_memcmp (var->name, "EfiEmu.pnvram.",
a5bd9f6
 		     sizeof ("EfiEmu.pnvram.") - 1) != 0)
a5bd9f6
-      return 0;
a5bd9f6
+      continue;
a5bd9f6
 
a5bd9f6
     guid = var->name + sizeof ("EfiEmu.pnvram.") - 1;
a5bd9f6
 
a5bd9f6
     attr = grub_strchr (guid, '.');
a5bd9f6
     if (!attr)
a5bd9f6
-      return 0;
a5bd9f6
+      continue;
a5bd9f6
     attr++;
a5bd9f6
 
a5bd9f6
     name = grub_strchr (attr, '.');
a5bd9f6
     if (!name)
a5bd9f6
-      return 0;
a5bd9f6
+      continue;
a5bd9f6
     name++;
a5bd9f6
 
a5bd9f6
     efivar = (struct efi_variable *) nvramptr;
a5bd9f6
     if (nvramptr - nvram + sizeof (struct efi_variable) > nvramsize)
a5bd9f6
-      {
a5bd9f6
-	grub_error (GRUB_ERR_OUT_OF_MEMORY,
a5bd9f6
-		    "too many NVRAM variables for reserved variable space."
a5bd9f6
-		    " Try increasing EfiEmu.pnvram.size");
a5bd9f6
-	return 1;
a5bd9f6
-      }
a5bd9f6
+      return grub_error (GRUB_ERR_OUT_OF_MEMORY,
a5bd9f6
+			 "too many NVRAM variables for reserved variable space."
a5bd9f6
+			 " Try increasing EfiEmu.pnvram.size");
a5bd9f6
 
a5bd9f6
     nvramptr += sizeof (struct efi_variable);
a5bd9f6
 
a5bd9f6
     efivar->guid.data1 = grub_cpu_to_le32 (grub_strtoul (guid, &guid, 16));
a5bd9f6
     if (*guid != '-')
a5bd9f6
-      return 0;
a5bd9f6
+      continue;
a5bd9f6
     guid++;
a5bd9f6
 
a5bd9f6
     efivar->guid.data2 = grub_cpu_to_le16 (grub_strtoul (guid, &guid, 16));
a5bd9f6
     if (*guid != '-')
a5bd9f6
-      return 0;
a5bd9f6
+      continue;
a5bd9f6
     guid++;
a5bd9f6
 
a5bd9f6
     efivar->guid.data3 = grub_cpu_to_le16 (grub_strtoul (guid, &guid, 16));
a5bd9f6
     if (*guid != '-')
a5bd9f6
-      return 0;
a5bd9f6
+      continue;
a5bd9f6
     guid++;
a5bd9f6
 
a5bd9f6
     guidcomp = grub_strtoull (guid, 0, 16);
a5bd9f6
@@ -162,10 +173,10 @@ nvram_set (void * data __attribute__ ((unused)))
a5bd9f6
 
a5bd9f6
     varname = grub_malloc (grub_strlen (name) + 1);
a5bd9f6
     if (! varname)
a5bd9f6
-      return 1;
a5bd9f6
+      return grub_errno;
a5bd9f6
 
a5bd9f6
     if (unescape (name, varname, varname + grub_strlen (name) + 1, &len))
a5bd9f6
-      return 1;
a5bd9f6
+      break;
a5bd9f6
 
a5bd9f6
     len = grub_utf8_to_utf16 ((grub_uint16_t *) nvramptr,
a5bd9f6
 			      (nvramsize - (nvramptr - nvram)) / 2,
a5bd9f6
@@ -179,33 +190,16 @@ nvram_set (void * data __attribute__ ((unused)))
a5bd9f6
     if (unescape (var->value, nvramptr, nvram + nvramsize, &len))
a5bd9f6
       {
a5bd9f6
 	efivar->namelen = 0;
a5bd9f6
-	return 1;
a5bd9f6
+	break;
a5bd9f6
       }
a5bd9f6
 
a5bd9f6
     nvramptr += len;
a5bd9f6
 
a5bd9f6
     efivar->size = len;
a5bd9f6
-
a5bd9f6
-    return 0;
a5bd9f6
   }
a5bd9f6
-
a5bd9f6
-  /* Copy to definitive loaction */
a5bd9f6
-  grub_dprintf ("efiemu", "preparing pnvram\n");
a5bd9f6
-
a5bd9f6
-  env = grub_env_get ("EfiEmu.pnvram.high_monotonic_count");
a5bd9f6
-  *high_monotonic_count = env ? grub_strtoul (env, 0, 0) : 1;
a5bd9f6
-  env = grub_env_get ("EfiEmu.pnvram.timezone");
a5bd9f6
-  *timezone = env ? grub_strtosl (env, 0, 0) : GRUB_EFI_UNSPECIFIED_TIMEZONE;
a5bd9f6
-  env = grub_env_get ("EfiEmu.pnvram.accuracy");
a5bd9f6
-  *accuracy = env ? grub_strtoul (env, 0, 0) : 50000000;
a5bd9f6
-  env = grub_env_get ("EfiEmu.pnvram.daylight");
a5bd9f6
-  *daylight = env ? grub_strtoul (env, 0, 0) : 0;
a5bd9f6
-
a5bd9f6
-  nvramptr = nvram;
a5bd9f6
-  grub_memset (nvram, 0, nvramsize);
a5bd9f6
-  grub_env_iterate (iterate_env);
a5bd9f6
   if (grub_errno)
a5bd9f6
     return grub_errno;
a5bd9f6
+
a5bd9f6
   *nvramsize_def = nvramsize;
a5bd9f6
 
a5bd9f6
   /* Register symbols */
a5bd9f6
diff --git a/grub-core/kern/corecmd.c b/grub-core/kern/corecmd.c
a5bd9f6
index 0dc4d00..cfab676 100644
a5bd9f6
--- a/grub-core/kern/corecmd.c
a5bd9f6
+++ b/grub-core/kern/corecmd.c
a5bd9f6
@@ -28,14 +28,6 @@
a5bd9f6
 #include <grub/command.h>
a5bd9f6
 #include <grub/i18n.h>
a5bd9f6
 
a5bd9f6
-/* Helper for grub_core_cmd_set.  */
a5bd9f6
-static int
a5bd9f6
-print_env (struct grub_env_var *env)
a5bd9f6
-{
a5bd9f6
-  grub_printf ("%s=%s\n", env->name, env->value);
a5bd9f6
-  return 0;
a5bd9f6
-}
a5bd9f6
-
a5bd9f6
 /* set ENVVAR=VALUE */
a5bd9f6
 static grub_err_t
a5bd9f6
 grub_core_cmd_set (struct grub_command *cmd __attribute__ ((unused)),
a5bd9f6
@@ -46,7 +38,9 @@ grub_core_cmd_set (struct grub_command *cmd __attribute__ ((unused)),
a5bd9f6
 
a5bd9f6
   if (argc < 1)
a5bd9f6
     {
a5bd9f6
-      grub_env_iterate (print_env);
a5bd9f6
+      struct grub_env_var *env;
a5bd9f6
+      FOR_SORTED_ENV (env)
a5bd9f6
+	grub_printf ("%s=%s\n", env->name, env->value);
a5bd9f6
       return 0;
a5bd9f6
     }
a5bd9f6
 
a5bd9f6
diff --git a/grub-core/kern/env.c b/grub-core/kern/env.c
a5bd9f6
index 7bfa238..c408626 100644
a5bd9f6
--- a/grub-core/kern/env.c
a5bd9f6
+++ b/grub-core/kern/env.c
a5bd9f6
@@ -166,11 +166,10 @@ grub_env_unset (const char *name)
a5bd9f6
   grub_free (var);
a5bd9f6
 }
a5bd9f6
 
a5bd9f6
-void
a5bd9f6
-grub_env_iterate (int (*func) (struct grub_env_var *var))
a5bd9f6
+struct grub_env_var *
a5bd9f6
+grub_env_update_get_sorted (void)
a5bd9f6
 {
a5bd9f6
-  struct grub_env_sorted_var *sorted_list = 0;
a5bd9f6
-  struct grub_env_sorted_var *sorted_var;
a5bd9f6
+  struct grub_env_var *sorted_list = 0;
a5bd9f6
   int i;
a5bd9f6
 
a5bd9f6
   /* Add variables associated with this context into a sorted list.  */
a5bd9f6
@@ -180,40 +179,20 @@ grub_env_iterate (int (*func) (struct grub_env_var *var))
a5bd9f6
 
a5bd9f6
       for (var = grub_current_context->vars[i]; var; var = var->next)
a5bd9f6
 	{
a5bd9f6
-	  struct grub_env_sorted_var *p, **q;
a5bd9f6
-
a5bd9f6
-	  sorted_var = grub_malloc (sizeof (*sorted_var));
a5bd9f6
-	  if (! sorted_var)
a5bd9f6
-	    goto fail;
a5bd9f6
-
a5bd9f6
-	  sorted_var->var = var;
a5bd9f6
+	  struct grub_env_var *p, **q;
a5bd9f6
 
a5bd9f6
-	  for (q = &sorted_list, p = *q; p; q = &((*q)->next), p = *q)
a5bd9f6
+	  for (q = &sorted_list, p = *q; p; q = &((*q)->sorted_next), p = *q)
a5bd9f6
 	    {
a5bd9f6
-	      if (grub_strcmp (p->var->name, var->name) > 0)
a5bd9f6
+	      if (grub_strcmp (p->name, var->name) > 0)
a5bd9f6
 		break;
a5bd9f6
 	    }
a5bd9f6
 
a5bd9f6
-	  sorted_var->next = *q;
a5bd9f6
-	  *q = sorted_var;
a5bd9f6
+	  var->sorted_next = *q;
a5bd9f6
+	  *q = var;
a5bd9f6
 	}
a5bd9f6
     }
a5bd9f6
 
a5bd9f6
-  /* Iterate FUNC on the sorted list.  */
a5bd9f6
-  for (sorted_var = sorted_list; sorted_var; sorted_var = sorted_var->next)
a5bd9f6
-    if (func (sorted_var->var))
a5bd9f6
-      break;
a5bd9f6
-
a5bd9f6
- fail:
a5bd9f6
-
a5bd9f6
-  /* Free the sorted list.  */
a5bd9f6
-  for (sorted_var = sorted_list; sorted_var; )
a5bd9f6
-    {
a5bd9f6
-      struct grub_env_sorted_var *tmp = sorted_var->next;
a5bd9f6
-
a5bd9f6
-      grub_free (sorted_var);
a5bd9f6
-      sorted_var = tmp;
a5bd9f6
-    }
a5bd9f6
+  return sorted_list;
a5bd9f6
 }
a5bd9f6
 
a5bd9f6
 grub_err_t
a5bd9f6
diff --git a/grub-core/loader/i386/bsd.c b/grub-core/loader/i386/bsd.c
a5bd9f6
index 6199609..e89ec26 100644
a5bd9f6
--- a/grub-core/loader/i386/bsd.c
a5bd9f6
+++ b/grub-core/loader/i386/bsd.c
a5bd9f6
@@ -589,33 +589,7 @@ grub_freebsd_boot (void)
a5bd9f6
   grub_err_t err;
a5bd9f6
   grub_size_t tag_buf_len = 0;
a5bd9f6
 
a5bd9f6
-  auto int iterate_env (struct grub_env_var *var);
a5bd9f6
-  int iterate_env (struct grub_env_var *var)
a5bd9f6
-  {
a5bd9f6
-    if ((!grub_memcmp (var->name, "kFreeBSD.", sizeof("kFreeBSD.") - 1)) && (var->name[sizeof("kFreeBSD.") - 1]))
a5bd9f6
-      {
a5bd9f6
-	grub_strcpy ((char *) p, &var->name[sizeof("kFreeBSD.") - 1]);
a5bd9f6
-	p += grub_strlen ((char *) p);
a5bd9f6
-	*(p++) = '=';
a5bd9f6
-	grub_strcpy ((char *) p, var->value);
a5bd9f6
-	p += grub_strlen ((char *) p) + 1;
a5bd9f6
-      }
a5bd9f6
-
a5bd9f6
-    return 0;
a5bd9f6
-  }
a5bd9f6
-
a5bd9f6
-  auto int iterate_env_count (struct grub_env_var *var);
a5bd9f6
-  int iterate_env_count (struct grub_env_var *var)
a5bd9f6
-  {
a5bd9f6
-    if ((!grub_memcmp (var->name, "kFreeBSD.", sizeof("kFreeBSD.") - 1)) && (var->name[sizeof("kFreeBSD.") - 1]))
a5bd9f6
-      {
a5bd9f6
-	p_size += grub_strlen (&var->name[sizeof("kFreeBSD.") - 1]);
a5bd9f6
-	p_size++;
a5bd9f6
-	p_size += grub_strlen (var->value) + 1;
a5bd9f6
-      }
a5bd9f6
-
a5bd9f6
-    return 0;
a5bd9f6
-  }
a5bd9f6
+  struct grub_env_var *var;
a5bd9f6
 
a5bd9f6
   grub_memset (&bi, 0, sizeof (bi));
a5bd9f6
   bi.version = FREEBSD_BOOTINFO_VERSION;
a5bd9f6
@@ -624,7 +598,13 @@ grub_freebsd_boot (void)
a5bd9f6
   bi.boot_device = freebsd_biosdev;
a5bd9f6
 
a5bd9f6
   p_size = 0;
a5bd9f6
-  grub_env_iterate (iterate_env_count);
a5bd9f6
+  FOR_SORTED_ENV (var)
a5bd9f6
+    if ((grub_memcmp (var->name, "kFreeBSD.", sizeof("kFreeBSD.") - 1) == 0) && (var->name[sizeof("kFreeBSD.") - 1]))
a5bd9f6
+      {
a5bd9f6
+	p_size += grub_strlen (&var->name[sizeof("kFreeBSD.") - 1]);
a5bd9f6
+	p_size++;
a5bd9f6
+	p_size += grub_strlen (var->value) + 1;
a5bd9f6
+      }
a5bd9f6
 
a5bd9f6
   if (p_size)
a5bd9f6
     p_size = ALIGN_PAGE (kern_end + p_size + 1) - kern_end;
a5bd9f6
@@ -664,7 +644,15 @@ grub_freebsd_boot (void)
a5bd9f6
   p0 = p;
a5bd9f6
   kern_end += p_size;
a5bd9f6
 
a5bd9f6
-  grub_env_iterate (iterate_env);
a5bd9f6
+  FOR_SORTED_ENV (var)
a5bd9f6
+    if ((grub_memcmp (var->name, "kFreeBSD.", sizeof("kFreeBSD.") - 1) == 0) && (var->name[sizeof("kFreeBSD.") - 1]))
a5bd9f6
+      {
a5bd9f6
+	grub_strcpy ((char *) p, &var->name[sizeof("kFreeBSD.") - 1]);
a5bd9f6
+	p += grub_strlen ((char *) p);
a5bd9f6
+	*(p++) = '=';
a5bd9f6
+	grub_strcpy ((char *) p, var->value);
a5bd9f6
+	p += grub_strlen ((char *) p) + 1;
a5bd9f6
+      }
a5bd9f6
 
a5bd9f6
   if (p != p0)
a5bd9f6
     {
a5bd9f6
diff --git a/grub-core/loader/xnu.c b/grub-core/loader/xnu.c
a5bd9f6
index 8c522f5..cdd9715 100644
a5bd9f6
--- a/grub-core/loader/xnu.c
a5bd9f6
+++ b/grub-core/loader/xnu.c
a5bd9f6
@@ -1332,8 +1332,8 @@ unescape (char *name, char *curdot, char *nextdot, int *len)
a5bd9f6
 grub_err_t
a5bd9f6
 grub_xnu_fill_devicetree (void)
a5bd9f6
 {
a5bd9f6
-  auto int iterate_env (struct grub_env_var *var);
a5bd9f6
-  int iterate_env (struct grub_env_var *var)
a5bd9f6
+  struct grub_env_var *var;
a5bd9f6
+  FOR_SORTED_ENV (var)
a5bd9f6
   {
a5bd9f6
     char *nextdot = 0, *curdot;
a5bd9f6
     struct grub_xnu_devtree_key **curkey = &grub_xnu_devtree_root;
a5bd9f6
@@ -1343,7 +1343,7 @@ grub_xnu_fill_devicetree (void)
a5bd9f6
 
a5bd9f6
     if (grub_memcmp (var->name, "XNU.DeviceTree.",
a5bd9f6
 		     sizeof ("XNU.DeviceTree.") - 1) != 0)
a5bd9f6
-      return 0;
a5bd9f6
+      continue;
a5bd9f6
 
a5bd9f6
     curdot = var->name + sizeof ("XNU.DeviceTree.") - 1;
a5bd9f6
     nextdot = grub_strchr (curdot, '.');
a5bd9f6
@@ -1354,7 +1354,7 @@ grub_xnu_fill_devicetree (void)
a5bd9f6
 	name = grub_realloc (name, nextdot - curdot + 1);
a5bd9f6
 
a5bd9f6
 	if (!name)
a5bd9f6
-	  return 1;
a5bd9f6
+	  return grub_errno;
a5bd9f6
 
a5bd9f6
 	unescape (name, curdot, nextdot, &len;;
a5bd9f6
 	name[len - 1] = 0;
a5bd9f6
@@ -1372,7 +1372,7 @@ grub_xnu_fill_devicetree (void)
a5bd9f6
     name = grub_realloc (name, nextdot - curdot + 1);
a5bd9f6
    
a5bd9f6
     if (!name)
a5bd9f6
-      return 1;
a5bd9f6
+      return grub_errno;
a5bd9f6
    
a5bd9f6
     unescape (name, curdot, nextdot, &len;;
a5bd9f6
     name[len] = 0;
a5bd9f6
@@ -1382,18 +1382,14 @@ grub_xnu_fill_devicetree (void)
a5bd9f6
    
a5bd9f6
     data = grub_malloc (grub_strlen (var->value) + 1);
a5bd9f6
     if (!data)
a5bd9f6
-      return 1;
a5bd9f6
+      return grub_errno;
a5bd9f6
    
a5bd9f6
     unescape (data, var->value, var->value + grub_strlen (var->value),
a5bd9f6
 	      &len;;
a5bd9f6
     curvalue->datasize = len;
a5bd9f6
     curvalue->data = data;
a5bd9f6
-
a5bd9f6
-    return 0;
a5bd9f6
   }
a5bd9f6
 
a5bd9f6
-  grub_env_iterate (iterate_env);
a5bd9f6
-
a5bd9f6
   return grub_errno;
a5bd9f6
 }
a5bd9f6
 
a5bd9f6
diff --git a/include/grub/env.h b/include/grub/env.h
a5bd9f6
index ef42582..76f832e 100644
a5bd9f6
--- a/include/grub/env.h
a5bd9f6
+++ b/include/grub/env.h
a5bd9f6
@@ -39,13 +39,17 @@ struct grub_env_var
a5bd9f6
   grub_env_write_hook_t write_hook;
a5bd9f6
   struct grub_env_var *next;
a5bd9f6
   struct grub_env_var **prevp;
a5bd9f6
+  struct grub_env_var *sorted_next;
a5bd9f6
   int global;
a5bd9f6
 };
a5bd9f6
 
a5bd9f6
 grub_err_t EXPORT_FUNC(grub_env_set) (const char *name, const char *val);
a5bd9f6
 const char *EXPORT_FUNC(grub_env_get) (const char *name);
a5bd9f6
 void EXPORT_FUNC(grub_env_unset) (const char *name);
a5bd9f6
-void EXPORT_FUNC(grub_env_iterate) (int (*func) (struct grub_env_var *var));
a5bd9f6
+struct grub_env_var *EXPORT_FUNC(grub_env_update_get_sorted) (void);
a5bd9f6
+
a5bd9f6
+#define FOR_SORTED_ENV(var) for (var = grub_env_update_get_sorted (); var; var = var->sorted_next)
a5bd9f6
+
a5bd9f6
 grub_err_t EXPORT_FUNC(grub_register_variable_hook) (const char *name,
a5bd9f6
 						     grub_env_read_hook_t read_hook,
a5bd9f6
 						     grub_env_write_hook_t write_hook);
a5bd9f6
-- 
a5bd9f6
1.8.1.4
a5bd9f6