diff options
author | Samuel Cabrero <scabrero@suse.de> | 2019-02-27 16:52:20 +0100 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2019-07-22 16:49:16 +0000 |
commit | a2c943f52d39cedd5b7d9cbb3ed1f34fe62988fc (patch) | |
tree | 4dbad52f1489a8fb5f1dcd1db520ea97fb115985 /source3 | |
parent | dde08e8f262633c017c8288991c9e894cb72d0d8 (diff) | |
download | samba-a2c943f52d39cedd5b7d9cbb3ed1f34fe62988fc.tar.gz |
s3:rpc_server:spoolssd: Move socket creation to its own function
The function also handles the registration in the endpoint mapper.
Signed-off-by: Samuel Cabrero <scabrero@suse.de>
Reviewed-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
Diffstat (limited to 'source3')
-rw-r--r-- | source3/printing/spoolssd.c | 118 |
1 files changed, 73 insertions, 45 deletions
diff --git a/source3/printing/spoolssd.c b/source3/printing/spoolssd.c index 815609b10c6..0ab1bffbca9 100644 --- a/source3/printing/spoolssd.c +++ b/source3/printing/spoolssd.c @@ -597,16 +597,81 @@ static char *get_bq_logfile(void) return lfile; } +static NTSTATUS spoolssd_create_sockets(struct tevent_context *ev_ctx, + struct messaging_context *msg_ctx, + struct pf_listen_fd *listen_fd, + int *listen_fd_size) +{ + struct dcerpc_binding_vector *v = NULL; + TALLOC_CTX *tmp_ctx; + NTSTATUS status; + int fd = -1; + int rc; + enum rpc_service_mode_e epm_mode = rpc_epmapper_mode(); + + tmp_ctx = talloc_stackframe(); + if (tmp_ctx == NULL) { + return NT_STATUS_NO_MEMORY; + } + + status = dcerpc_binding_vector_new(tmp_ctx, &v); + if (!NT_STATUS_IS_OK(status)) { + DBG_ERR("Failed to create binding vector (%s)\n", + nt_errstr(status)); + goto done; + } + + status = dcesrv_create_ncacn_np_socket(SPOOLSS_PIPE_NAME, &fd); + if (!NT_STATUS_IS_OK(status)) { + goto done; + } + + rc = listen(fd, pf_spoolss_cfg.max_allowed_clients); + if (rc == -1) { + DBG_ERR("Failed to listen on spoolss pipe - %s\n", + strerror(errno)); + goto done; + } + listen_fd[*listen_fd_size].fd = fd; + listen_fd[*listen_fd_size].fd_data = NULL; + (*listen_fd_size)++; + fd = -1; + + if (epm_mode != RPC_SERVICE_MODE_DISABLED && + (lp_parm_bool(-1, "rpc_server", "register_embedded_np", false))) { + status = dcerpc_binding_vector_add_np_default(&ndr_table_spoolss, v); + if (!NT_STATUS_IS_OK(status)) { + DBG_ERR("Failed to add np to binding vector (%s)\n", + nt_errstr(status)); + goto done; + } + + status = rpc_ep_register(ev_ctx, msg_ctx, &ndr_table_spoolss, v); + if (!NT_STATUS_IS_OK(status)) { + DBG_ERR("Failed to register spoolss endpoint! (%s)\n", + nt_errstr(status)); + goto done; + } + } + + status = NT_STATUS_OK; +done: + if (fd != -1) { + close(fd); + } + + talloc_free(tmp_ctx); + return status; +} + pid_t start_spoolssd(struct tevent_context *ev_ctx, struct messaging_context *msg_ctx) { - enum rpc_service_mode_e epm_mode = rpc_epmapper_mode(); struct rpc_srv_callbacks spoolss_cb; - struct dcerpc_binding_vector *v; - TALLOC_CTX *mem_ctx; pid_t pid; NTSTATUS status; struct pf_listen_fd listen_fds[1]; + int listen_fds_size = 0; int ret; bool ok; @@ -667,24 +732,18 @@ pid_t start_spoolssd(struct tevent_context *ev_ctx, /* the listening fd must be created before the children are actually * forked out. */ - status = dcesrv_create_ncacn_np_socket(SPOOLSS_PIPE_NAME, - &listen_fds[0].fd); + status = spoolssd_create_sockets(ev_ctx, msg_ctx, listen_fds, + &listen_fds_size); if (!NT_STATUS_IS_OK(status)) { - exit(1); - } - listen_fds[0].fd_data = NULL; - - ret = listen(listen_fds[0].fd, pf_spoolss_cfg.max_allowed_clients); - if (ret == -1) { - DEBUG(0, ("Failed to listen on spoolss pipe - %s\n", - strerror(errno))); + DBG_ERR("Failed to create sockets: %s\n", + nt_errstr(status)); exit(1); } /* start children before any more initialization is done */ ok = prefork_create_pool(ev_ctx, /* mem_ctx */ ev_ctx, msg_ctx, - 1, listen_fds, + listen_fds_size, listen_fds, pf_spoolss_cfg.min_children, pf_spoolss_cfg.max_children, &spoolss_children_main, NULL, @@ -711,11 +770,6 @@ pid_t start_spoolssd(struct tevent_context *ev_ctx, */ load_printers(); - mem_ctx = talloc_new(NULL); - if (mem_ctx == NULL) { - exit(1); - } - /* * Initialize spoolss with an init function to convert printers first. * static_init_rpc will try to initialize the spoolss server too but you @@ -739,32 +793,6 @@ pid_t start_spoolssd(struct tevent_context *ev_ctx, exit(1); } - if (epm_mode != RPC_SERVICE_MODE_DISABLED && - (lp_parm_bool(-1, "rpc_server", "register_embedded_np", false))) { - status = dcerpc_binding_vector_new(mem_ctx, &v); - if (!NT_STATUS_IS_OK(status)) { - DEBUG(0, ("Failed to create binding vector (%s)\n", - nt_errstr(status))); - exit(1); - } - - status = dcerpc_binding_vector_add_np_default(&ndr_table_spoolss, v); - if (!NT_STATUS_IS_OK(status)) { - DEBUG(0, ("Failed to add np to binding vector (%s)\n", - nt_errstr(status))); - exit(1); - } - - status = rpc_ep_register(ev_ctx, msg_ctx, &ndr_table_spoolss, v); - if (!NT_STATUS_IS_OK(status)) { - DEBUG(0, ("Failed to register spoolss endpoint! (%s)\n", - nt_errstr(status))); - exit(1); - } - } - - talloc_free(mem_ctx); - ok = spoolssd_setup_children_monitor(ev_ctx, msg_ctx); if (!ok) { DEBUG(0, ("Failed to setup children monitoring!\n")); |