Don't create registry keys needlessly.
authorIain Patterson <me@iain.cx>
Fri, 2 Jan 2015 13:16:54 +0000 (13:16 +0000)
committerIain Patterson <me@iain.cx>
Fri, 2 Jan 2015 13:45:58 +0000 (13:45 +0000)
Don't log an error when trying to access a registry key which doesn't
exist when it's expected that it might not be present.

Don't open a key with RegCreateKeyEx() when we are potentially going to
delete a value.  Instead try RegOpenKeyEx() and return success if it
already isn't present.

registry.cpp
registry.h

index 4abf595..725844b 100644 (file)
@@ -457,7 +457,7 @@ void override_milliseconds(TCHAR *service_name, HKEY key, TCHAR *value, unsigned
   if (! ok) *buffer = default_value;\r
 }\r
 \r
-HKEY open_registry(const TCHAR *service_name, const TCHAR *sub, REGSAM sam) {\r
+HKEY open_registry(const TCHAR *service_name, const TCHAR *sub, REGSAM sam, bool must_exist) {\r
   /* Get registry */\r
   TCHAR registry[KEY_LENGTH];\r
   HKEY key;\r
@@ -477,7 +477,9 @@ HKEY open_registry(const TCHAR *service_name, const TCHAR *sub, REGSAM sam) {
     }\r
   }\r
   else {\r
-    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, registry, 0, sam, &key) != ERROR_SUCCESS) {\r
+    long error = RegOpenKeyEx(HKEY_LOCAL_MACHINE, registry, 0, sam, &key);\r
+    if (error != ERROR_SUCCESS) {\r
+      if (error == ERROR_FILE_NOT_FOUND && ! must_exist) return 0;\r
       log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OPENKEY_FAILED, registry, error_string(GetLastError()), 0);\r
       return 0;\r
     }\r
@@ -486,8 +488,12 @@ HKEY open_registry(const TCHAR *service_name, const TCHAR *sub, REGSAM sam) {
   return key;\r
 }\r
 \r
+HKEY open_registry(const TCHAR *service_name, const TCHAR *sub, REGSAM sam) {\r
+  return open_registry(service_name, sub, sam, true);\r
+}\r
+\r
 HKEY open_registry(const TCHAR *service_name, REGSAM sam) {\r
-  return open_registry(service_name, 0, sam);\r
+  return open_registry(service_name, 0, sam, true);\r
 }\r
 \r
 int get_io_parameters(nssm_service_t *service, HKEY key) {\r
index bd8ee41..3e380b4 100644 (file)
@@ -35,6 +35,7 @@
 #define NSSM_REG_NO_CONSOLE _T("AppNoConsole")\r
 #define NSSM_STDIO_LENGTH 29\r
 \r
+HKEY open_registry(const TCHAR *, const TCHAR *, REGSAM sam, bool);\r
 HKEY open_registry(const TCHAR *, const TCHAR *, REGSAM sam);\r
 HKEY open_registry(const TCHAR *, REGSAM sam);\r
 int create_messages();\r