[PATCH v4 1/8] reg.exe: Perform checks in wmain

Jonathan Vollebregt jnvsor at gmail.com
Thu Oct 9 03:55:07 CDT 2014


Move as much error-checking to main as possible so sub functions
don't have to repeat basic checks

IE: Is the key on a remote system, or are we missing arguments?
---
 programs/reg/reg.c  | 82 ++++++++++++++++++++++-------------------------------
 programs/reg/reg.rc |  2 +-
 2 files changed, 35 insertions(+), 49 deletions(-)

diff --git a/programs/reg/reg.c b/programs/reg/reg.c
index d299cbf..181d889 100644
--- a/programs/reg/reg.c
+++ b/programs/reg/reg.c
@@ -173,12 +173,6 @@ static int reg_add(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
 
     reg_printfW(stubW, key_name, value_name, value_empty, type, data, force);
 
-    if (key_name[0]=='\\' && key_name[1]=='\\')
-    {
-        reg_message(STRING_NO_REMOTE);
-        return 1;
-    }
-
     p = strchrW(key_name,'\\');
     if (!p)
     {
@@ -246,12 +240,6 @@ static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
         ,0};
     reg_printfW(stubW, key_name, value_name, value_empty, value_all, force);
 
-    if (key_name[0]=='\\' && key_name[1]=='\\')
-    {
-        reg_message(STRING_NO_REMOTE);
-        return 1;
-    }
-
     p = strchrW(key_name,'\\');
     if (!p)
     {
@@ -389,23 +377,45 @@ int wmain(int argc, WCHAR *argvW[])
         reg_message(STRING_USAGE);
         return 0;
     }
-
-    if (!lstrcmpiW(argvW[1], addW))
+    else if (argc < 3)
     {
-        WCHAR *key_name, *value_name = NULL, *type = NULL, separator = '\0', *data = NULL;
-        BOOL value_empty = FALSE, force = FALSE;
-
-        if (argc < 3)
+        reg_message(STRING_INVALID_CMDLINE);
+        return 1;
+    }
+    else if (argc == 3 && (!lstrcmpW(argvW[2], slashHelpW) || !lstrcmpiW(argvW[2], slashHW)))
+    {
+        if (!lstrcmpiW(argvW[1], addW))
+            reg_message(STRING_ADD_USAGE);
+        else if (!lstrcmpiW(argvW[1], deleteW))
+            reg_message(STRING_DELETE_USAGE);
+        else if (!lstrcmpiW(argvW[1], queryW))
+            reg_message(STRING_QUERY_USAGE);
+        else
         {
             reg_message(STRING_INVALID_CMDLINE);
             return 1;
         }
-        else if (argc == 3 && (!lstrcmpW(argvW[2], slashHelpW) ||
-                               !lstrcmpiW(argvW[2], slashHW)))
-        {
-            reg_message(STRING_ADD_USAGE);
-            return 0;
-        }
+
+        return 0;
+    }
+
+    if (argvW[2][0] == '\\')
+        argvW[2]++;
+
+    if (argvW[2][0] == '\\')
+    {
+        reg_message(STRING_NO_REMOTE);
+        return 1;
+    }
+
+    i = strlenW(argvW[2]) - 1;
+    while (i >= 0 && argvW[2][i] == '\\')
+        argvW[2][i--] = 0;
+
+    if (!lstrcmpiW(argvW[1], addW))
+    {
+        WCHAR *key_name, *value_name = NULL, *type = NULL, separator = '\0', *data = NULL;
+        BOOL value_empty = FALSE, force = FALSE;
 
         key_name = argvW[2];
         for (i = 1; i < argc; i++)
@@ -431,18 +441,6 @@ int wmain(int argc, WCHAR *argvW[])
         WCHAR *key_name, *value_name = NULL;
         BOOL value_empty = FALSE, value_all = FALSE, force = FALSE;
 
-        if (argc < 3)
-        {
-            reg_message(STRING_INVALID_CMDLINE);
-            return 1;
-        }
-        else if (argc == 3 && (!lstrcmpW(argvW[2], slashHelpW) ||
-                               !lstrcmpiW(argvW[2], slashHW)))
-        {
-            reg_message(STRING_DELETE_USAGE);
-            return 0;
-        }
-
         key_name = argvW[2];
         for (i = 1; i < argc; i++)
         {
@@ -462,18 +460,6 @@ int wmain(int argc, WCHAR *argvW[])
         WCHAR *key_name, *value_name = NULL;
         BOOL value_empty = FALSE, subkey = FALSE;
 
-        if (argc < 3)
-        {
-            reg_message(STRING_INVALID_CMDLINE);
-            return 1;
-        }
-        else if (argc == 3 && (!lstrcmpW(argvW[2], slashHelpW) ||
-                               !lstrcmpiW(argvW[2], slashHW)))
-        {
-            reg_message(STRING_QUERY_USAGE);
-            return 0;
-        }
-
         key_name = argvW[2];
         for (i = 1; i < argc; i++)
         {
diff --git a/programs/reg/reg.rc b/programs/reg/reg.rc
index 479912b..6f4c0c8 100644
--- a/programs/reg/reg.rc
+++ b/programs/reg/reg.rc
@@ -33,6 +33,6 @@ STRINGTABLE
     STRING_SUCCESS, "The operation completed successfully\n"
     STRING_INVALID_KEY, "Error: Invalid key name\n"
     STRING_INVALID_CMDLINE, "Error: Invalid command line parameters\n"
-    STRING_NO_REMOTE, "Error: Unable to add keys to remote machine\n"
+    STRING_NO_REMOTE, "Error: Unable to access remote machine\n"
     STRING_CANNOT_FIND, "Error: The system was unable to find the specified registry key or value\n"
 }
-- 
2.1.1




More information about the wine-patches mailing list