summaryrefslogtreecommitdiffhomepage
path: root/src/daemon/ntapi_dsr_init.c
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2016-08-11 05:09:15 -0400
committermidipix <writeonce@midipix.org>2016-08-11 09:07:19 -0400
commit6f3f3fd51fe39d917e88eae80b5b431499de3ea7 (patch)
treebc7a92d730215f459c891cb2d7d58c38fe79c0c9 /src/daemon/ntapi_dsr_init.c
parent2894326e30daa39a78fe1d2c2f938f1ab289f717 (diff)
downloadntapi-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.c61
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(
- &params->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(
+ &params->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;
}