@@ -110,7 +110,7 @@ static const char *_get_exit_reason(siginfo_t *info) {
110110 return "UNKNOWN" ;
111111}
112112
113- static void _handle_sig_child (void ) {
113+ static void _handle_signals (void ) {
114114 struct signalfd_siginfo sfd_info ;
115115 for (;;yield ()) {
116116 for (;;) {
@@ -124,6 +124,10 @@ static void _handle_sig_child(void) {
124124 LOGGER_ERROR ("failed to read from signal fd, incorrect size" );
125125 continue ;
126126 }
127+ if (SIGTERM == sfd_info .ssi_signo ) {
128+ LOGGER_INFO ("ribs daemon: exiting..." );
129+ epoll_worker_exit ();
130+ }
127131 memset (& last_sig_info , 0 , sizeof (last_sig_info ));
128132 epoll_worker_ignore_events (sigfd );
129133 for (;;) {
@@ -183,7 +187,7 @@ static void signal_handler(int signum) {
183187 LOGGER_INFO ("ignoring SIGINT in child process" );
184188 break ;
185189 }
186- case SIGTERM :
190+ LOGGER_INFO ( "received SIGINT" );
187191 epoll_worker_exit ();
188192 break ;
189193 default :
@@ -192,22 +196,29 @@ static void signal_handler(int signum) {
192196}
193197
194198static int _set_signals (void ) {
195- struct sigaction sa = {
196- .sa_handler = signal_handler ,
197- .sa_flags = 0
198- };
199- sigaction (SIGTERM , & sa , NULL );
199+ static char altstack [SIGSTKSZ ];
200+ static stack_t ss ;
201+ memset (& ss , 0 , sizeof (ss ));
202+ ss .ss_sp = altstack ;
203+ ss .ss_size = SIGSTKSZ ;
204+ if (0 > sigaltstack (& ss , NULL ))
205+ return LOGGER_PERROR ("sigaltstack" ), -1 ;
206+
207+ struct sigaction sa ;
208+ memset (& sa , 0 , sizeof (sa ));
209+ sa .sa_handler = signal_handler ;
200210 sigaction (SIGINT , & sa , NULL );
201211
202212 sigset_t sigset ;
203213 sigemptyset (& sigset );
204214 sigaddset (& sigset , SIGCHLD );
215+ sigaddset (& sigset , SIGTERM );
205216 if (0 > sigprocmask (SIG_BLOCK , & sigset , NULL ))
206217 return LOGGER_PERROR ("sigprocmask" ), -1 ;
207218 sigfd = signalfd (-1 , & sigset , SFD_NONBLOCK | SFD_CLOEXEC );
208219 if (0 > sigfd )
209220 return LOGGER_PERROR ("signalfd" ), -1 ;
210- if (NULL == (sigfd_ctx = ribs_context_create (SIG_CHLD_STACK_SIZE , 0 , _handle_sig_child )))
221+ if (NULL == (sigfd_ctx = ribs_context_create (SIG_CHLD_STACK_SIZE , 0 , _handle_signals )))
211222 return -1 ;
212223 return 0 ;
213224}
0 commit comments