net-tools/src/output/summary.c
2026-03-12 16:12:18 +01:00

56 lines
1.4 KiB
C

#include <stdio.h>
#include <arpa/inet.h>
#include "internal/output.h"
#include "internal/stats.h"
#include "internal/tracker.h"
/* Forward declarations */
static void print_loss_line(size_t sent, size_t ok_recv, size_t errors);
static void print_rtt_line(const t_ping_stats *stats);
/* -------------------- */
void
ping_output_summary(const t_ping_state *state, struct in_addr dest)
{
char dest_str[INET_ADDRSTRLEN];
size_t sent;
size_t errors;
size_t ok_recv;
inet_ntop(AF_INET, &dest, dest_str, sizeof(dest_str));
sent = state->tracker->nb_sent;
errors = state->nb_errors;
ok_recv = state->tracker->nb_recv - errors;
printf("--- %s ping statistics ---\n", dest_str);
print_loss_line(sent, ok_recv, errors);
if (0 < ok_recv)
print_rtt_line(state->stats);
}
static void
print_loss_line(size_t sent, size_t ok_recv, size_t errors)
{
int loss_pct;
loss_pct = (0 < sent) ? (int)((sent - ok_recv) * 100 / sent) : 0;
if (0 < errors)
printf("%zu packets transmitted, %zu received, +%zu errors,"
" %d%% packet loss\n", sent, ok_recv, errors, loss_pct);
else
printf("%zu packets transmitted, %zu received, %d%% packet loss\n",
sent, ok_recv, loss_pct);
}
static void
print_rtt_line(const t_ping_stats *stats)
{
double min_ms;
double max_ms;
double avg_ms;
double mdev_ms;
ping_stats_get(stats, &min_ms, &max_ms, &avg_ms, &mdev_ms);
printf("round-trip min/avg/max/mdev = %.3f/%.3f/%.3f/%.3f ms\n",
min_ms, avg_ms, max_ms, mdev_ms);
}