From 1e2c8fea4cfcc20561b65f6ff659d05f0eacdfc3 Mon Sep 17 00:00:00 2001 From: Mateusz Juzwiak Date: Fri, 19 Jul 2024 05:37:53 -0400 Subject: [PATCH] isotpsniffer: option for no quitting on invalid message received --- isotpsniffer.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/isotpsniffer.c b/isotpsniffer.c index 6ca29ae..2cd06c4 100644 --- a/isotpsniffer.c +++ b/isotpsniffer.c @@ -79,6 +79,7 @@ void print_usage(char *prg) fprintf(stderr, " -f (1 = HEX, 2 = ASCII, 3 = HEX & ASCII - default: %d)\n", FORMAT_DEFAULT); fprintf(stderr, " -L (set link layer options for CAN FD)\n"); fprintf(stderr, " -h (head: print only first bytes)\n"); + fprintf(stderr, " -q (don't quit on read error, allows to receive malformed frames)\n"); fprintf(stderr, "\nCAN IDs and addresses are given and expected in hexadecimal values.\n"); fprintf(stderr, "\n"); } @@ -189,6 +190,7 @@ int main(int argc, char **argv) int head = 0; int timestamp = 0; int format = FORMAT_DEFAULT; + int noquit = 0; canid_t src = NO_CAN_ID; canid_t dst = NO_CAN_ID; extern int optind, opterr, optopt; @@ -197,7 +199,7 @@ int main(int argc, char **argv) unsigned char buffer[4096]; int nbytes; - while ((opt = getopt(argc, argv, "s:d:x:X:h:ct:f:L?")) != -1) { + while ((opt = getopt(argc, argv, "s:d:x:X:h:ct:f:L?q")) != -1) { switch (opt) { case 's': src = strtoul(optarg, NULL, 16); @@ -249,6 +251,10 @@ int main(int argc, char **argv) } break; + case 'q': + noquit = 1; + break; + case '?': print_usage(basename(argv[0])); goto out; @@ -371,14 +377,17 @@ int main(int argc, char **argv) if (nbytes < 0) { perror("read socket s"); r = 1; - goto out; + if(!noquit) + goto out; } if (nbytes > 4095) { r = 1; + perror("read socket s too much data"); goto out; } - printbuf(buffer, nbytes, color?2:0, timestamp, format, - &tv, &last_tv, dst, s, if_name, head); + if(nbytes > 0) + printbuf(buffer, nbytes, color?2:0, timestamp, format, + &tv, &last_tv, dst, s, if_name, head); } if (FD_ISSET(t, &rdfs)) { @@ -386,14 +395,17 @@ int main(int argc, char **argv) if (nbytes < 0) { perror("read socket t"); r = 1; - goto out; + if(!noquit) + goto out; } if (nbytes > 4095) { r = 1; + perror("read socket t too much data"); goto out; } - printbuf(buffer, nbytes, color?1:0, timestamp, format, - &tv, &last_tv, src, t, if_name, head); + if(nbytes > 0) + printbuf(buffer, nbytes, color?1:0, timestamp, format, + &tv, &last_tv, src, t, if_name, head); } }