fix: propagate setitimer and sigaction failures

This commit is contained in:
lohhiiccc 2026-03-23 23:04:10 +01:00
parent de8d7e749b
commit d27ed4a839
4 changed files with 13 additions and 13 deletions

View file

@ -5,8 +5,8 @@
#include "internal/ping/ping_state.h" #include "internal/ping/ping_state.h"
void ping_scheduler_init(struct ping_state *state); int ping_scheduler_init(struct ping_state *state);
void ping_scheduler_arm(const struct ping_config *config); int ping_scheduler_arm(const struct ping_config *config);
void ping_scheduler_select_tv(const struct ping_config *config, void ping_scheduler_select_tv(const struct ping_config *config,
struct timeval *tv); struct timeval *tv);

View file

@ -61,7 +61,8 @@ ping_one(const struct ping_config *config, struct destinations *dest,
ping_init_state(&state, &stats, &tracker, config, dest->ip, handle); ping_init_state(&state, &stats, &tracker, config, dest->ip, handle);
payload_len = config->packet_size; payload_len = config->packet_size;
ping_scheduler_init(&state); if (0 != ping_scheduler_init(&state))
return 1;
ping_output_start(config, dest, payload_len); ping_output_start(config, dest, payload_len);
do_send(&state, payload_len); do_send(&state, payload_len);
ping_loop(&state, payload_len); ping_loop(&state, payload_len);

View file

@ -1,19 +1,19 @@
#include "ping/ft_ping_flags.h" #include "ping/ft_ping_flags.h"
#include "internal/ping/scheduler.h" #include "internal/ping/scheduler.h"
void int
ping_scheduler_arm(const struct ping_config *config) ping_scheduler_arm(const struct ping_config *config)
{ {
struct itimerval itv; struct itimerval itv;
double interval; double interval;
if (HAS_FLAG(config->flags, FLAG_FLOOD)) if (HAS_FLAG(config->flags, FLAG_FLOOD))
return; return 0;
interval = (double)config->interval; interval = (double)config->interval;
itv.it_value.tv_sec = (time_t)interval; itv.it_value.tv_sec = (time_t)interval;
itv.it_value.tv_usec = (suseconds_t)((interval - (double)(time_t)interval) itv.it_value.tv_usec = (suseconds_t)((interval - (double)(time_t)interval)
* 1e6); * 1e6);
itv.it_interval.tv_sec = 0; itv.it_interval.tv_sec = 0;
itv.it_interval.tv_usec = 0; itv.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL, &itv, NULL); return setitimer(ITIMER_REAL, &itv, NULL);
} }

View file

@ -4,20 +4,20 @@
/* Forward declarations */ /* Forward declarations */
static void inline sigint_handler(int sig); static void inline sigint_handler(int sig);
static void inline sigalrm_handler(int sig); static void inline sigalrm_handler(int sig);
static void install_signal(int signum, void (*handler)(int)); static int install_signal(int signum, void (*handler)(int));
static struct ping_state *g_state = NULL; static struct ping_state *g_state = NULL;
/* -------------------- */ /* -------------------- */
void int
ping_scheduler_init(struct ping_state *state) ping_scheduler_init(struct ping_state *state)
{ {
g_state = state; g_state = state;
install_signal(SIGALRM, sigalrm_handler); return (install_signal(SIGALRM, sigalrm_handler) != 0 ||
install_signal(SIGINT, sigint_handler); install_signal(SIGINT, sigint_handler) != 0) ? -1 : 0;
} }
static void static int
install_signal(int signum, void (*handler)(int)) install_signal(int signum, void (*handler)(int))
{ {
struct sigaction sa; struct sigaction sa;
@ -25,7 +25,7 @@ install_signal(int signum, void (*handler)(int))
sa.sa_handler = handler; sa.sa_handler = handler;
sigemptyset(&sa.sa_mask); sigemptyset(&sa.sa_mask);
sa.sa_flags = 0; sa.sa_flags = 0;
sigaction(signum, &sa, NULL); return sigaction(signum, &sa, NULL);
} }
static void inline static void inline
@ -41,4 +41,3 @@ sigint_handler(__unused int sig)
if (NULL != g_state) if (NULL != g_state)
g_state->stop_flag = 1; g_state->stop_flag = 1;
} }