summaryrefslogtreecommitdiff
path: root/source3/printing/queue_process.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/printing/queue_process.c')
-rw-r--r--source3/printing/queue_process.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/source3/printing/queue_process.c b/source3/printing/queue_process.c
index a56baaf6b7..1b7b4f8579 100644
--- a/source3/printing/queue_process.c
+++ b/source3/printing/queue_process.c
@@ -191,8 +191,24 @@ pid_t start_background_queue(struct tevent_context *ev,
exit(1);
}
+ /*
+ * Block signals before forking child as it will have to
+ * set its own handlers. Child will re-enable SIGHUP as
+ * soon as the handlers are set up.
+ */
+ BlockSignals(true, SIGTERM);
+ BlockSignals(true, SIGHUP);
+
pid = sys_fork();
+ /* parent or error */
+ if (pid != 0) {
+ /* Re-enable SIGHUP before returnig */
+ BlockSignals(false, SIGTERM);
+ BlockSignals(false, SIGHUP);
+ return pid;
+ }
+
if (pid == -1) {
DEBUG(5,("start_background_queue: background LPQ thread failed to start. %s\n", strerror(errno) ));
exit(1);
@@ -220,6 +236,9 @@ pid_t start_background_queue(struct tevent_context *ev,
bq_setup_sig_term_handler();
bq_setup_sig_hup_handler(ev, msg_ctx);
+ BlockSignals(false, SIGTERM);
+ BlockSignals(false, SIGHUP);
+
if (!pcap_cache_loaded()) {
pcap_cache_reload(ev, msg_ctx, &reload_printers);
}