5959#include <linux/can.h>
6060#include <linux/can/isotp.h>
6161#include <linux/sockios.h>
62+ #include <errno.h>
6263
6364#define NO_CAN_ID 0xFFFFFFFFU
6465
6566#define FORMAT_HEX 1
6667#define FORMAT_ASCII 2
6768#define FORMAT_DEFAULT (FORMAT_ASCII | FORMAT_HEX)
6869
70+ #define PDU_BUF_SIZE 4096
71+
6972void print_usage (char * prg )
7073{
7174fprintf (stderr , "\nUsage: %s [options] <CAN interface>\n" , prg );
@@ -79,7 +82,7 @@ void print_usage(char *prg)
7982fprintf (stderr , " -f <format> (1 = HEX, 2 = ASCII, 3 = HEX & ASCII - default: %d)\n" , FORMAT_DEFAULT );
8083fprintf (stderr , " -L (set link layer options for CAN FD)\n" );
8184fprintf (stderr , " -h <len> (head: print only first <len> bytes)\n" );
82- fprintf (stderr , " -q (don't quit on read error, allows to receive malformed frames )\n" );
85+ fprintf (stderr , " -i (ignore syscall errors to receive malformed PDUs )\n" );
8386fprintf (stderr , "\nCAN IDs and addresses are given and expected in hexadecimal values.\n" );
8487fprintf (stderr , "\n" );
8588}
@@ -190,16 +193,16 @@ int main(int argc, char **argv)
190193int head = 0 ;
191194int timestamp = 0 ;
192195int format = FORMAT_DEFAULT ;
193- int noquit = 0 ;
196+ int ignore_errors = 0 ;
194197canid_t src = NO_CAN_ID ;
195198canid_t dst = NO_CAN_ID ;
196199extern int optind , opterr , optopt ;
197200static struct timeval tv , last_tv ;
198201
199- unsigned char buffer [4096 ];
202+ unsigned char buffer [PDU_BUF_SIZE ];
200203int nbytes ;
201204
202- while ((opt = getopt (argc , argv , "s:d:x:X:h:ct:f:L?q " )) != -1 ) {
205+ while ((opt = getopt (argc , argv , "s:d:x:X:h:ct:f:L?i " )) != -1 ) {
203206switch (opt ) {
204207case 's' :
205208src = strtoul (optarg , NULL , 16 );
@@ -251,8 +254,8 @@ int main(int argc, char **argv)
251254}
252255break ;
253256
254- case 'q ' :
255- noquit = 1 ;
257+ case 'i ' :
258+ ignore_errors = 1 ;
256259break ;
257260
258261case '?' :
@@ -373,16 +376,16 @@ int main(int argc, char **argv)
373376}
374377
375378if (FD_ISSET (s , & rdfs )) {
376- nbytes = read (s , buffer , 4096 );
379+ nbytes = read (s , buffer , PDU_BUF_SIZE );
377380if (nbytes < 0 ) {
378381perror ("read socket s" );
379382r = 1 ;
380- if (!noquit )
383+ if (!ignore_errors )
381384goto out ;
382385}
383- if (nbytes > 4095 ) {
386+ if (nbytes > ( PDU_BUF_SIZE - 1 ) ) {
384387r = 1 ;
385- perror ( "read socket s too much data" );
388+ fprintf ( stderr , "PDU length %d longer than PDU buffer: %s\n" , nbytes , strerror ( errno ) );
386389goto out ;
387390}
388391if (nbytes > 0 )
@@ -391,16 +394,16 @@ int main(int argc, char **argv)
391394}
392395
393396if (FD_ISSET (t , & rdfs )) {
394- nbytes = read (t , buffer , 4096 );
397+ nbytes = read (t , buffer , PDU_BUF_SIZE );
395398if (nbytes < 0 ) {
396399perror ("read socket t" );
397400r = 1 ;
398- if (!noquit )
401+ if (!ignore_errors )
399402goto out ;
400403}
401- if (nbytes > 4095 ) {
404+ if (nbytes > ( PDU_BUF_SIZE - 1 ) ) {
402405r = 1 ;
403- perror ( "read socket t too much data" );
406+ fprintf ( stderr , "PDU length %d longer than PDU buffer: %s\n" , nbytes , strerror ( errno ) );
404407goto out ;
405408}
406409if (nbytes > 0 )
0 commit comments