Show More
@@ -231,6 +231,38 b' static void forwardsignal(int sig)' | |||
|
231 | 231 | debugmsg("forward signal %d", sig); |
|
232 | 232 | } |
|
233 | 233 | |
|
234 | static void handlestopsignal(int sig) | |
|
235 | { | |
|
236 | sigset_t unblockset, oldset; | |
|
237 | struct sigaction sa, oldsa; | |
|
238 | if (sigemptyset(&unblockset) < 0) | |
|
239 | goto error; | |
|
240 | if (sigaddset(&unblockset, sig) < 0) | |
|
241 | goto error; | |
|
242 | memset(&sa, 0, sizeof(sa)); | |
|
243 | sa.sa_handler = SIG_DFL; | |
|
244 | sa.sa_flags = SA_RESTART; | |
|
245 | if (sigemptyset(&sa.sa_mask) < 0) | |
|
246 | goto error; | |
|
247 | ||
|
248 | forwardsignal(sig); | |
|
249 | if (raise(sig) < 0) /* resend to self */ | |
|
250 | goto error; | |
|
251 | if (sigaction(sig, &sa, &oldsa) < 0) | |
|
252 | goto error; | |
|
253 | if (sigprocmask(SIG_UNBLOCK, &unblockset, &oldset) < 0) | |
|
254 | goto error; | |
|
255 | /* resent signal will be handled before sigprocmask() returns */ | |
|
256 | if (sigprocmask(SIG_SETMASK, &oldset, NULL) < 0) | |
|
257 | goto error; | |
|
258 | if (sigaction(sig, &oldsa, NULL) < 0) | |
|
259 | goto error; | |
|
260 | return; | |
|
261 | ||
|
262 | error: | |
|
263 | abortmsg("failed to handle stop signal (errno = %d)", errno); | |
|
264 | } | |
|
265 | ||
|
234 | 266 | static void setupsignalhandler(pid_t pid) |
|
235 | 267 | { |
|
236 | 268 | if (pid <= 0) |
@@ -253,6 +285,17 b' static void setupsignalhandler(pid_t pid' | |||
|
253 | 285 | sa.sa_flags |= SA_RESETHAND; |
|
254 | 286 | if (sigaction(SIGTERM, &sa, NULL) < 0) |
|
255 | 287 | goto error; |
|
288 | ||
|
289 | /* propagate job control requests to worker */ | |
|
290 | sa.sa_handler = forwardsignal; | |
|
291 | sa.sa_flags = SA_RESTART; | |
|
292 | if (sigaction(SIGCONT, &sa, NULL) < 0) | |
|
293 | goto error; | |
|
294 | sa.sa_handler = handlestopsignal; | |
|
295 | sa.sa_flags = SA_RESTART; | |
|
296 | if (sigaction(SIGTSTP, &sa, NULL) < 0) | |
|
297 | goto error; | |
|
298 | ||
|
256 | 299 | return; |
|
257 | 300 | |
|
258 | 301 | error: |
General Comments 0
You need to be logged in to leave comments.
Login now