Added override_milliseconds() helper.
authorIain Patterson <me@iain.cx>
Wed, 13 Nov 2013 15:32:40 +0000 (15:32 +0000)
committerIain Patterson <me@iain.cx>
Fri, 15 Nov 2013 16:02:55 +0000 (16:02 +0000)
Helper function to retrieve a REG_DWORD value from the registry and
assign it to a variable, substituting a default value if the registry
entry is invalid or missing.  The function is specifically tailored
toward setting a value in milliseconds, hence the name.

registry.cpp
registry.h

index fbcc369..a1332b2 100644 (file)
@@ -219,6 +219,26 @@ int get_number(HKEY key, char *value, unsigned long *number) {
   return get_number(key, value, number, true);\r
 }\r
 \r
+void override_milliseconds(char *service_name, HKEY key, char *value, unsigned long *buffer, unsigned long default_value, unsigned long event) {\r
+  unsigned long type = REG_DWORD;\r
+  unsigned long buflen = sizeof(unsigned long);\r
+  bool ok = false;\r
+  unsigned long ret = RegQueryValueEx(key, value, 0, &type, (unsigned char *) buffer, &buflen);\r
+  if (ret != ERROR_SUCCESS) {\r
+    if (ret != ERROR_FILE_NOT_FOUND) {\r
+      if (type != REG_DWORD) {\r
+        char milliseconds[16];\r
+        _snprintf_s(milliseconds, sizeof(milliseconds), _TRUNCATE, "%lu", default_value);\r
+        log_event(EVENTLOG_WARNING_TYPE, event, service_name, value, milliseconds, 0);\r
+      }\r
+      else log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_QUERYVALUE_FAILED, value, error_string(GetLastError()), 0);\r
+    }\r
+  }\r
+  else ok = true;\r
+\r
+  if (! ok) *buffer = default_value;\r
+}\r
+\r
 int get_parameters(char *service_name, char *exe, unsigned long exelen, char *flags, unsigned long flagslen, char *dir, unsigned long dirlen, char **env, unsigned long *throttle_delay, unsigned long *stop_method, STARTUPINFO *si) {\r
   unsigned long ret;\r
 \r
index 6fd5d9c..9129b64 100644 (file)
@@ -25,6 +25,7 @@ int expand_parameter(HKEY, char *, char *, unsigned long, bool, bool);
 int expand_parameter(HKEY, char *, char *, unsigned long, bool);\r
 int get_number(HKEY, char *, unsigned long *, bool);\r
 int get_number(HKEY, char *, unsigned long *);\r
+void override_milliseconds(char *, HKEY, char *, unsigned long *, unsigned long, unsigned long);\r
 int get_parameters(char *, char *, unsigned long, char *, unsigned long, char *, unsigned long, char **, unsigned long *, unsigned long *, STARTUPINFO *);\r
 int get_exit_action(char *, unsigned long *, unsigned char *, bool *);\r
 \r