[Pdbg] [PATCH v5 4/5] main: Use hexdump to dump memory from gemem
Amitay Isaacs
amitay at ozlabs.org
Wed Apr 17 15:26:00 AEST 2019
On Wed, 2019-04-17 at 15:20 +1000, Alistair Popple wrote:
> On Wednesday, 10 April 2019 6:01:50 PM AEST Amitay Isaacs wrote:
> > If getmem is being run on a terminal and if the output contains
> > non-printable characters, then use hexdump() to dump the data.
>
> To be honest really don't like this behavior being dependent on where
> stdout
> is going to. It seems like it would be suprising. For example if
> someone piped
> this into grep they would expect it to be running against the hexdump
> not the
> raw binary which could be confusing.
Fair enough. So by default it will use hexdump() unless the buffer is
printable. And when given the extra flag, it'll be always binary.
>
> The printable character detection is a great idea though. Can we just
> add a
> flag to force raw binary output instead of doing it based on write
> location?
>
> - Alistair
>
> > Signed-off-by: Amitay Isaacs <amitay at ozlabs.org>
> > ---
> > src/mem.c | 20 ++++++++++++++++++--
> > 1 file changed, 18 insertions(+), 2 deletions(-)
> >
> > diff --git a/src/mem.c b/src/mem.c
> > index 8045069..b264d98 100644
> > --- a/src/mem.c
> > +++ b/src/mem.c
> > @@ -21,6 +21,7 @@
> > #include <unistd.h>
> > #include <assert.h>
> > #include <stdbool.h>
> > +#include <ctype.h>
> >
> > #include <libpdbg.h>
> >
> > @@ -28,6 +29,7 @@
> > #include "progress.h"
> > #include "optcmd.h"
> > #include "parsers.h"
> > +#include "util.h"
> >
> > #define PR_ERROR(x, args...) \
> > pdbg_log(PDBG_ERROR, x, ##args)
> > @@ -75,8 +77,22 @@ static int _getmem(uint64_t addr, uint64_t size,
> > uint8_t
> > block_size, bool ci) }
> >
> > if (count > 0) {
> > - if (write(STDOUT_FILENO, buf, size) < 0)
> > - PR_ERROR("Unable to write stdout.\n");
> > + uint64_t i;
> > + bool printable = true;
> > +
> > + for (i=0; i<size; i++) {
> > + if (!isprint(buf[i])) {
> > + printable = false;
> > + break;
> > + }
> > + }
> > +
> > + if (isatty(STDOUT_FILENO) && !printable) {
> > + hexdump(addr, buf, size, 1);
> > + } else {
> > + if (write(STDOUT_FILENO, buf, size) < 0)
> > + PR_ERROR("Unable to write stdout.\n");
> > + }
> > }
> >
> > free(buf);
>
>
Amitay.
--
Choose a job you love, and you will never have to work a day in your life. -
Confucius
More information about the Pdbg
mailing list