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:
committed by
Andrew Bartlett
parent
2d73b1e061
commit
ae38cfe6da
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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[])
|
||||
|
||||
@@ -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[])
|
||||
|
||||
@@ -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[])
|
||||
|
||||
@@ -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[])
|
||||
|
||||
@@ -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[])
|
||||
|
||||
@@ -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[])
|
||||
|
||||
@@ -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[])
|
||||
|
||||
@@ -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[])
|
||||
|
||||
Reference in New Issue
Block a user