feat: implement try again on EAGAIN

This commit is contained in:
lohhiiccc 2026-04-22 13:54:19 +02:00 committed by lohhiiccc
parent 97417ade90
commit 50b3a1a86b
3 changed files with 26 additions and 14 deletions

2
libcli

@ -1 +1 @@
Subproject commit efbae5b7d612ddbb066eb0ba9b1569cd8bf26330 Subproject commit ae7fdf2f94a7c3c759d449ee1c4d3439473c6e42

@ -1 +1 @@
Subproject commit f2edfed48bdb8c709f01252215ccc79491b62314 Subproject commit a9bdaf33f22b60b8643871b2522721cd041ac885

View file

@ -13,16 +13,29 @@
/* Forward declarations */ /* Forward declarations */
static inline void fill_payload(uint8_t *payload, size_t payload_len); static inline void fill_payload(uint8_t *payload, size_t payload_len);
static int ping_send_one(struct ping_state *state, size_t payload_len); static int ping_send_one(struct ping_state *state, uint16_t seq,
const uint8_t *payload, size_t payload_len, struct timespec *ts);
/* -------------------- */ /* -------------------- */
void void
do_send(struct ping_state *state, size_t payload_len) do_send(struct ping_state *state, size_t payload_len)
{ {
uint8_t payload[MAX_PACKET_SIZE];
struct timespec ts;
int ret;
state->send_flag = 0; state->send_flag = 0;
if (0 != ping_send_one(state, payload_len)) fill_payload(payload, payload_len);
ret = ping_send_one(state, state->seq, payload, payload_len, &ts);
if (-1 == ret)
dprintf(STDERR_FILENO, "%s: %s\n", dprintf(STDERR_FILENO, "%s: %s\n",
g_prog_name, icmp_strerror(state->handle)); g_prog_name, icmp_strerror(state->handle));
else if (0 == ret)
{
ping_tracker_record_send(state->tracker, state->seq, &ts);
state->seq++;
}
if (HAS_FLAG(state->config->flags, FLAG_FLOOD)) if (HAS_FLAG(state->config->flags, FLAG_FLOOD))
ping_output_flood_dot(); ping_output_flood_dot();
if (0 != ping_scheduler_arm(state->config)) if (0 != ping_scheduler_arm(state->config))
@ -34,24 +47,23 @@ do_send(struct ping_state *state, size_t payload_len)
} }
static int static int
ping_send_one(struct ping_state *state, size_t payload_len) ping_send_one(struct ping_state *state, uint16_t seq,
const uint8_t *payload, size_t payload_len, struct timespec *ts)
{ {
struct timespec ts; int ret;
uint8_t payload[MAX_PACKET_SIZE];
uint16_t seq;
fill_payload(payload, payload_len); if (0 != icmp_get_time(ts))
if (0 != icmp_get_time(&ts))
return -1; return -1;
seq = state->seq++; ret = icmp_send_echo(state->handle,
if (0 != icmp_send_echo(state->handle,
state->dest, state->dest,
state->id, state->id,
seq, seq,
state->config->ttl, state->config->ttl,
payload, payload_len)) payload, payload_len);
if (1 == ret && icmp_should_retry(state->handle))
return 1;
if (0 != ret)
return -1; return -1;
ping_tracker_record_send(state->tracker, seq, &ts);
return 0; return 0;
} }