fix: propagate setitimer and sigaction failures
This commit is contained in:
parent
de8d7e749b
commit
d27ed4a839
4 changed files with 13 additions and 13 deletions
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue