On Thu, Dec 14, 2017, 07:00 Carlo Caione <ca...@caione.org> wrote: > From: Carlo Caione <ca...@endlessm.com> > > In endless we are using hexdump to read into the hiberfil.sys windows > file to detect if windows is hybernated or not. > > With this patch we introduce a new parameter to hexdump to enable the > possibility to save the output to a variable. > Why not use the hibercheck command for this?
> > Signed-off-by: Carlo Caione <ca...@endlessm.com> > --- > grub-core/commands/hexdump.c | 42 > ++++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 40 insertions(+), 2 deletions(-) > > diff --git a/grub-core/commands/hexdump.c b/grub-core/commands/hexdump.c > index 4c884b3a1..e6517ad57 100644 > --- a/grub-core/commands/hexdump.c > +++ b/grub-core/commands/hexdump.c > @@ -24,6 +24,7 @@ > #include <grub/lib/hexdump.h> > #include <grub/extcmd.h> > #include <grub/i18n.h> > +#include <grub/env.h> > > GRUB_MOD_LICENSE ("GPLv3+"); > > @@ -31,6 +32,8 @@ static const struct grub_arg_option options[] = { > {"skip", 's', 0, N_("Skip offset bytes from the beginning of file."), 0, > ARG_TYPE_INT}, > {"length", 'n', 0, N_("Read only LENGTH bytes."), 0, ARG_TYPE_INT}, > + {"set", 't', 0, N_("Set a variable to return value."), N_("VARNAME"), > + ARG_TYPE_STRING}, > {0, 0, 0, 0, 0, 0} > }; > > @@ -42,6 +45,8 @@ grub_cmd_hexdump (grub_extcmd_context_t ctxt, int argc, > char **args) > grub_ssize_t size, length; > grub_disk_addr_t skip; > int namelen; > + char *var_buf = NULL; > + char *var_p = NULL; > > if (argc != 1) > return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); > @@ -50,6 +55,14 @@ grub_cmd_hexdump (grub_extcmd_context_t ctxt, int argc, > char **args) > skip = (state[0].set) ? grub_strtoull (state[0].arg, 0, 0) : 0; > length = (state[1].set) ? grub_strtoul (state[1].arg, 0, 0) : 256; > > + if (state[2].set) > + { > + var_buf = grub_malloc (length + 1); > + if (! var_buf) > + return grub_errno; > + var_p = var_buf; > + } > + > if (!grub_strcmp (args[0], "(mem)")) > hexdump (skip, (char *) (grub_addr_t) skip, length); > else if ((args[0][0] == '(') && (args[0][namelen - 1] == ')')) > @@ -76,7 +89,13 @@ grub_cmd_hexdump (grub_extcmd_context_t ctxt, int argc, > char **args) > if (grub_disk_read (disk, sector, ofs, len, buf)) > break; > > - hexdump (skip, buf, len); > + if (state[2].set) > + { > + grub_memcpy (var_p, buf, len); > + var_p += len; > + } > + else > + hexdump (skip, buf, len); > > ofs = 0; > skip += len; > @@ -101,7 +120,15 @@ grub_cmd_hexdump (grub_extcmd_context_t ctxt, int > argc, char **args) > unsigned long len; > > len = ((length) && (size > length)) ? length : size; > - hexdump (skip, buf, len); > + > + if (state[2].set) > + { > + grub_memcpy (var_p, buf, len); > + var_p += len; > + } > + else > + hexdump (skip, buf, len); > + > skip += len; > if (length) > { > @@ -114,6 +141,17 @@ grub_cmd_hexdump (grub_extcmd_context_t ctxt, int > argc, char **args) > grub_file_close (file); > } > > + if (state[2].set) > + { > + grub_ssize_t i; > + > + *var_p = 0; > + for (i = 0; i < length - 1; i++) > + var_buf[i] = ((var_buf[i] >= 32) && (var_buf[i] < 127)) ? > var_buf[i] : '.'; > + > + grub_env_set(state[2].arg, var_buf); > + } > + > return 0; > } > > -- > 2.14.1 > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > https://lists.gnu.org/mailman/listinfo/grub-devel >
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel