summaryrefslogtreecommitdiff
path: root/sim/ucsim/gui.src/serio.src/posix_signal.cc
diff options
context:
space:
mode:
authorXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
committerXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
commit268a53de823a6750d6256ee1fb1e7707b4b45740 (patch)
tree42c1799a9a82b2f7d9790ee9fe181d72a7274751 /sim/ucsim/gui.src/serio.src/posix_signal.cc
downloadsdcc-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.cc106
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);
+}