[pacman-dev] [PATCH] Use sigaction instead of signal.
Dan McGee
dpmcgee at gmail.com
Sun Mar 9 13:00:59 EDT 2008
On Sun, Mar 9, 2008 at 7:15 AM, Chantry Xavier <shiningxc at gmail.com> wrote:
> >From signal man page :
> "The behavior of signal() varies across Unix versions, and has also varied
> historically across different versions of Linux. Avoid its use: use
> sigaction(2) instead. See Portability below."
>
> The code was taken from there :
> http://www.gnu.org/software/libtool/manual/libc/Sigaction-Function-Example.html
>
> Signed-off-by: Chantry Xavier <shiningxc at gmail.com>
> ---
> src/pacman/pacman.c | 25 ++++++++++++++++++++-----
> 1 files changed, 20 insertions(+), 5 deletions(-)
>
> diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
> index f46b71c..9c56eae 100644
> --- a/src/pacman/pacman.c
> +++ b/src/pacman/pacman.c
> @@ -212,7 +212,7 @@ static void cleanup(int ret) {
> * in a consistant state.
> * @param signum the thrown signal
> */
> -static void handler(int signum)
> +static void termination_handler(int signum)
Any real reason to rename the function?
> {
> if(signum==SIGSEGV)
> {
> @@ -752,6 +752,7 @@ static int parseconfig(const char *file)
> int main(int argc, char *argv[])
> {
> int ret = 0;
> + struct sigaction new_action, old_action;
> #if defined(HAVE_GETEUID)
> /* geteuid undefined in CYGWIN */
> uid_t myuid = geteuid();
> @@ -762,10 +763,24 @@ int main(int argc, char *argv[])
> mtrace();
> #endif
>
> - /* set signal handlers */
> - signal(SIGINT, handler);
> - signal(SIGTERM, handler);
> - signal(SIGSEGV, handler);
> + /* Set signal handlers */
> + /* Set up the structure to specify the new action. */
> + new_action.sa_handler = termination_handler;
> + sigemptyset(&new_action.sa_mask);
> + new_action.sa_flags = 0;
> +
> + sigaction(SIGINT, NULL, &old_action);
> + if(old_action.sa_handler != SIG_IGN) {
> + sigaction(SIGINT, &new_action, NULL);
> + }
> + sigaction(SIGTERM, NULL, &old_action);
> + if(old_action.sa_handler != SIG_IGN) {
> + sigaction(SIGTERM, &new_action, NULL);
> + }
> + sigaction(SIGSEGV, NULL, &old_action);
> + if(old_action.sa_handler != SIG_IGN) {
> + sigaction(SIGSEGV, &new_action, NULL);
> + }
>
> /* i18n init */
> #if defined(ENABLE_NLS)
> --
> 1.5.4.2
Looks good, pulled locally and I just made the small change where we
don't rename the handler function.
More information about the pacman-dev
mailing list