[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 2/3] grub: Make grub_envblk_iterate() return an int
From: |
Prarit Bhargava |
Subject: |
[PATCH v2 2/3] grub: Make grub_envblk_iterate() return an int |
Date: |
Wed, 16 Jan 2019 13:34:42 -0500 |
grub_envblk_iterate() is a void. Future functions will require the
ability to interpret return codes from the iteration, so
grub_envblk_iterate() should be an int.
The value of 0 returned from the hook functions is overloaded and cannot
be parsed by callers to grub_envblk_iterate() for error handling. To fix
this add GRUB_ERR_ITERATE_STOP and GRUB_ERR_ITERATE_CONTINUE to the error
returns so the iteration can be stopped and continued respectively.
Make grub_envblk_iterate() return an int.
Signed-off-by: Prarit Bhargava <address@hidden>
Cc: address@hidden
Cc: address@hidden
Cc: address@hidden
Cc: address@hidden
Cc: Daniel Kiper <address@hidden>
---
grub-core/commands/loadenv.c | 6 +++---
grub-core/lib/envblk.c | 17 ++++++++---------
include/grub/err.h | 4 +++-
include/grub/lib/envblk.h | 6 +++---
util/grub-editenv.c | 2 +-
5 files changed, 18 insertions(+), 17 deletions(-)
diff --git a/grub-core/commands/loadenv.c b/grub-core/commands/loadenv.c
index 3fd664aac331..1bbae5f7f332 100644
--- a/grub-core/commands/loadenv.c
+++ b/grub-core/commands/loadenv.c
@@ -144,14 +144,14 @@ set_var (const char *name, const char *value, void
*whitelist)
if (! whitelist)
{
grub_env_set (name, value);
- return 0;
+ return GRUB_ERR_ITERATE_CONTINUE;
}
if (test_whitelist_membership (name,
(const grub_env_whitelist_t *) whitelist))
grub_env_set (name, value);
- return 0;
+ return GRUB_ERR_ITERATE_CONTINUE;
}
static grub_err_t
@@ -192,7 +192,7 @@ print_var (const char *name, const char *value,
void *hook_data __attribute__ ((unused)))
{
grub_printf ("%s=%s\n", name, value);
- return 0;
+ return GRUB_ERR_ITERATE_CONTINUE;
}
static grub_err_t
diff --git a/grub-core/lib/envblk.c b/grub-core/lib/envblk.c
index 230e0e9d9abe..3e43843c4535 100644
--- a/grub-core/lib/envblk.c
+++ b/grub-core/lib/envblk.c
@@ -223,7 +223,7 @@ grub_envblk_delete (grub_envblk_t envblk, const char *name)
}
}
-void
+int
grub_envblk_iterate (grub_envblk_t envblk,
void *hook_data,
int hook (const char *name, const char *value, void
*hook_data))
@@ -247,8 +247,7 @@ grub_envblk_iterate (grub_envblk_t envblk,
while (p < pend && *p != '=')
p++;
if (p == pend)
- /* Broken. */
- return;
+ return GRUB_ERR_OUT_OF_RANGE;
name_end = p;
p++;
@@ -264,13 +263,11 @@ grub_envblk_iterate (grub_envblk_t envblk,
}
if (p >= pend)
- /* Broken. */
- return;
+ return GRUB_ERR_OUT_OF_RANGE;
name = grub_malloc (p - name_start + 1);
if (! name)
- /* out of memory. */
- return;
+ return GRUB_ERR_OUT_OF_MEMORY;
value = name + (value_start - name_start);
@@ -288,10 +285,12 @@ grub_envblk_iterate (grub_envblk_t envblk,
ret = hook (name, value, hook_data);
grub_free (name);
- if (ret)
- return;
+ if (ret != GRUB_ERR_ITERATE_CONTINUE)
+ return ret;
}
p = find_next_line (p, pend);
}
+
+ return GRUB_ERR_NONE;
}
diff --git a/include/grub/err.h b/include/grub/err.h
index 1590c688e1d3..75ebb54201e8 100644
--- a/include/grub/err.h
+++ b/include/grub/err.h
@@ -71,7 +71,9 @@ typedef enum
GRUB_ERR_NET_PACKET_TOO_BIG,
GRUB_ERR_NET_NO_DOMAIN,
GRUB_ERR_EOF,
- GRUB_ERR_BAD_SIGNATURE
+ GRUB_ERR_BAD_SIGNATURE,
+ GRUB_ERR_ITERATE_STOP,
+ GRUB_ERR_ITERATE_CONTINUE
}
grub_err_t;
diff --git a/include/grub/lib/envblk.h b/include/grub/lib/envblk.h
index c3e655921709..7637791f4228 100644
--- a/include/grub/lib/envblk.h
+++ b/include/grub/lib/envblk.h
@@ -34,9 +34,9 @@ typedef struct grub_envblk *grub_envblk_t;
grub_envblk_t grub_envblk_open (char *buf, grub_size_t size);
int grub_envblk_set (grub_envblk_t envblk, const char *name, const char
*value);
void grub_envblk_delete (grub_envblk_t envblk, const char *name);
-void grub_envblk_iterate (grub_envblk_t envblk,
- void *hook_data,
- int hook (const char *name, const char *value, void
*hook_data));
+int grub_envblk_iterate (grub_envblk_t envblk,
+ void *hook_data,
+ int hook (const char *name, const char *value, void
*hook_data));
void grub_envblk_close (grub_envblk_t envblk);
static inline char *
diff --git a/util/grub-editenv.c b/util/grub-editenv.c
index 0b6c69b9688c..5f87b09d924a 100644
--- a/util/grub-editenv.c
+++ b/util/grub-editenv.c
@@ -169,7 +169,7 @@ print_var (const char *varname, const char *value,
void *hook_data __attribute__ ((unused)))
{
printf ("%s=%s\n", varname, value);
- return 0;
+ return GRUB_ERR_ITERATE_CONTINUE;
}
static void
--
2.17.2