1
0
mirror of https://github.com/samba-team/samba.git synced 2025-11-07 12:23:51 +03:00

s3:rpc_server: let get_servers() callback of rpc_worker_main() return NTSTATUS

This means the rpc_worker_main() logic is the only layer that
needs to call exit() and its able to do some cleanup before.

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
This commit is contained in:
Stefan Metzmacher
2023-08-09 16:06:06 +02:00
committed by Andrew Bartlett
parent 2d73b1e061
commit ae38cfe6da
10 changed files with 55 additions and 27 deletions

View File

@@ -955,7 +955,7 @@ static NTSTATUS register_ep_server(
*
* get_servers() is called when the process is about to do the real
* work. So more heavy-weight initialization should happen here. It
* should return the number of server implementations provided.
* should return NT_STATUS_OK and the number of server implementations provided.
*
* @param[in] argc argc from main()
* @param[in] argv argv from main()
@@ -974,9 +974,10 @@ int rpc_worker_main(
size_t (*get_interfaces)(
const struct ndr_interface_table ***ifaces,
void *private_data),
size_t (*get_servers)(
NTSTATUS (*get_servers)(
struct dcesrv_context *dce_ctx,
const struct dcesrv_endpoint_server ***ep_servers,
size_t *num_ep_servers,
void *private_data),
void *private_data)
{
@@ -1185,7 +1186,16 @@ int rpc_worker_main(
DBG_INFO("Initializing DCE/RPC registered endpoint servers\n");
num_servers = get_servers(dce_ctx, &ep_servers, private_data);
status = get_servers(dce_ctx,
&ep_servers,
&num_servers,
private_data);
if (!NT_STATUS_IS_OK(status)) {
DBG_ERR("get_servers failed: %s\n", nt_errstr(status));
global_messaging_context_free();
TALLOC_FREE(frame);
exit(1);
}
DBG_DEBUG("get_servers() returned %zu servers\n", num_servers);

View File

@@ -30,9 +30,10 @@ int rpc_worker_main(
size_t (*get_interfaces)(
const struct ndr_interface_table ***ifaces,
void *private_data),
size_t (*get_servers)(
NTSTATUS (*get_servers)(
struct dcesrv_context *dce_ctx,
const struct dcesrv_endpoint_server ***ep_servers,
size_t *num_ep_servers,
void *private_data),
void *private_data);

View File

@@ -72,9 +72,10 @@ static size_t classic_interfaces(
}
static size_t classic_servers(
static NTSTATUS classic_servers(
struct dcesrv_context *dce_ctx,
const struct dcesrv_endpoint_server ***_ep_servers,
size_t *_num_ep_servers,
void *private_data)
{
static const struct dcesrv_endpoint_server *ep_servers[7] = { NULL };
@@ -118,7 +119,8 @@ static size_t classic_servers(
mangle_reset_cache();
*_ep_servers = ep_servers;
return num_servers;
*_num_ep_servers = num_servers;
return NT_STATUS_OK;
}
int main(int argc, const char *argv[])

View File

@@ -47,9 +47,10 @@ static size_t epmapper_interfaces(
return num_ifaces;
}
static size_t epmapper_servers(
static NTSTATUS epmapper_servers(
struct dcesrv_context *dce_ctx,
const struct dcesrv_endpoint_server ***_ep_servers,
size_t *_num_ep_servers,
void *private_data)
{
static const struct dcesrv_endpoint_server *ep_servers[] = { NULL };
@@ -70,7 +71,8 @@ static size_t epmapper_servers(
}
*_ep_servers = ep_servers;
return num_servers;
*_num_ep_servers = num_servers;
return NT_STATUS_OK;
}
int main(int argc, const char *argv[])

View File

@@ -45,16 +45,18 @@ static size_t fsrvp_interfaces(
return ARRAY_SIZE(ifaces);
}
static size_t fsrvp_servers(
static NTSTATUS fsrvp_servers(
struct dcesrv_context *dce_ctx,
const struct dcesrv_endpoint_server ***_ep_servers,
size_t *_num_ep_servers,
void *private_data)
{
static const struct dcesrv_endpoint_server *ep_servers[1] = { NULL };
if (lp_server_role() == ROLE_ACTIVE_DIRECTORY_DC) {
*_ep_servers = NULL;
return 0;
*_num_ep_servers = 0;
return NT_STATUS_OK;
}
lp_load_with_shares(get_dyn_CONFIGFILE());
@@ -62,7 +64,8 @@ static size_t fsrvp_servers(
ep_servers[0] = FileServerVssAgent_get_ep_server();
*_ep_servers = ep_servers;
return ARRAY_SIZE(ep_servers);
*_num_ep_servers = ARRAY_SIZE(ep_servers);
return NT_STATUS_OK;
}
int main(int argc, const char *argv[])

View File

@@ -67,9 +67,10 @@ static size_t lsad_interfaces(
return num_ifaces;
}
static size_t lsad_servers(
static NTSTATUS lsad_servers(
struct dcesrv_context *dce_ctx,
const struct dcesrv_endpoint_server ***_ep_servers,
size_t *_num_ep_servers,
void *private_data)
{
static const struct dcesrv_endpoint_server *ep_servers[4] = { NULL, };
@@ -106,7 +107,8 @@ static size_t lsad_servers(
}
*_ep_servers = ep_servers;
return num_servers;
*_num_ep_servers = num_servers;
return NT_STATUS_OK;
}
int main(int argc, const char *argv[])

View File

@@ -33,9 +33,10 @@ static size_t mdssvc_interfaces(
return ARRAY_SIZE(ifaces);
}
static size_t mdssvc_servers(
static NTSTATUS mdssvc_servers(
struct dcesrv_context *dce_ctx,
const struct dcesrv_endpoint_server ***_ep_servers,
size_t *_num_ep_servers,
void *private_data)
{
static const struct dcesrv_endpoint_server *ep_servers[1] = { NULL };
@@ -46,13 +47,14 @@ static size_t mdssvc_servers(
ok = posix_locking_init(false);
if (!ok) {
DBG_ERR("posix_locking_init() failed\n");
exit(1);
return NT_STATUS_INTERNAL_ERROR;
}
ep_servers[0] = mdssvc_get_ep_server();
*_ep_servers = ep_servers;
return ARRAY_SIZE(ep_servers);
*_num_ep_servers = ARRAY_SIZE(ep_servers);
return NT_STATUS_OK;
}
int main(int argc, const char *argv[])

View File

@@ -47,9 +47,10 @@ static size_t rpcecho_interfaces(
return num_ifaces;
}
static size_t rpcecho_servers(
static NTSTATUS rpcecho_servers(
struct dcesrv_context *dce_ctx,
const struct dcesrv_endpoint_server ***_ep_servers,
size_t *_num_ep_servers,
void *private_data)
{
static const struct dcesrv_endpoint_server *ep_servers[1] = { NULL };
@@ -70,7 +71,8 @@ static size_t rpcecho_servers(
}
*_ep_servers = ep_servers;
return num_servers;
*_num_ep_servers = num_servers;
return NT_STATUS_OK;
}
int main(int argc, const char *argv[])

View File

@@ -37,9 +37,10 @@ static size_t spoolss_interfaces(
return ARRAY_SIZE(ifaces);
}
static size_t spoolss_servers(
static NTSTATUS spoolss_servers(
struct dcesrv_context *dce_ctx,
const struct dcesrv_endpoint_server ***_ep_servers,
size_t *_num_ep_servers,
void *private_data)
{
static const struct dcesrv_endpoint_server *ep_servers[1] = { NULL };
@@ -52,27 +53,28 @@ static size_t spoolss_servers(
ok = secrets_init();
if (!ok) {
DBG_ERR("secrets_init() failed\n");
exit(1);
return NT_STATUS_INTERNAL_ERROR;
}
ok = locking_init();
if (!ok) {
DBG_ERR("locking_init() failed\n");
exit(1);
return NT_STATUS_INTERNAL_ERROR;
}
lp_load_with_shares(get_dyn_CONFIGFILE());
ok = printing_subsystem_init(ev_ctx, msg_ctx, dce_ctx);
if (!ok) {
DBG_WARNING("printing_subsystem_init() failed\n");
exit(1);
DBG_ERR("printing_subsystem_init() failed\n");
return NT_STATUS_INTERNAL_ERROR;
}
mangle_reset_cache();
*_ep_servers = ep_servers;
return ARRAY_SIZE(ep_servers);
*_num_ep_servers = ARRAY_SIZE(ep_servers);
return NT_STATUS_OK;
}
int main(int argc, const char *argv[])

View File

@@ -32,9 +32,10 @@ static size_t winreg_interfaces(
return ARRAY_SIZE(ifaces);
}
static size_t winreg_servers(
static NTSTATUS winreg_servers(
struct dcesrv_context *dce_ctx,
const struct dcesrv_endpoint_server ***_ep_servers,
size_t *_num_ep_servers,
void *private_data)
{
static const struct dcesrv_endpoint_server *ep_servers[1] = { NULL };
@@ -46,13 +47,14 @@ static size_t winreg_servers(
if (!W_ERROR_IS_OK(werr)) {
DBG_ERR("registry_init_full() failed: %s\n",
win_errstr(werr));
exit(1);
return werror_to_ntstatus(werr);
}
lp_load_with_shares(get_dyn_CONFIGFILE());
*_ep_servers = ep_servers;
return ARRAY_SIZE(ep_servers);
*_num_ep_servers = ARRAY_SIZE(ep_servers);
return NT_STATUS_OK;
}
int main(int argc, const char *argv[])