Pol  Revision:cb584c9
polsig.cpp
Go to the documentation of this file.
1 
8 #include "polsig.h"
9 
10 #include <stdio.h>
11 #include <stdlib.h>
12 
13 #include "../clib/esignal.h"
14 #include "../clib/logfacility.h"
15 #include "../clib/threadhelp.h"
16 #include "globals/state.h"
17 
18 #ifndef _WIN32
19 #include <signal.h>
20 #endif
21 
22 namespace Pol
23 {
24 namespace Core
25 {
27  : reload_configuration_signalled( false ),
28  report_status_signalled( false ),
29  scripts_thread_checkpoint( 0 ),
30  tasks_thread_checkpoint( 0 ),
31  active_client_thread_checkpoint( 0 ),
32  check_attack_after_move_function_checkpoint( 0 )
33 {
34 }
35 
36 #ifdef _WIN32
37 
39 {
41 }
42 void signal_catch_thread() {}
43 #else
44 
45 pthread_t main_pthread;
46 
47 
48 void sigpipe_handler( int x )
49 {
50  INFO_PRINT << "SIGPIPE! param=" << x << "\n";
51 }
52 
53 void handle_HUP( int /*x*/ )
54 {
56 }
57 
58 void handle_SIGUSR1( int /*x*/ ) // LINUXTEST
59 {
61 }
62 
63 void null_handler( int /*x*/ ) {}
64 
65 void install_null_handler( int sig )
66 {
67  struct sigaction sa_null;
68  sa_null.sa_handler = null_handler;
69  sigemptyset( &sa_null.sa_mask );
70  sa_null.sa_flags = 0;
71  if ( sigaction( sig, &sa_null, nullptr ) == -1 )
72  {
73  perror( "sigaction failed" );
76  exit( 1 );
77  }
78 }
79 
81 {
82  install_null_handler( SIGPIPE );
83 
84  install_null_handler( SIGHUP );
85  // install_null_handler( SIGUSR1 );
86  install_null_handler( SIGINT );
87  install_null_handler( SIGQUIT );
88  install_null_handler( SIGTERM );
89 
90  sigset_t blocked_sigs;
91  sigemptyset( &blocked_sigs );
92  sigfillset( &blocked_sigs );
93  sigdelset( &blocked_sigs, SIGSEGV );
94  sigdelset( &blocked_sigs, SIGUSR2 );
95  sigdelset( &blocked_sigs, SIGUSR1 );
96 
97  int res = pthread_sigmask( SIG_BLOCK, &blocked_sigs, nullptr );
98  if ( res )
99  {
100  ERROR_PRINT << "pthread_sigmask failed: " << res << "\n";
103  exit( 1 );
104  }
105 
106  // main_pid = getpid();
107  main_pthread = pthread_self();
108 }
109 
111 {
112  int res = pthread_kill( main_pthread, SIGTERM );
113  if ( res )
114  {
115  ERROR_PRINT << "pthread_kill failed: " << res << "\n";
116  }
117 }
118 
120 {
121  sigset_t expected_signals;
122  sigemptyset( &expected_signals );
123  sigaddset( &expected_signals, SIGHUP );
124  // sigaddset( &expected_signals, SIGUSR1 );
125  sigaddset( &expected_signals, SIGINT );
126  sigaddset( &expected_signals, SIGQUIT );
127  sigaddset( &expected_signals, SIGTERM );
128 
129  // cerr << "catch_signals_thread running" << endl;
130  // this thread should be the second last out, so it can still respond to SIGUSR1
131  // this is called from main(), so it can exit when there is one thread left
132  // (that will be the thread_status thread)
134  {
135  int caught = 0;
136  sigwait( &expected_signals, &caught );
137  switch ( caught )
138  {
139  case SIGHUP:
140  ERROR_PRINT << "SIGHUP: reload configuration.\n";
142  break;
143  case SIGUSR1:
144  ERROR_PRINT << "SIGUSR1: report thread status.\n";
146  break;
147  case SIGINT:
148  ERROR_PRINT << "SIGINT: exit.\n";
149  Clib::exit_signalled = true;
150  break;
151  case SIGQUIT:
152  ERROR_PRINT << "SIGQUIT: exit.\n";
153  Clib::exit_signalled = true;
154  break;
155  case SIGTERM:
156  ERROR_PRINT << "SIGTERM: exit.\n";
157  Clib::exit_signalled = true;
158  break;
159  default:
160  ERROR_PRINT << "Unexpected signal: " << caught << "\n";
161  break;
162  }
163  }
164  // cerr << "catch_signals thread exits" << endl;
165 }
166 
167 #endif
168 }
169 }
void install_signal_handlers()
Definition: polsig.cpp:80
volatile bool reload_configuration_signalled
Definition: polsig.h:19
void null_handler(int)
Definition: polsig.cpp:63
void handle_HUP(int)
Definition: polsig.cpp:53
void install_null_handler(int sig)
Definition: polsig.cpp:65
volatile bool report_status_signalled
Definition: polsig.h:20
void handle_SIGUSR1(int)
Definition: polsig.cpp:58
void signal_catch_thread()
Definition: polsig.cpp:110
void enable_exit_signaller()
Definition: esignal.cpp:65
StateManager stateManager
Definition: state.cpp:8
std::atomic< unsigned int > child_threads
#define ERROR_PRINT
Definition: logfacility.h:230
void catch_signals_thread(void)
Definition: polsig.cpp:119
void sigpipe_handler(int x)
Definition: polsig.cpp:48
#define INFO_PRINT
Definition: logfacility.h:223
pthread_t main_pthread
Definition: polsig.cpp:45
LogFacility * global_logger
Definition: logfacility.cpp:62
Definition: berror.cpp:12
std::atomic< bool > exit_signalled