+static inline bool split_hook_name(const TCHAR *hook_name, TCHAR *hook_event, TCHAR *hook_action) {
+ TCHAR *s;
+
+ for (s = (TCHAR *) hook_name; *s; s++) {
+ if (*s == _T('/')) {
+ *s = _T('\0');
+ _sntprintf_s(hook_event, HOOK_NAME_LENGTH, _TRUNCATE, _T("%s"), hook_name);
+ _sntprintf_s(hook_action, HOOK_NAME_LENGTH, _TRUNCATE, _T("%s"), ++s);
+ return valid_hook_name(hook_event, hook_action, false);
+ }
+ }
+
+ print_message(stderr, NSSM_MESSAGE_INVALID_HOOK_NAME, hook_name);
+ return false;
+}
+
+static int setting_set_hook(const TCHAR *service_name, void *param, const TCHAR *name, void *default_value, value_t *value, const TCHAR *additional) {
+ TCHAR hook_event[HOOK_NAME_LENGTH];
+ TCHAR hook_action[HOOK_NAME_LENGTH];
+ if (! split_hook_name(additional, hook_event, hook_action)) return -1;
+
+ TCHAR *cmd;
+ if (value && value->string) cmd = value->string;
+ else cmd = _T("");
+
+ if (set_hook(service_name, hook_event, hook_action, cmd)) return -1;
+ if (! _tcslen(cmd)) return 0;
+ return 1;
+}
+
+static int setting_get_hook(const TCHAR *service_name, void *param, const TCHAR *name, void *default_value, value_t *value, const TCHAR *additional) {
+ TCHAR hook_event[HOOK_NAME_LENGTH];
+ TCHAR hook_action[HOOK_NAME_LENGTH];
+ if (! split_hook_name(additional, hook_event, hook_action)) return -1;
+
+ TCHAR cmd[CMD_LENGTH];
+ if (get_hook(service_name, hook_event, hook_action, cmd, sizeof(cmd))) return -1;
+
+ value_from_string(name, value, cmd);
+
+ if (! _tcslen(cmd)) return 0;
+ return 1;
+}
+