aboutsummaryrefslogtreecommitdiff
path: root/networking/ping.c
diff options
context:
space:
mode:
Diffstat (limited to 'networking/ping.c')
-rw-r--r--networking/ping.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/networking/ping.c b/networking/ping.c
index 71b2a4be8..0d89cb6f6 100644
--- a/networking/ping.c
+++ b/networking/ping.c
@@ -173,13 +173,14 @@ static void ping6(len_and_sockaddr *lsa)
173} 173}
174#endif 174#endif
175 175
176int ping_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 176#if !ENABLE_PING6
177int ping_main(int argc UNUSED_PARAM, char **argv) 177# define common_ping_main(af, argv) common_ping_main(argv)
178#endif
179static int common_ping_main(sa_family_t af, char **argv)
178{ 180{
179 len_and_sockaddr *lsa; 181 len_and_sockaddr *lsa;
180#if ENABLE_PING6
181 sa_family_t af = AF_UNSPEC;
182 182
183#if ENABLE_PING6
183 while ((++argv)[0] && argv[0][0] == '-') { 184 while ((++argv)[0] && argv[0][0] == '-') {
184 if (argv[0][1] == '4') { 185 if (argv[0][1] == '4') {
185 af = AF_INET; 186 af = AF_INET;
@@ -689,7 +690,8 @@ static void ping6(len_and_sockaddr *lsa)
689 /* don't check len - we trust the kernel: */ 690 /* don't check len - we trust the kernel: */
690 /* && mp->cmsg_len >= CMSG_LEN(sizeof(int)) */ 691 /* && mp->cmsg_len >= CMSG_LEN(sizeof(int)) */
691 ) { 692 ) {
692 hoplimit = *(int*)CMSG_DATA(mp); 693 /*hoplimit = *(int*)CMSG_DATA(mp); - unaligned access */
694 move_from_unaligned_int(hoplimit, CMSG_DATA(mp));
693 } 695 }
694 } 696 }
695 unpack6(packet, c, /*&from,*/ hoplimit); 697 unpack6(packet, c, /*&from,*/ hoplimit);
@@ -716,18 +718,16 @@ static void ping(len_and_sockaddr *lsa)
716 ping4(lsa); 718 ping4(lsa);
717} 719}
718 720
719int ping_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 721static int common_ping_main(int opt, char **argv)
720int ping_main(int argc UNUSED_PARAM, char **argv)
721{ 722{
722 len_and_sockaddr *lsa; 723 len_and_sockaddr *lsa;
723 char *str_s; 724 char *str_s;
724 int opt;
725 725
726 INIT_G(); 726 INIT_G();
727 727
728 /* exactly one argument needed; -v and -q don't mix; -c NUM, -w NUM, -W NUM */ 728 /* exactly one argument needed; -v and -q don't mix; -c NUM, -w NUM, -W NUM */
729 opt_complementary = "=1:q--v:v--q:c+:w+:W+"; 729 opt_complementary = "=1:q--v:v--q:c+:w+:W+";
730 opt = getopt32(argv, OPT_STRING, &pingcount, &str_s, &deadline, &timeout, &str_I); 730 opt |= getopt32(argv, OPT_STRING, &pingcount, &str_s, &deadline, &timeout, &str_I);
731 if (opt & OPT_s) 731 if (opt & OPT_s)
732 datalen = xatou16(str_s); // -s 732 datalen = xatou16(str_s); // -s
733 if (opt & OPT_I) { // -I 733 if (opt & OPT_I) { // -I
@@ -765,13 +765,25 @@ int ping_main(int argc UNUSED_PARAM, char **argv)
765#endif /* FEATURE_FANCY_PING */ 765#endif /* FEATURE_FANCY_PING */
766 766
767 767
768int ping_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
769int ping_main(int argc UNUSED_PARAM, char **argv)
770{
771#if !ENABLE_FEATURE_FANCY_PING
772 return common_ping_main(AF_UNSPEC, argv);
773#else
774 return common_ping_main(0, argv);
775#endif
776}
777
768#if ENABLE_PING6 778#if ENABLE_PING6
769int ping6_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 779int ping6_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
770int ping6_main(int argc UNUSED_PARAM, char **argv) 780int ping6_main(int argc UNUSED_PARAM, char **argv)
771{ 781{
772 argv[0] = (char*)"-6"; 782# if !ENABLE_FEATURE_FANCY_PING
773 return ping_main(0 /* argc+1 - but it's unused anyway */, 783 return common_ping_main(AF_INET6, argv);
774 argv - 1); 784# else
785 return common_ping_main(OPT_IPV6, argv);
786# endif
775} 787}
776#endif 788#endif
777 789