diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/akcom-udpecho.c | 142 |
1 files changed, 82 insertions, 60 deletions
diff --git a/src/akcom-udpecho.c b/src/akcom-udpecho.c index e3966fe..d42c809 100644 --- a/src/akcom-udpecho.c +++ b/src/akcom-udpecho.c | |||
| @@ -154,6 +154,7 @@ static int cnf_silent = 0; | |||
| 154 | static unsigned long cnf_timeout = 5; | 154 | static unsigned long cnf_timeout = 5; |
| 155 | static const char * cnf_port = "30006"; | 155 | static const char * cnf_port = "30006"; |
| 156 | static const char * cnf_host = NULL; | 156 | static const char * cnf_host = NULL; |
| 157 | static int cnf_ai_family = PF_UNSPEC; | ||
| 157 | static unsigned long cnf_interval = 1; | 158 | static unsigned long cnf_interval = 1; |
| 158 | static size_t cnf_packetsize = sizeof(struct udp_echo_plus); | 159 | static size_t cnf_packetsize = sizeof(struct udp_echo_plus); |
| 159 | static int should_stop = 0; | 160 | static int should_stop = 0; |
| @@ -173,6 +174,13 @@ main( | |||
| 173 | char * argv[] ); | 174 | char * argv[] ); |
| 174 | 175 | ||
| 175 | 176 | ||
| 177 | int | ||
| 178 | my_socket( | ||
| 179 | const char * host, | ||
| 180 | const char * port, | ||
| 181 | int family ); | ||
| 182 | |||
| 183 | |||
| 176 | // signal system stop | 184 | // signal system stop |
| 177 | static void | 185 | static void |
| 178 | my_stop( | 186 | my_stop( |
| @@ -224,15 +232,7 @@ main( | |||
| 224 | uint64_t avg; | 232 | uint64_t avg; |
| 225 | uint64_t avg_adj; | 233 | uint64_t avg_adj; |
| 226 | ssize_t size; | 234 | ssize_t size; |
| 227 | unsigned short port; | ||
| 228 | char * ptr; | 235 | char * ptr; |
| 229 | char addrstr[INET6_ADDRSTRLEN]; | ||
| 230 | char logmsg[256]; | ||
| 231 | union my_sa sa; | ||
| 232 | socklen_t socklen; | ||
| 233 | struct addrinfo * res; | ||
| 234 | struct addrinfo * info; | ||
| 235 | struct addrinfo hints; | ||
| 236 | struct timespec start; | 236 | struct timespec start; |
| 237 | struct timespec now; | 237 | struct timespec now; |
| 238 | struct pollfd fds[2]; | 238 | struct pollfd fds[2]; |
| @@ -259,13 +259,6 @@ main( | |||
| 259 | if ((ptr = rindex(argv[0], '/')) != NULL) | 259 | if ((ptr = rindex(argv[0], '/')) != NULL) |
| 260 | prog_name = &ptr[1]; | 260 | prog_name = &ptr[1]; |
| 261 | 261 | ||
| 262 | // initializes variables | ||
| 263 | bzero(&hints, sizeof(struct addrinfo)); | ||
| 264 | hints.ai_flags = AI_ADDRCONFIG | AI_V4MAPPED | AI_ALL; | ||
| 265 | hints.ai_family = PF_UNSPEC; | ||
| 266 | hints.ai_socktype = SOCK_DGRAM; | ||
| 267 | hints.ai_protocol = IPPROTO_UDP; | ||
| 268 | |||
| 269 | // process arguments | 262 | // process arguments |
| 270 | while((c = getopt_long(argc, argv, short_opt, long_opt, &opt_index)) != -1) | 263 | while((c = getopt_long(argc, argv, short_opt, long_opt, &opt_index)) != -1) |
| 271 | { | 264 | { |
| @@ -276,11 +269,11 @@ main( | |||
| 276 | break; | 269 | break; |
| 277 | 270 | ||
| 278 | case '4': | 271 | case '4': |
| 279 | hints.ai_family = PF_INET; | 272 | cnf_ai_family = PF_INET; |
| 280 | break; | 273 | break; |
| 281 | 274 | ||
| 282 | case '6': | 275 | case '6': |
| 283 | hints.ai_family = PF_INET6; | 276 | cnf_ai_family = PF_INET6; |
| 284 | break; | 277 | break; |
| 285 | 278 | ||
| 286 | case 'c': | 279 | case 'c': |
| @@ -386,50 +379,8 @@ main( | |||
| 386 | 379 | ||
| 387 | 380 | ||
| 388 | // resolve host | 381 | // resolve host |
| 389 | bzero(&sa, sizeof(sa)); | 382 | if ((s = my_socket(cnf_host, cnf_port, cnf_ai_family)) == -1) |
| 390 | bzero(addrstr, sizeof(addrstr)); | ||
| 391 | socklen = 0; | ||
| 392 | if ((rc = getaddrinfo(cnf_host, cnf_port, &hints, &res)) != 0) | ||
| 393 | { | ||
| 394 | fprintf(stderr, "%s: getaddrinfo(): %s\n", prog_name, gai_strerror(rc)); | ||
| 395 | free(sndbuff.data); | ||
| 396 | free(rcvbuff.data); | ||
| 397 | return(1); | ||
| 398 | }; | ||
| 399 | for(info = res; (info != NULL); info = info->ai_next) | ||
| 400 | { | 383 | { |
| 401 | if (info->ai_addr->sa_family != AF_INET6) | ||
| 402 | continue; | ||
| 403 | socklen = info->ai_addrlen; | ||
| 404 | memcpy(&sa, info->ai_addr, socklen); | ||
| 405 | inet_ntop(AF_INET6, &sa.sin6.sin6_addr, addrstr, sizeof(addrstr)); | ||
| 406 | port = ntohs(sa.sin6.sin6_port); | ||
| 407 | snprintf(logmsg, sizeof(logmsg), "UDPECHO %s:%hu ([%s]:%hu): %zu bytes\n", cnf_host, port, addrstr, port, cnf_packetsize); | ||
| 408 | } | ||
| 409 | if (sa.sa.sa_family != AF_INET6) | ||
| 410 | { | ||
| 411 | socklen = res->ai_addrlen; | ||
| 412 | memcpy(&sa.sa, res->ai_addr, socklen); | ||
| 413 | inet_ntop(AF_INET, &sa.sin.sin_addr, addrstr, sizeof(addrstr)); | ||
| 414 | port = ntohs(sa.sin.sin_port); | ||
| 415 | snprintf(logmsg, sizeof(logmsg), "UDPECHO %s:%hu (%s:%hu): %zu bytes\n", cnf_host, port, addrstr, port, cnf_packetsize); | ||
| 416 | }; | ||
| 417 | freeaddrinfo(res); | ||
| 418 | if (!(cnf_silent)) | ||
| 419 | printf("%s", logmsg); | ||
| 420 | |||
| 421 | |||
| 422 | // open and connect socket | ||
| 423 | if ((s = socket(sa.sa.sa_family, SOCK_DGRAM, 0)) == -1) | ||
| 424 | { | ||
| 425 | fprintf(stderr, "%s: socket(): %s\n", prog_name, strerror(errno)); | ||
| 426 | free(sndbuff.data); | ||
| 427 | free(rcvbuff.data); | ||
| 428 | return(1); | ||
| 429 | }; | ||
| 430 | if ((rc = connect(s, &sa.sa, socklen)) == -1) | ||
| 431 | { | ||
| 432 | fprintf(stderr, "%s: connect(): %s\n", prog_name, strerror(errno)); | ||
| 433 | free(sndbuff.data); | 384 | free(sndbuff.data); |
| 434 | free(rcvbuff.data); | 385 | free(rcvbuff.data); |
| 435 | return(1); | 386 | return(1); |
| @@ -597,6 +548,77 @@ main( | |||
| 597 | } | 548 | } |
| 598 | 549 | ||
| 599 | 550 | ||
| 551 | int | ||
| 552 | my_socket( | ||
| 553 | const char * host, | ||
| 554 | const char * service, | ||
| 555 | int family ) | ||
| 556 | { | ||
| 557 | int rc; | ||
| 558 | int s; | ||
| 559 | unsigned short port; | ||
| 560 | socklen_t socklen; | ||
| 561 | struct addrinfo * res; | ||
| 562 | struct addrinfo * info; | ||
| 563 | struct addrinfo hints; | ||
| 564 | union my_sa sa; | ||
| 565 | char addrstr[INET6_ADDRSTRLEN]; | ||
| 566 | char logmsg[256]; | ||
| 567 | |||
| 568 | memset(&hints, 0, sizeof(struct addrinfo)); | ||
| 569 | hints.ai_flags = AI_ADDRCONFIG | AI_V4MAPPED | AI_ALL; | ||
| 570 | hints.ai_family = family; | ||
| 571 | hints.ai_socktype = SOCK_DGRAM; | ||
| 572 | hints.ai_protocol = IPPROTO_UDP; | ||
| 573 | |||
| 574 | // resolve host | ||
| 575 | memset(&sa, 0, sizeof(sa)); | ||
| 576 | memset(addrstr, 0, sizeof(addrstr)); | ||
| 577 | socklen = 0; | ||
| 578 | if ((rc = getaddrinfo(host, service, &hints, &res)) != 0) | ||
| 579 | { | ||
| 580 | fprintf(stderr, "%s: getaddrinfo(): %s\n", prog_name, gai_strerror(rc)); | ||
| 581 | return(-1); | ||
| 582 | }; | ||
| 583 | for(info = res; (info != NULL); info = info->ai_next) | ||
| 584 | { | ||
| 585 | if (info->ai_addr->sa_family != AF_INET6) | ||
| 586 | continue; | ||
| 587 | socklen = info->ai_addrlen; | ||
| 588 | memcpy(&sa, info->ai_addr, socklen); | ||
| 589 | inet_ntop(AF_INET6, &sa.sin6.sin6_addr, addrstr, sizeof(addrstr)); | ||
| 590 | port = ntohs(sa.sin6.sin6_port); | ||
| 591 | snprintf(logmsg, sizeof(logmsg), "UDPECHO %s:%hu ([%s]:%hu): %zu bytes\n", cnf_host, port, addrstr, port, cnf_packetsize); | ||
| 592 | } | ||
| 593 | if (sa.sa.sa_family != AF_INET6) | ||
| 594 | { | ||
| 595 | socklen = res->ai_addrlen; | ||
| 596 | memcpy(&sa.sa, res->ai_addr, socklen); | ||
| 597 | inet_ntop(AF_INET, &sa.sin.sin_addr, addrstr, sizeof(addrstr)); | ||
| 598 | port = ntohs(sa.sin.sin_port); | ||
| 599 | snprintf(logmsg, sizeof(logmsg), "UDPECHO %s:%hu (%s:%hu): %zu bytes\n", cnf_host, port, addrstr, port, cnf_packetsize); | ||
| 600 | }; | ||
| 601 | freeaddrinfo(res); | ||
| 602 | if (!(cnf_silent)) | ||
| 603 | printf("%s", logmsg); | ||
| 604 | |||
| 605 | |||
| 606 | // open and connect socket | ||
| 607 | if ((s = socket(sa.sa.sa_family, SOCK_DGRAM, 0)) == -1) | ||
| 608 | { | ||
| 609 | fprintf(stderr, "%s: socket(): %s\n", prog_name, strerror(errno)); | ||
| 610 | return(-1); | ||
| 611 | }; | ||
| 612 | if ((rc = connect(s, &sa.sa, socklen)) == -1) | ||
| 613 | { | ||
| 614 | fprintf(stderr, "%s: connect(): %s\n", prog_name, strerror(errno)); | ||
| 615 | return(-1); | ||
| 616 | }; | ||
| 617 | |||
| 618 | return(s); | ||
| 619 | } | ||
| 620 | |||
| 621 | |||
| 600 | // signal system stop | 622 | // signal system stop |
| 601 | void | 623 | void |
| 602 | my_stop( | 624 | my_stop( |
