From: Simon Glass Date: Sat, 8 May 2021 13:00:04 +0000 (-0600) Subject: hexdump: Allow ctrl-c to interrupt output X-Git-Url: http://git.dujemihanovic.xyz/?a=commitdiff_plain;h=735dd6ef89ebd3e05c1dfaef06aca61046503c63;p=u-boot.git hexdump: Allow ctrl-c to interrupt output If a long hexdump is initated the user may wish to interrupt it. Add support for this. Signed-off-by: Simon Glass --- diff --git a/include/hexdump.h b/include/hexdump.h index b75e26025a..f2ca4793d6 100644 --- a/include/hexdump.h +++ b/include/hexdump.h @@ -125,6 +125,8 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, * @buf: data blob to dump * @len: number of bytes in the @buf * @ascii: include ASCII after the hex output + * Returns: 0 if finished normally, -EINTR if Ctrl-C was pressed, -ENOSYS if not + * supported * * Given a buffer of u8 data, print_hex_dump() prints a hex + ASCII dump * to the stdio, with an optional leading prefix. @@ -143,8 +145,8 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, * Example output using %DUMP_PREFIX_ADDRESS and 4-byte mode: * ffffffff88089af0: 73727170 77767574 7b7a7978 7f7e7d7c pqrstuvwxyz{|}~. */ -void print_hex_dump(const char *prefix_str, int prefix_type, int rowsize, - int groupsize, const void *buf, size_t len, bool ascii); +int print_hex_dump(const char *prefix_str, int prefix_type, int rowsize, + int groupsize, const void *buf, size_t len, bool ascii); /** * print_hex_dump_bytes - shorthand form of print_hex_dump() with default params diff --git a/lib/hexdump.c b/lib/hexdump.c index a56e108164..149c93ead8 100644 --- a/lib/hexdump.c +++ b/lib/hexdump.c @@ -125,8 +125,8 @@ overflow1: return ascii ? ascii_column + len : (groupsize * 2 + 1) * ngroups - 1; } -void print_hex_dump(const char *prefix_str, int prefix_type, int rowsize, - int groupsize, const void *buf, size_t len, bool ascii) +int print_hex_dump(const char *prefix_str, int prefix_type, int rowsize, + int groupsize, const void *buf, size_t len, bool ascii) { const u8 *ptr = buf; int i, linelen, remaining = len; @@ -157,7 +157,11 @@ void print_hex_dump(const char *prefix_str, int prefix_type, int rowsize, printf("%s%s\n", prefix_str, linebuf); break; } + if (!IS_ENABLED(CONFIG_SPL_BUILD) && ctrlc()) + return -EINTR; } + + return 0; } void print_hex_dump_bytes(const char *prefix_str, int prefix_type, @@ -170,9 +174,10 @@ void print_hex_dump_bytes(const char *prefix_str, int prefix_type, * Some code in U-Boot copy-pasted from Linux kernel uses both * functions below so to keep stuff compilable we keep these stubs here. */ -void print_hex_dump(const char *prefix_str, int prefix_type, int rowsize, - int groupsize, const void *buf, size_t len, bool ascii) +int print_hex_dump(const char *prefix_str, int prefix_type, int rowsize, + int groupsize, const void *buf, size_t len, bool ascii) { + return -ENOSYS; } void print_hex_dump_bytes(const char *prefix_str, int prefix_type,