fix: check icmp_send_echo return and fix tracker ordering

This commit is contained in:
lohhiiccc 2026-03-23 23:03:49 +01:00
parent 2ab904f106
commit de8d7e749b

View file

@ -1,5 +1,11 @@
#include <errno.h>
#include <stddef.h> #include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "version_gen.h"
#include "icmp.h"
#include "internal/ping/output.h" #include "internal/ping/output.h"
#include "internal/ping/scheduler.h" #include "internal/ping/scheduler.h"
#include "ping/ft_ping_const.h" #include "ping/ft_ping_const.h"
@ -14,28 +20,39 @@ void
do_send(struct ping_state *state, size_t payload_len) do_send(struct ping_state *state, size_t payload_len)
{ {
state->send_flag = 0; state->send_flag = 0;
ping_send_one(state, payload_len); if (0 != ping_send_one(state, payload_len))
dprintf(STDERR_FILENO, "%s: %s\n",
g_prog_name.name, icmp_strerror(state->handle));
if (HAS_FLAG(state->config->flags, FLAG_FLOOD)) if (HAS_FLAG(state->config->flags, FLAG_FLOOD))
ping_output_flood_dot(); ping_output_flood_dot();
ping_scheduler_arm(state->config); if (0 != ping_scheduler_arm(state->config))
{
dprintf(STDERR_FILENO, "%s: setitimer: %s\n",
g_prog_name.name, strerror(errno));
state->stop_flag = 1;
}
} }
static int static int
ping_send_one(struct ping_state *state, size_t payload_len) ping_send_one(struct ping_state *state, size_t payload_len)
{ {
struct timespec ts; struct timespec ts;
uint8_t payload[MAX_PACKET_SIZE]; uint8_t payload[MAX_PACKET_SIZE];
uint16_t seq;
fill_payload(payload, payload_len); fill_payload(payload, payload_len);
icmp_get_time(&ts); if (0 != icmp_get_time(&ts))
ping_tracker_record_send(state->tracker, state->seq, &ts); return -1;
return icmp_send_echo(state->handle, seq = state->seq++;
if (0 != icmp_send_echo(state->handle,
state->dest, state->dest,
state->id, state->id,
state->seq++, seq,
state->config->ttl, state->config->ttl,
payload, payload_len); payload, payload_len))
return -1;
ping_tracker_record_send(state->tracker, seq, &ts);
return 0;
} }
static inline void static inline void