Added new commandline option '-B' which acts like the bridging option '-b' but

disables the local loopback functionality (for ECU analysis and MITM-attacks :)
Fixed missing fflush().
pull/7/head
Oliver Hartkopp 2007-05-30 07:20:18 +00:00
parent 33e6337cde
commit 5723c5ce86
1 changed files with 13 additions and 3 deletions

View File

@ -107,6 +107,7 @@ void print_usage(char *prg)
fprintf(stderr, " -a (enable additional ASCII output)\n"); fprintf(stderr, " -a (enable additional ASCII output)\n");
fprintf(stderr, " -s <level> (silent mode - 1: animation 2: nothing)\n"); fprintf(stderr, " -s <level> (silent mode - 1: animation 2: nothing)\n");
fprintf(stderr, " -b <can> (bridge mode - send received frames to <can>)\n"); fprintf(stderr, " -b <can> (bridge mode - send received frames to <can>)\n");
fprintf(stderr, " -B <can> (bridge mode - like '-b' with disabled loopback)\n");
fprintf(stderr, " -l (log CAN-frames into file)\n"); fprintf(stderr, " -l (log CAN-frames into file)\n");
fprintf(stderr, " -L (use log file format on stdout)\n"); fprintf(stderr, " -L (use log file format on stdout)\n");
fprintf(stderr, "\n"); fprintf(stderr, "\n");
@ -192,7 +193,7 @@ int main(int argc, char **argv)
last_tv.tv_sec = 0; last_tv.tv_sec = 0;
last_tv.tv_usec = 0; last_tv.tv_usec = 0;
while ((opt = getopt(argc, argv, "m:v:i:e:t:cas:b:lL")) != -1) { while ((opt = getopt(argc, argv, "m:v:i:e:t:cas:b:B:lL")) != -1) {
switch (opt) { switch (opt) {
case 'm': case 'm':
i = sscanf(optarg, "%x,%x,%x,%x,%x,%x", i = sscanf(optarg, "%x,%x,%x,%x,%x,%x",
@ -249,6 +250,7 @@ int main(int argc, char **argv)
break; break;
case 'b': case 'b':
case 'B':
if (strlen(optarg) >= IFNAMSIZ) { if (strlen(optarg) >= IFNAMSIZ) {
printf("Name of CAN device '%s' is too long!\n\n", optarg); printf("Name of CAN device '%s' is too long!\n\n", optarg);
return 1; return 1;
@ -269,6 +271,12 @@ int main(int argc, char **argv)
return 1; return 1;
} }
if (opt == 'B') {
int loopback = 0;
setsockopt(bridge, SOL_CAN_RAW, CAN_RAW_LOOPBACK, &loopback, sizeof(loopback));
}
if (bind(bridge, (struct sockaddr *)&addr, sizeof(addr)) < 0) { if (bind(bridge, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bridge bind"); perror("bridge bind");
return 1; return 1;
@ -463,7 +471,7 @@ int main(int argc, char **argv)
printf("(%ld.%06ld) ", tv.tv_sec, tv.tv_usec); printf("(%ld.%06ld) ", tv.tv_sec, tv.tv_usec);
printf("%*s ", max_devname_len, devname[idx]); printf("%*s ", max_devname_len, devname[idx]);
fprint_canframe(stdout, &frame, "\n", 0); fprint_canframe(stdout, &frame, "\n", 0);
continue; /* no other output to stdout */ goto out_fflush; /* no other output to stdout */
} }
if (silent){ if (silent){
@ -471,7 +479,7 @@ int main(int argc, char **argv)
printf("%c\b", anichar[silentani%=MAXANI]); printf("%c\b", anichar[silentani%=MAXANI]);
silentani++; silentani++;
} }
continue; /* no other output to stdout */ goto out_fflush; /* no other output to stdout */
} }
printf(" %s", (color>2)?col_on[idx]:""); printf(" %s", (color>2)?col_on[idx]:"");
@ -526,6 +534,8 @@ int main(int argc, char **argv)
printf("%s", (color>1)?col_off:""); printf("%s", (color>1)?col_off:"");
printf("\n"); printf("\n");
} }
out_fflush:
fflush(stdout); fflush(stdout);
} }
} }