diff --git a/src/ping/core/send.c b/src/ping/core/send.c index 4d75fd7..ba764e3 100644 --- a/src/ping/core/send.c +++ b/src/ping/core/send.c @@ -1,5 +1,11 @@ +#include #include +#include +#include +#include +#include "version_gen.h" +#include "icmp.h" #include "internal/ping/output.h" #include "internal/ping/scheduler.h" #include "ping/ft_ping_const.h" @@ -14,28 +20,39 @@ void do_send(struct ping_state *state, size_t payload_len) { 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)) 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 ping_send_one(struct ping_state *state, size_t payload_len) { struct timespec ts; uint8_t payload[MAX_PACKET_SIZE]; - + uint16_t seq; fill_payload(payload, payload_len); - icmp_get_time(&ts); - ping_tracker_record_send(state->tracker, state->seq, &ts); - return icmp_send_echo(state->handle, + if (0 != icmp_get_time(&ts)) + return -1; + seq = state->seq++; + if (0 != icmp_send_echo(state->handle, state->dest, state->id, - state->seq++, + seq, state->config->ttl, - payload, payload_len); + payload, payload_len)) + return -1; + ping_tracker_record_send(state->tracker, seq, &ts); + return 0; } static inline void