1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-26 21:57:41 +03:00

printing: Factor out register_printing_bq_handlers()

The printing background jobs can be provided independently of the
start_background_queue() implementation.

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
This commit is contained in:
Volker Lendecke 2021-04-23 10:32:43 +02:00 committed by Jeremy Allison
parent b180ca8cd3
commit 46d47994ee
2 changed files with 82 additions and 36 deletions

View File

@ -156,6 +156,8 @@ struct bq_state {
struct tevent_context *ev;
struct messaging_context *msg;
struct idle_event *housekeep;
struct tevent_signal *sighup_handler;
struct tevent_signal *sigchld_handler;
};
static bool print_queue_housekeeping(const struct timeval *now, void *pvt)
@ -245,17 +247,6 @@ static void bq_sig_hup_handler(struct tevent_context *ev,
bq_reopen_logs(NULL);
}
static void bq_setup_sig_hup_handler(struct bq_state *state)
{
struct tevent_signal *se;
se = tevent_add_signal(state->ev, state->ev, SIGHUP, 0,
bq_sig_hup_handler, state);
if (!se) {
exit_server("failed to setup SIGHUP handler");
}
}
static void bq_sig_chld_handler(struct tevent_context *ev_ctx,
struct tevent_signal *se,
int signum, int count,
@ -280,17 +271,6 @@ static void bq_sig_chld_handler(struct tevent_context *ev_ctx,
} while (pid > 0);
}
static void bq_setup_sig_chld_handler(struct tevent_context *ev_ctx)
{
struct tevent_signal *se;
se = tevent_add_signal(ev_ctx, ev_ctx, SIGCHLD, 0,
bq_sig_chld_handler, NULL);
if (!se) {
exit_server("failed to setup SIGCHLD handler");
}
}
static void bq_smb_conf_updated(struct messaging_context *msg_ctx,
void *private_data,
uint32_t msg_type,
@ -308,6 +288,76 @@ static void bq_smb_conf_updated(struct messaging_context *msg_ctx,
printing_subsystem_queue_tasks(state);
}
static int bq_state_destructor(struct bq_state *s)
{
struct messaging_context *msg_ctx = s->msg;
TALLOC_FREE(s->sighup_handler);
TALLOC_FREE(s->sigchld_handler);
messaging_deregister(msg_ctx, MSG_PRINTER_DRVUPGRADE, NULL);
messaging_deregister(msg_ctx, MSG_PRINTER_UPDATE, NULL);
messaging_deregister(msg_ctx, MSG_SMB_CONF_UPDATED, s);
return 0;
}
struct bq_state *register_printing_bq_handlers(
TALLOC_CTX *mem_ctx,
struct messaging_context *msg_ctx)
{
struct bq_state *state = NULL;
NTSTATUS status;
state = talloc_zero(mem_ctx, struct bq_state);
if (state == NULL) {
return NULL;
}
state->ev = messaging_tevent_context(msg_ctx);
state->msg = msg_ctx;
status = messaging_register(
msg_ctx, state, MSG_SMB_CONF_UPDATED, bq_smb_conf_updated);
if (!NT_STATUS_IS_OK(status)) {
goto fail;
}
status = messaging_register(
msg_ctx, NULL, MSG_PRINTER_UPDATE, print_queue_receive);
if (!NT_STATUS_IS_OK(status)) {
goto fail_dereg_smb_conf_updated;
}
status = messaging_register(
msg_ctx, NULL, MSG_PRINTER_DRVUPGRADE, do_drv_upgrade_printer);
if (!NT_STATUS_IS_OK(status)) {
goto fail_dereg_printer_update;
}
state->sighup_handler = tevent_add_signal(
state->ev, state, SIGHUP, 0, bq_sig_hup_handler, state);
if (state->sighup_handler == NULL) {
goto fail_dereg_printer_drvupgrade;
}
state->sigchld_handler = tevent_add_signal(
state->ev, state, SIGCHLD, 0, bq_sig_chld_handler, NULL);
if (state->sigchld_handler == NULL) {
goto fail_free_handlers;
}
talloc_set_destructor(state, bq_state_destructor);
return state;
fail_free_handlers:
TALLOC_FREE(state->sighup_handler);
TALLOC_FREE(state->sigchld_handler);
fail_dereg_printer_drvupgrade:
messaging_deregister(msg_ctx, MSG_PRINTER_DRVUPGRADE, NULL);
fail_dereg_printer_update:
messaging_deregister(msg_ctx, MSG_PRINTER_UPDATE, NULL);
fail_dereg_smb_conf_updated:
messaging_deregister(msg_ctx, MSG_SMB_CONF_UPDATED, state);
fail:
TALLOC_FREE(state);
return NULL;
}
/****************************************************************************
main thread of the background lpq updater
****************************************************************************/
@ -350,17 +400,17 @@ pid_t start_background_queue(struct tevent_context *ev,
smb_panic("reinit_after_fork() failed");
}
state = talloc_zero(NULL, struct bq_state);
/* Remove previous forwarder message set in parent. */
messaging_deregister(msg_ctx, MSG_PRINTER_DRVUPGRADE, NULL);
state = register_printing_bq_handlers(NULL, msg_ctx);
if (state == NULL) {
DBG_ERR("Could not register bq handlers\n");
exit(1);
}
state->ev = ev;
state->msg = msg_ctx;
bq_reopen_logs(logfile);
bq_setup_sig_term_handler();
bq_setup_sig_hup_handler(state);
bq_setup_sig_chld_handler(ev);
BlockSignals(false, SIGTERM);
BlockSignals(false, SIGHUP);
@ -372,15 +422,6 @@ pid_t start_background_queue(struct tevent_context *ev,
if (!locking_init()) {
exit(1);
}
messaging_register(msg_ctx, state, MSG_SMB_CONF_UPDATED,
bq_smb_conf_updated);
messaging_register(msg_ctx, NULL, MSG_PRINTER_UPDATE,
print_queue_receive);
/* Remove previous forwarder message set in parent. */
messaging_deregister(msg_ctx, MSG_PRINTER_DRVUPGRADE, NULL);
messaging_register(msg_ctx, NULL, MSG_PRINTER_DRVUPGRADE,
do_drv_upgrade_printer);
pcap_cache_reload(ev, msg_ctx, reload_pcap_change_notify);

View File

@ -37,4 +37,9 @@ pid_t start_background_queue(struct tevent_context *ev,
struct messaging_context *msg,
char *logfile);
struct bq_state;
struct bq_state *register_printing_bq_handlers(
TALLOC_CTX *mem_ctx,
struct messaging_context *msg_ctx);
#endif /* _SOURCE3_PRINTING_QUEUE_PROCESS_H_ */