From d16c3dcdc7d92fe62a7ca53e299acc0a8fdf8d9b Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Fri, 21 Sep 2018 09:59:48 +0930 Subject: [PATCH] devtools/decodemsg: take series of msgs from stdin. Useful in combination with gossipwith. Signed-off-by: Rusty Russell --- devtools/decodemsg.c | 53 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/devtools/decodemsg.c b/devtools/decodemsg.c index f5bdf0c96..4c332d716 100644 --- a/devtools/decodemsg.c +++ b/devtools/decodemsg.c @@ -1,10 +1,12 @@ #include #include +#include #include #include #include #include #include +#include int main(int argc, char *argv[]) { @@ -15,22 +17,49 @@ int main(int argc, char *argv[]) opt_register_noarg("--onion", opt_set_bool, &onion, "Decode an error message instead of a peer message"); opt_register_noarg("--help|-h", opt_usage_and_exit, - "" - "Decode a lightning spec wire message from hex.", + "[]" + "Decode a lightning spec wire message from hex, or a series of messages from stdin", "Print this message."); opt_parse(&argc, argv, opt_log_stderr_exit); - if (argc != 2) - errx(1, "Need a hex message"); + if (argc > 2) + opt_usage_and_exit("Too many arguments"); - /* Arg is hex string */ - m = tal_hexdata(NULL, argv[1], strlen(argv[1])); - if (!m) - errx(1, "'%s' is not valid hex", argv[1]); + if (argc == 2) { + /* Arg is hex string */ + m = tal_hexdata(NULL, argv[1], strlen(argv[1])); + if (!m) + errx(1, "'%s' is not valid hex", argv[1]); - if (onion) - printonion_type_message(m); - else - printwire_type_message(m); + if (onion) + printonion_type_message(m); + else + printwire_type_message(m); + } else { + u8 *f = grab_fd(NULL, STDIN_FILENO); + size_t off = 0; + + while (off != tal_count(f)) { + be16 len; + + if (off + sizeof(len) > tal_count(f)) { + warnx("Truncated file"); + break; + } + memcpy(&len, f + off, sizeof(len)); + off += sizeof(len); + if (off + be16_to_cpu(len) > tal_count(f)) { + warnx("Truncated file"); + break; + } + m = tal_dup_arr(f, u8, f + off, be16_to_cpu(len), 0); + if (onion) + printonion_type_message(m); + else + printwire_type_message(m); + off += be16_to_cpu(len); + tal_free(m); + } + } return 0; }