Merge pull request #101 from olerem/testj1938

add bind related options to testj1939
pull/106/head
Marc Kleine-Budde 2018-09-21 11:44:49 +02:00 committed by GitHub
commit 3e4d589fec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 33 additions and 7 deletions

View File

@ -38,6 +38,8 @@ static const char help_msg[] =
" This atually receives packets\n" " This atually receives packets\n"
" -c Issue connect()\n" " -c Issue connect()\n"
" -p=PRIO Set priority to PRIO\n" " -p=PRIO Set priority to PRIO\n"
" -b Do normal bind with SA+1 and rebind with actual SA\n"
" -o Omit bind\n"
" -n Emit 64bit NAMEs in output\n" " -n Emit 64bit NAMEs in output\n"
" -w[TIME] Return after TIME (default 1) seconds\n" " -w[TIME] Return after TIME (default 1) seconds\n"
"\n" "\n"
@ -46,7 +48,7 @@ static const char help_msg[] =
"\n" "\n"
; ;
static const char optstring[] = "?vs::rep:cnw::"; static const char optstring[] = "?vbos::rep:cnw::";
static void parse_canaddr(char *spec, struct sockaddr_can *paddr) static void parse_canaddr(char *spec, struct sockaddr_can *paddr)
{ {
@ -109,7 +111,8 @@ 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, todo_wait = 0; int todo_connect = 0, todo_names = 0, todo_wait = 0, todo_rebind = 0;
int no_bind = 0;
/* argument parsing */ /* argument parsing */
while ((opt = getopt(argc, argv, optstring)) != -1) while ((opt = getopt(argc, argv, optstring)) != -1)
@ -135,6 +138,12 @@ int main(int argc, char *argv[])
case 'n': case 'n':
todo_names = 1; todo_names = 1;
break; break;
case 'b':
todo_rebind = 1;
break;
case 'o':
no_bind = 1;
break;
case 'w': case 'w':
schedule_oneshot_itimer(strtod(optarg ?: "1", NULL)); schedule_oneshot_itimer(strtod(optarg ?: "1", NULL));
signal(SIGALRM, onsigalrm); signal(SIGALRM, onsigalrm);
@ -152,6 +161,9 @@ int main(int argc, char *argv[])
++optind; ++optind;
} }
if (todo_rebind)
sockname.can_addr.j1939.addr++;
if (argv[optind]) { if (argv[optind]) {
if (strcmp("-", argv[optind])) { if (strcmp("-", argv[optind])) {
parse_canaddr(argv[optind], &peername); parse_canaddr(argv[optind], &peername);
@ -176,12 +188,26 @@ int main(int argc, char *argv[])
error(1, errno, "set priority %i", todo_prio); error(1, errno, "set priority %i", todo_prio);
} }
if (!no_bind) {
if (verbose) if (verbose)
fprintf(stderr, "- bind(, %s, %zi);\n", libj1939_addr2str(&sockname), sizeof(sockname)); fprintf(stderr, "- bind(, %s, %zi);\n", libj1939_addr2str(&sockname), sizeof(sockname));
ret = bind(sock, (void *)&sockname, sizeof(sockname)); ret = bind(sock, (void *)&sockname, sizeof(sockname));
if (ret < 0) if (ret < 0)
error(1, errno, "bind()"); error(1, errno, "bind()");
if (todo_rebind) {
/* rebind with actual SA */
sockname.can_addr.j1939.addr--;
if (verbose)
fprintf(stderr, "- bind(, %s, %zi);\n", libj1939_addr2str(&sockname), sizeof(sockname));
ret = bind(sock, (void *)&sockname, sizeof(sockname));
if (ret < 0)
error(1, errno, "re-bind()");
}
}
if (todo_connect) { if (todo_connect) {
if (!valid_peername) if (!valid_peername)
error(1, 0, "no peername supplied"); error(1, 0, "no peername supplied");