From 6a9266898eef59a458680a59b427755b58ca3c55 Mon Sep 17 00:00:00 2001 From: "Steffen (Daode) Nurpmeso" Date: Fri, 12 Aug 2016 14:44:38 +0200 Subject: [PATCH] Add n_signal(), our future (v15) sigaction(2) call-in --- nail.h | 7 ++++--- nailfuns.h | 5 ++++- signal.c | 13 +++++++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/nail.h b/nail.h index 8e8ac32e..d46f4250 100644 --- a/nail.h +++ b/nail.h @@ -522,7 +522,7 @@ do {\ #define V_(S) S /* - * Types + * Types TODO v15: n_XX_t */ #ifdef UINT8_MAX @@ -718,7 +718,7 @@ typedef char wc_t; /* Yep: really 8-bit char */ enum {FAL0, TRU1, TRUM1 = -1}; typedef si8_t bool_t; -/* Add shorter aliases for "normal" integers */ +/* Add shorter aliases for "normal" integers TODO v15 -> n_XX_t */ typedef unsigned long ul_i; typedef unsigned int ui_i; typedef unsigned short us_i; @@ -729,7 +729,8 @@ typedef signed int si_i; typedef signed short ss_i; typedef signed char sc_i; -typedef void ( *sighandler_type)(int); +typedef void ( *sighandler_type)(int); /* TODO v15 obsolete */ +typedef void ( *n_sighdl_t)(int); enum authtype { AUTHTYPE_NONE = 1<<0, diff --git a/nailfuns.h b/nailfuns.h index 36f7f358..8d95dc0d 100644 --- a/nailfuns.h +++ b/nailfuns.h @@ -1717,9 +1717,12 @@ FL char * n_shell_quote_cp(char const *cp, bool_t rndtrip); FL void n_raise(int signo); -/* Provide BSD-like signal() on all (POSIX) systems */ +/* Provide BSD-like signal() on all systems TODO v15 -> SysV -> n_signal() */ FL sighandler_type safe_signal(int signum, sighandler_type handler); +/* Provide reproducable non-restartable signal handler installation */ +FL n_sighdl_t n_signal(int signo, n_sighdl_t hdl); + /* Hold *all* signals but SIGCHLD, and release that total block again */ FL void hold_all_sigs(void); FL void rele_all_sigs(void); diff --git a/signal.c b/signal.c index b36ab712..52fa02ac 100644 --- a/signal.c +++ b/signal.c @@ -154,6 +154,19 @@ safe_signal(int signum, sighandler_type handler) return rv; } +FL n_sighdl_t +n_signal(int signo, n_sighdl_t hdl){ + struct sigaction nact, oact; + NYD2_ENTER; + + nact.sa_handler = hdl; + sigemptyset(&nact.sa_mask); + nact.sa_flags = 0; + hdl = (sigaction(signo, &nact, &oact) != 0) ? SIG_ERR : oact.sa_handler; + NYD2_LEAVE; + return hdl; +} + FL void hold_all_sigs(void) { -- 2.11.4.GIT