Run hooks in response to certain events.
[nssm.git] / hook.h
1 #ifndef HOOK_H
2 #define HOOK_H
3
4 #define NSSM_HOOK_EVENT_START _T("Start")
5 #define NSSM_HOOK_EVENT_STOP _T("Stop")
6 #define NSSM_HOOK_EVENT_EXIT _T("Exit")
7 #define NSSM_HOOK_EVENT_POWER _T("Power")
8 #define NSSM_HOOK_EVENT_ROTATE _T("Rotate")
9
10 #define NSSM_HOOK_ACTION_PRE _T("Pre")
11 #define NSSM_HOOK_ACTION_POST _T("Post")
12 #define NSSM_HOOK_ACTION_CHANGE _T("Change")
13 #define NSSM_HOOK_ACTION_RESUME _T("Resume")
14
15 /* Hook name will be "<service> (<event>/<action>)" */
16 #define HOOK_NAME_LENGTH SERVICE_NAME_LENGTH * 2
17
18 #define NSSM_HOOK_VERSION 1
19
20 /* Hook ran successfully. */
21 #define NSSM_HOOK_STATUS_SUCCESS 0
22 /* No hook configured. */
23 #define NSSM_HOOK_STATUS_NOTFOUND 1
24 /* Hook requested abort. */
25 #define NSSM_HOOK_STATUS_ABORT 99
26 /* Internal error launching hook. */
27 #define NSSM_HOOK_STATUS_ERROR 100
28 /* Hook was not run. */
29 #define NSSM_HOOK_STATUS_NOTRUN 101
30 /* Hook timed out. */
31 #define NSSM_HOOK_STATUS_TIMEOUT 102
32 /* Hook returned non-zero. */
33 #define NSSM_HOOK_STATUS_FAILED 111
34
35 /* Version 1. */
36 #define NSSM_HOOK_ENV_VERSION _T("NSSM_HOOK_VERSION")
37 #define NSSM_HOOK_ENV_IMAGE_PATH _T("NSSM_EXE")
38 #define NSSM_HOOK_ENV_NSSM_CONFIGURATION _T("NSSM_CONFIGURATION")
39 #define NSSM_HOOK_ENV_NSSM_VERSION _T("NSSM_VERSION")
40 #define NSSM_HOOK_ENV_BUILD_DATE _T("NSSM_BUILD_DATE")
41 #define NSSM_HOOK_ENV_PID _T("NSSM_PID")
42 #define NSSM_HOOK_ENV_DEADLINE _T("NSSM_DEADLINE")
43 #define NSSM_HOOK_ENV_SERVICE_NAME _T("NSSM_SERVICE_NAME")
44 #define NSSM_HOOK_ENV_SERVICE_DISPLAYNAME _T("NSSM_SERVICE_DISPLAYNAME")
45 #define NSSM_HOOK_ENV_COMMAND_LINE _T("NSSM_COMMAND_LINE")
46 #define NSSM_HOOK_ENV_APPLICATION_PID _T("NSSM_APPLICATION_PID")
47 #define NSSM_HOOK_ENV_EVENT _T("NSSM_EVENT")
48 #define NSSM_HOOK_ENV_ACTION _T("NSSM_ACTION")
49 #define NSSM_HOOK_ENV_TRIGGER _T("NSSM_TRIGGER")
50 #define NSSM_HOOK_ENV_LAST_CONTROL _T("NSSM_LAST_CONTROL")
51 #define NSSM_HOOK_ENV_START_REQUESTED_COUNT _T("NSSM_START_REQUESTED_COUNT")
52 #define NSSM_HOOK_ENV_START_COUNT _T("NSSM_START_COUNT")
53 #define NSSM_HOOK_ENV_THROTTLE_COUNT _T("NSSM_THROTTLE_COUNT")
54 #define NSSM_HOOK_ENV_EXIT_COUNT _T("NSSM_EXIT_COUNT")
55 #define NSSM_HOOK_ENV_EXITCODE _T("NSSM_EXITCODE")
56 #define NSSM_HOOK_ENV_RUNTIME _T("NSSM_RUNTIME")
57 #define NSSM_HOOK_ENV_APPLICATION_RUNTIME _T("NSSM_APPLICATION_RUNTIME")
58
59 typedef struct {
60   TCHAR name[HOOK_NAME_LENGTH];
61   HANDLE thread_handle;
62 } hook_thread_data_t;
63
64 typedef struct {
65   hook_thread_data_t *data;
66   int num_threads;
67 } hook_thread_t;
68
69 bool valid_hook_name(const TCHAR *, const TCHAR *, bool);
70 void await_hook_threads(hook_thread_t *, SERVICE_STATUS_HANDLE, SERVICE_STATUS *, unsigned long);
71 int nssm_hook(hook_thread_t *, nssm_service_t *, TCHAR *, TCHAR *, unsigned long *, unsigned long, bool);
72 int nssm_hook(hook_thread_t *, nssm_service_t *, TCHAR *, TCHAR *, unsigned long *, unsigned long);
73 int nssm_hook(hook_thread_t *, nssm_service_t *, TCHAR *, TCHAR *, unsigned long *);
74
75 #endif