diff --git a/Userland/Utilities/ping.cpp b/Userland/Utilities/ping.cpp index cc954bbaa5..6f841e9b70 100644 --- a/Userland/Utilities/ping.cpp +++ b/Userland/Utilities/ping.cpp @@ -22,11 +22,32 @@ static int total_pings; static int successful_pings; +static int count; static uint32_t total_ms; static int min_ms; static int max_ms; static const char* host; +static void closing_statistics() +{ + int packet_loss = 100; + + outln(); + outln("--- {} ping statistics ---", host); + + if (total_pings) + packet_loss -= 100.0f * successful_pings / total_pings; + outln("{} packets transmitted, {} received, {}% packet loss", + total_pings, successful_pings, packet_loss); + + int average_ms = 0; + if (successful_pings) + average_ms = total_ms / successful_pings; + outln("rtt min/avg/max = {}/{}/{} ms", min_ms, average_ms, max_ms); + + exit(0); +}; + int main(int argc, char** argv) { if (pledge("stdio id inet unix sigaction", nullptr) < 0) { @@ -36,6 +57,7 @@ int main(int argc, char** argv) Core::ArgsParser args_parser; args_parser.add_positional_argument(host, "Host to ping", "host"); + args_parser.add_option(count, "Stop after sending specified number of ECHO_REQUEST packets.", "count", 'c', "count"); args_parser.parse(argc, argv); int fd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); @@ -99,22 +121,7 @@ int main(int argc, char** argv) uint16_t seq = 1; sighandler_t ret = signal(SIGINT, [](int) { - int packet_loss = 100; - - outln(); - outln("--- {} ping statistics ---", host); - - if (total_pings) - packet_loss -= 100.0f * successful_pings / total_pings; - outln("{} packets transmitted, {} received, {}% packet loss", - total_pings, successful_pings, packet_loss); - - int average_ms = 0; - if (successful_pings) - average_ms = total_ms / successful_pings; - outln("rtt min/avg/max = {}/{}/{} ms", min_ms, average_ms, max_ms); - - exit(0); + closing_statistics(); }); if (ret == SIG_ERR) { @@ -146,7 +153,10 @@ int main(int argc, char** argv) return 1; } - total_pings++; + if (count && total_pings == count) + closing_statistics(); + else + total_pings++; for (;;) { PongPacket pong_packet;