summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimo Sorce <idra@samba.org>2011-08-08 10:08:46 -0400
committerAndreas Schneider <asn@samba.org>2011-08-10 18:14:05 +0200
commitf00681fe9a78e5c0b02daff2fd83a568f8d95eff (patch)
tree80c0f5edb3712e40734e74dc580fb69c1b52058e
parent6f682be2ae27d0f6b087a315a10f3c02cc385b66 (diff)
downloadsamba-f00681fe9a78e5c0b02daff2fd83a568f8d95eff.tar.gz
samba-f00681fe9a78e5c0b02daff2fd83a568f8d95eff.tar.bz2
samba-f00681fe9a78e5c0b02daff2fd83a568f8d95eff.zip
s3-printing: make sure to block SIGHUP ...
... until we are ready to handle it. Also make us ready as early as possible in spoolssd. Signed-off-by: Andreas Schneider <asn@samba.org>
-rw-r--r--source3/printing/queue_process.c19
-rw-r--r--source3/printing/spoolssd.c24
2 files changed, 39 insertions, 4 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);
}
diff --git a/source3/printing/spoolssd.c b/source3/printing/spoolssd.c
index 774f67da1b..4379179f02 100644
--- a/source3/printing/spoolssd.c
+++ b/source3/printing/spoolssd.c
@@ -713,14 +713,27 @@ pid_t start_spoolssd(struct tevent_context *ev_ctx,
DEBUG(1, ("Forking SPOOLSS Daemon\n"));
+ /*
+ * 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();
if (pid == -1) {
DEBUG(0, ("Failed to fork SPOOLSS [%s]\n",
strerror(errno)));
}
+
+ /* parent or error */
if (pid != 0) {
- /* parent or error */
+
+ /* Re-enable SIGHUP before returnig */
+ BlockSignals(false, SIGTERM);
+ BlockSignals(false, SIGHUP);
return pid;
}
@@ -738,6 +751,12 @@ pid_t start_spoolssd(struct tevent_context *ev_ctx,
spoolss_reopen_logs(0);
spoolss_prefork_config();
+ spoolss_setup_sig_term_handler(ev_ctx);
+ spoolss_setup_sig_hup_handler(ev_ctx, msg_ctx);
+
+ BlockSignals(false, SIGTERM);
+ BlockSignals(false, SIGHUP);
+
/* Publish nt printers, this requires a working winreg pipe */
pcap_cache_reload(ev_ctx, msg_ctx, &reload_printers);
@@ -771,9 +790,6 @@ pid_t start_spoolssd(struct tevent_context *ev_ctx,
&spoolss_children_main, NULL,
&spoolss_pool);
- spoolss_setup_sig_term_handler(ev_ctx);
- spoolss_setup_sig_hup_handler(ev_ctx, msg_ctx);
-
if (!serverid_register(procid_self(),
FLAG_MSG_GENERAL|FLAG_MSG_SMBD
|FLAG_MSG_PRINT_GENERAL)) {