From e38ea5f90ea79e1240b9f96145b01d35e4ac15ad Mon Sep 17 00:00:00 2001 From: Kevin Dalley Date: Wed, 17 Mar 2004 05:01:41 +0000 Subject: [PATCH] * lib/sighandle.h, lib/sighandle.C: signal handling code, new files. svn path=/trunk/boinc/; revision=3090 --- lib/sighandle.C | 72 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/sighandle.h | 31 +++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 lib/sighandle.C create mode 100644 lib/sighandle.h diff --git a/lib/sighandle.C b/lib/sighandle.C new file mode 100644 index 0000000000..ab8b62d8d9 --- /dev/null +++ b/lib/sighandle.C @@ -0,0 +1,72 @@ +// The contents of this file are subject to the BOINC Public License +// Version 1.0 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://boinc.berkeley.edu/license_1.0.txt +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations +// under the License. +// +// The Original Code is the Berkeley Open Infrastructure for Network Computing. +// +// The Initial Developer of the Original Code is the SETI@home project. +// Portions created by the SETI@home project are Copyright (C) 2002 +// University of California at Berkeley. All Rights Reserved. +// +// Contributor(s): +// Thomas Horsten +// + + +#ifdef _WIN32 +#include "stdafx.h" +#else +#include "config.h" +#endif +#ifdef HAVE_SIGNAL_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#include "sighandle.h" + +#ifdef HAVE_SIGNAL_H +// Set a signal handler but only if it is not currently ignored +void boinc_set_signal_handler(int sig, RETSIGTYPE (*handler)(int)) +{ +#ifdef HAVE_SIGACTION + struct sigaction temp; + sigaction(sig, NULL, &temp); + if (temp.sa_handler != SIG_IGN) { + temp.sa_handler = handler; + sigemptyset(&temp.sa_mask); + sigaction(sig, &temp, NULL); + } +#else + void (*temp)(int); + temp = signal(sig, boinc_catch_signal); + if (temp == SIG_IGN) { + signal(sig, SIG_IGN); + } +#endif /* HAVE_SIGACTION */ +} + +// Set a signal handler but even if it is currently ignored +void boinc_set_signal_handler_force(int sig, RETSIGTYPE (*handler)(int)) +{ +#ifdef HAVE_SIGACTION + struct sigaction temp; + sigaction(sig, NULL, &temp); + temp.sa_handler = handler; + sigemptyset(&temp.sa_mask); + sigaction(sig, &temp, NULL); +#else + void (*temp)(int); + temp = signal(sig, boinc_catch_signal); + signal(sig, SIG_IGN); +#endif /* HAVE_SIGACTION */ +} + +#endif /* HAVE_SIGNAL_H */ diff --git a/lib/sighandle.h b/lib/sighandle.h new file mode 100644 index 0000000000..acfaeff347 --- /dev/null +++ b/lib/sighandle.h @@ -0,0 +1,31 @@ +// The contents of this file are subject to the BOINC Public License +// Version 1.0 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://boinc.berkeley.edu/license_1.0.txt +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations +// under the License. +// +// The Original Code is the Berkeley Open Infrastructure for Network Computing. +// +// The Initial Developer of the Original Code is the SETI@home project. +// Portions created by the SETI@home project are Copyright (C) 2002 +// University of California at Berkeley. All Rights Reserved. +// +// Contributor(s): + +#ifndef SIGHANDLE_H +#define SIGHANDLE_H + +#ifdef _WIN32 +#include "stdafx.h" +#else +#include "config.h" +#endif + +void boinc_set_signal_handler(int sig, RETSIGTYPE (*handler)(int)); +void boinc_set_signal_handler_force(int sig, RETSIGTYPE (*handler)(int)); + +#endif /* SIGHANDLE_H */