diff options
author | midipix <writeonce@midipix.org> | 2016-08-11 05:09:15 -0400 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2016-08-11 09:07:19 -0400 |
commit | 6f3f3fd51fe39d917e88eae80b5b431499de3ea7 (patch) | |
tree | bc7a92d730215f459c891cb2d7d58c38fe79c0c9 /src/daemon/ntapi_dsr_init.c | |
parent | 2894326e30daa39a78fe1d2c2f938f1ab289f717 (diff) | |
download | ntapi-6f3f3fd51fe39d917e88eae80b5b431499de3ea7.tar.bz2 ntapi-6f3f3fd51fe39d917e88eae80b5b431499de3ea7.tar.xz |
daemon initialization routines: support daemon loop termination.
Diffstat (limited to 'src/daemon/ntapi_dsr_init.c')
-rw-r--r-- | src/daemon/ntapi_dsr_init.c | 61 |
1 files changed, 34 insertions, 27 deletions
diff --git a/src/daemon/ntapi_dsr_init.c b/src/daemon/ntapi_dsr_init.c index be72502..58888ed 100644 --- a/src/daemon/ntapi_dsr_init.c +++ b/src/daemon/ntapi_dsr_init.c @@ -11,7 +11,7 @@ #include <ntapi/ntapi.h> #include "ntapi_impl.h" -static void __stdcall __ntapi_dsr_once(nt_daemon_params * params); +static int32_t __stdcall __ntapi_dsr_once(nt_daemon_params * params); int32_t __stdcall __ntapi_dsr_init(nt_daemon_params * params) { @@ -120,29 +120,45 @@ int32_t __stdcall __ntapi_dsr_init(nt_daemon_params * params) /* __ntapi_dsr_start executes in the daemon's dedicated thread */ -int32_t __stdcall __ntapi_dsr_start(nt_daemon_params * params) +int32_t __stdcall __ntapi_dsr_start_impl(nt_daemon_params * params) { - __ntapi_dsr_once(params); - __ntapi_dsr_create_port(params); - __ntapi_dsr_connect_internal_client(params); - params->daemon_loop_routine(params->daemon_loop_context); + int32_t status; + + if ((status = __ntapi_dsr_once(params))) + return status; + + if ((status = __ntapi_dsr_create_port(params))) + return status; + + if ((status = __ntapi_dsr_connect_internal_client(params))) + return status; + + if ((status = params->daemon_loop_routine(params->daemon_loop_context))) + return status; + + return NT_STATUS_SUCCESS; +} - /* (no return) */ - return NT_STATUS_INTERNAL_ERROR; +int32_t __stdcall __ntapi_dsr_start(nt_daemon_params * params) +{ + return __ntapi->zw_terminate_thread( + NT_CURRENT_THREAD_HANDLE, + __ntapi_dsr_start_impl(params)); } + /* __ntapi_dsr_once executes in the daemon's dedicated thread */ -static void __stdcall __ntapi_dsr_once(nt_daemon_params * params) +static int32_t __stdcall __ntapi_dsr_once(nt_daemon_params * params) { int32_t status; if (!params->daemon_once_routine) - return; + return NT_STATUS_SUCCESS; - if ((status = params->daemon_once_routine(params->daemon_loop_context))) { + if ((status = params->daemon_once_routine(params->daemon_loop_context))) params->exit_code_daemon_start = status; - __ntapi->zw_terminate_thread(NT_CURRENT_THREAD_HANDLE,status); - } + + return status; } /* __ntapi_dsr_create_port executes in the daemon's dedicated thread */ @@ -175,15 +191,11 @@ int32_t __stdcall __ntapi_dsr_create_port(nt_daemon_params * params) oa.sec_qos = &sqos; /* create the port */ - *pstatus = __ntapi->zw_create_port( - ¶ms->hport_daemon, - &oa,0,(uint32_t)params->port_msg_size, - 0); - - if (*pstatus != NT_STATUS_SUCCESS) - __ntapi->zw_terminate_thread( - NT_CURRENT_THREAD_HANDLE, - *pstatus); + if ((*pstatus = __ntapi->zw_create_port( + ¶ms->hport_daemon, + &oa,0,(uint32_t)params->port_msg_size, + 0))) + return *pstatus; /* return port info */ if (params->pport_daemon) @@ -194,10 +206,5 @@ int32_t __stdcall __ntapi_dsr_create_port(nt_daemon_params * params) params->hevent_daemon_ready, (int32_t *)0); - if (*pstatus != NT_STATUS_SUCCESS) - __ntapi->zw_terminate_thread( - NT_CURRENT_THREAD_HANDLE, - *pstatus); - return *pstatus; } |