testj1939: add -w option to keep program open

pull/66/head
Kurt Van Dijck 2016-02-23 09:40:17 +01:00
parent 215ca91d26
commit 1ffa9a16a4
1 changed files with 27 additions and 2 deletions

View File

@ -39,13 +39,14 @@ static const char help_msg[] =
" -c Issue connect()\n" " -c Issue connect()\n"
" -p=PRIO Set priority to PRIO\n" " -p=PRIO Set priority to PRIO\n"
" -n Emit 64bit NAMEs in output\n" " -n Emit 64bit NAMEs in output\n"
" -w[TIME] Return after TIME (default 1) seconds\n"
"\n" "\n"
"Example:\n" "Example:\n"
"testj1939 can1 20\n" "testj1939 can1 20\n"
"\n" "\n"
; ;
static const char optstring[] = "?vs::rep:cn"; static const char optstring[] = "?vs::rep:cnw::";
static void parse_canaddr(char *spec, struct sockaddr_can *paddr) static void parse_canaddr(char *spec, struct sockaddr_can *paddr)
{ {
@ -90,6 +91,22 @@ static const char *canaddr2str(const struct sockaddr_can *paddr)
return buf; return buf;
} }
static void onsigalrm(int sig)
{
error(0, 0, "exit as requested");
exit(0);
}
static void schedule_oneshot_itimer(double delay)
{
struct itimerval it = {};
it.it_value.tv_sec = delay;
it.it_value.tv_usec = (long)(delay * 1e6) % 1000000;
if (setitimer(ITIMER_REAL, &it, NULL) < 0)
error(1, errno, "schedule itimer %.3lfs", delay);
}
/* main */ /* main */
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
@ -113,7 +130,7 @@ int main(int argc, char *argv[])
uint8_t dat[128]; uint8_t dat[128];
int valid_peername = 0; int valid_peername = 0;
int todo_send = 0, todo_recv = 0, todo_echo = 0, todo_prio = -1; int todo_send = 0, todo_recv = 0, todo_echo = 0, todo_prio = -1;
int todo_connect = 0, todo_names = 0; int todo_connect = 0, todo_names = 0, todo_wait = 0;
/* argument parsing */ /* argument parsing */
while ((opt = getopt(argc, argv, optstring)) != -1) while ((opt = getopt(argc, argv, optstring)) != -1)
@ -139,6 +156,11 @@ int main(int argc, char *argv[])
case 'n': case 'n':
todo_names = 1; todo_names = 1;
break; break;
case 'w':
schedule_oneshot_itimer(strtod(optarg ?: "1", NULL));
signal(SIGALRM, onsigalrm);
todo_wait = 1;
break;
default: default:
fputs(help_msg, stderr); fputs(help_msg, stderr);
exit(1); exit(1);
@ -260,6 +282,9 @@ int main(int argc, char *argv[])
printf("\n"); printf("\n");
} }
} }
if (todo_wait)
for (;;)
sleep(1);
return 0; return 0;
} }