diff options
| author | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
|---|---|---|
| committer | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
| commit | 268a53de823a6750d6256ee1fb1e7707b4b45740 (patch) | |
| tree | 42c1799a9a82b2f7d9790ee9fe181d72a7274751 /sim/ucsim/gui.src/serio.src/posix_signal.cc | |
| download | sdcc-gas-268a53de823a6750d6256ee1fb1e7707b4b45740.tar.gz | |
sdcc-3.9.0 fork implementing GNU assembler syntax
This fork aims to provide better support for stm8-binutils
Diffstat (limited to 'sim/ucsim/gui.src/serio.src/posix_signal.cc')
| -rw-r--r-- | sim/ucsim/gui.src/serio.src/posix_signal.cc | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/sim/ucsim/gui.src/serio.src/posix_signal.cc b/sim/ucsim/gui.src/serio.src/posix_signal.cc new file mode 100644 index 0000000..8183f57 --- /dev/null +++ b/sim/ucsim/gui.src/serio.src/posix_signal.cc @@ -0,0 +1,106 @@ +/****************************************************************************** + * posix_signal.cc - A signal handleing class for linux + solaris * + * to convert posix into somthing easier to use * + * Tim Hurman - t.hurman@virgin.net * + * Last edited on 01th Oct 19999 * + ******************************************************************************/ +/* + * A quick note, fscking linux, none of this would be neccessary if + * linux contained support for sighold, sigrelse, sigignore and sigpause. + * + */ + +#include <sys/types.h> +#include <iostream> +#include <sys/wait.h> /* header for waitpid() and various macros */ +#include <signal.h> /* header for signal functions */ +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <strings.h> +#include <errno.h> + +#include "posix_signal.hh" + +// constructor +SigHandler::SigHandler() +{ +} + +// destructor +SigHandler::~SigHandler() +{ +} + +/* set a signal */ +int SigHandler::SetSignal(int SIGNAL, SIG_PF ACTION) +{ + struct sigaction act; + + /* declare what is going to be called when */ + act.sa_handler = ACTION; + + /* clear the structure's mask */ + sigemptyset(&act.sa_mask); + + /* set up some flags */ + if(SIGNAL == SIGCHLD) { + act.sa_flags = SA_NOCLDSTOP; + } + + /* set the signal handler */ + if(sigaction(SIGNAL, &act, NULL) < 0) + { + std::cerr << "sigaction(): " << strerror(errno) << "\n"; + exit(-1); + } + + /* all ok */ + return(0); +} + + +/* block a signal */ +int SigHandler::BlockSignal(int SIGNAL) +{ + sigset_t set; + + /* initalise */ + sigemptyset(&set); + + /* add the SIGNAL to the set */ + sigaddset(&set, SIGNAL); + + /* block it */ + if(sigprocmask(SIG_BLOCK, &set, NULL) < 0) + { + std::cerr << "sigprocmask(): " << strerror(errno) << "\n"; + exit(-1); + } + + /* done */ + return(0); +} + + +/* unblock a signal */ +int SigHandler::UnBlockSignal(int SIGNAL) +{ + sigset_t set; + + /* initalise */ + sigemptyset(&set); + + /* add the SIGNAL to the set */ + sigaddset(&set, SIGNAL); + + /* block it */ + if(sigprocmask(SIG_UNBLOCK, &set, NULL) < 0) + { + std::cerr << "sigprocmask(): " << strerror(errno) << "\n"; + exit(-1); + } + + /* done */ + return(0); +} |
