candump: Add timeout option if no message has been received
Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>pull/7/head
parent
667356cc36
commit
e5c81aa221
21
candump.c
21
candump.c
|
|
@ -49,6 +49,7 @@
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
@ -121,6 +122,7 @@ void print_usage(char *prg)
|
||||||
fprintf(stderr, " -d (monitor dropped CAN frames)\n");
|
fprintf(stderr, " -d (monitor dropped CAN frames)\n");
|
||||||
fprintf(stderr, " -e (dump CAN error frames in human-readable format)\n");
|
fprintf(stderr, " -e (dump CAN error frames in human-readable format)\n");
|
||||||
fprintf(stderr, " -x (print extra message infos, rx/tx brs esi)\n");
|
fprintf(stderr, " -x (print extra message infos, rx/tx brs esi)\n");
|
||||||
|
fprintf(stderr, " -T <msecs> (terminate after <msecs> without any reception)\n");
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
fprintf(stderr, "Up to %d CAN interfaces with optional filter sets can be specified\n", MAXSOCK);
|
fprintf(stderr, "Up to %d CAN interfaces with optional filter sets can be specified\n", MAXSOCK);
|
||||||
fprintf(stderr, "on the commandline in the form: <ifname>[,filter]*\n");
|
fprintf(stderr, "on the commandline in the form: <ifname>[,filter]*\n");
|
||||||
|
|
@ -227,6 +229,7 @@ int main(int argc, char **argv)
|
||||||
int nbytes, i, maxdlen;
|
int nbytes, i, maxdlen;
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
struct timeval tv, last_tv;
|
struct timeval tv, last_tv;
|
||||||
|
struct timeval timeout, timeout_config = { 0, 0 }, *timeout_current = NULL;
|
||||||
FILE *logfile = NULL;
|
FILE *logfile = NULL;
|
||||||
|
|
||||||
signal(SIGTERM, sigterm);
|
signal(SIGTERM, sigterm);
|
||||||
|
|
@ -236,7 +239,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, "t:ciaSs:b:B:u:ldxLn:r:he?")) != -1) {
|
while ((opt = getopt(argc, argv, "t:ciaSs:b:B:u:ldxLn:r:heT:?")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 't':
|
case 't':
|
||||||
timestamp = optarg[0];
|
timestamp = optarg[0];
|
||||||
|
|
@ -351,6 +354,17 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'T':
|
||||||
|
errno = 0;
|
||||||
|
timeout_config.tv_usec = strtol(optarg, NULL, 0);
|
||||||
|
if (errno != 0) {
|
||||||
|
print_usage(basename(argv[0]));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
timeout_config.tv_sec = timeout_config.tv_usec / 1000;
|
||||||
|
timeout_config.tv_usec = (timeout_config.tv_usec % 1000) * 1000;
|
||||||
|
timeout_current = &timeout;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
print_usage(basename(argv[0]));
|
print_usage(basename(argv[0]));
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
@ -594,7 +608,10 @@ int main(int argc, char **argv)
|
||||||
for (i=0; i<currmax; i++)
|
for (i=0; i<currmax; i++)
|
||||||
FD_SET(s[i], &rdfs);
|
FD_SET(s[i], &rdfs);
|
||||||
|
|
||||||
if ((ret = select(s[currmax-1]+1, &rdfs, NULL, NULL, NULL)) < 0) {
|
if (timeout_current)
|
||||||
|
*timeout_current = timeout_config;
|
||||||
|
|
||||||
|
if ((ret = select(s[currmax-1]+1, &rdfs, NULL, NULL, timeout_current)) <= 0) {
|
||||||
//perror("select");
|
//perror("select");
|
||||||
running = 0;
|
running = 0;
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue