[PATCH] reg: confirm before overwrite/delete

Hirofumi Katayama katayama.hirofumi.mz at gmail.com
Sat May 22 20:10:07 CDT 2010


See attachment.
-------------- next part --------------
From c132756e132effd2d7a95f5cae76d4bc6ebf4a8c Mon Sep 17 00:00:00 2001
From: Katayama Hirofumi MZ <katayama.hirofumi.mz at gmail.com>
Date: Sat, 22 May 2010 16:43:20 +0900
Subject: [PATCH] reg: confirm before overwrite/delete

---
 programs/reg/En.rc |    4 ++
 programs/reg/reg.c |   98 +++++++++++++++++++++++++++++++++++++++++++---------
 programs/reg/reg.h |    4 ++
 3 files changed, 89 insertions(+), 17 deletions(-)

diff --git a/programs/reg/En.rc b/programs/reg/En.rc
index 5b438f4..8f82172 100644
--- a/programs/reg/En.rc
+++ b/programs/reg/En.rc
@@ -34,4 +34,8 @@ STRINGTABLE
     STRING_INVALID_CMDLINE, "Error: Invalid command line parameters\n"
     STRING_NO_REMOTE, "Error: Unable to add keys to remote machine\n"
     STRING_CANNOT_FIND, "Error: The system was unable to find the specified registry key or value\n"
+    STRING_OVERWRITE, "Value %s exists, overwrite(Y/N)? "
+    STRING_DELETE_VALUE, "Delete the registry value %s (Y/N)? "
+    STRING_DELETE_ALL_VALUES, "Delete all values under the registry key %s (Y/N)? "
+    STRING_DELETE_KEY, "Permanently delete the registry key %s (Y/N)? "
 }
diff --git a/programs/reg/reg.c b/programs/reg/reg.c
index 913b831..7855fcc 100644
--- a/programs/reg/reg.c
+++ b/programs/reg/reg.c
@@ -20,47 +20,97 @@
 #include <wine/unicode.h>
 #include "reg.h"
 
-static int reg_printfW(const WCHAR *msg, ...)
+static void reg_vprintfW(const WCHAR *msg, va_list arglist)
 {
-    va_list va_args;
     int wlen;
     DWORD count, ret;
     WCHAR msg_buffer[8192];
 
-    va_start(va_args, msg);
-    vsprintfW(msg_buffer, msg, va_args);
-    va_end(va_args);
+    wvsprintfW(msg_buffer, msg, arglist);
 
     wlen = lstrlenW(msg_buffer);
     ret = WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), msg_buffer, wlen, &count, NULL);
     if (!ret)
     {
         DWORD len;
-        char  *msgA;
+        char *msgA;
 
         len = WideCharToMultiByte(GetConsoleOutputCP(), 0, msg_buffer, wlen,
             NULL, 0, NULL, NULL);
         msgA = HeapAlloc(GetProcessHeap(), 0, len * sizeof(char));
         if (!msgA)
-            return 0;
+            return;
 
         WideCharToMultiByte(GetConsoleOutputCP(), 0, msg_buffer, wlen, msgA, len,
             NULL, NULL);
         WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), msgA, len, &count, FALSE);
         HeapFree(GetProcessHeap(), 0, msgA);
     }
+}
+
+static void reg_printfW(const WCHAR *msg, ...)
+{
+    va_list arglist;
 
-    return count;
+    va_start(arglist, msg);
+    reg_vprintfW(msg, arglist);
+    va_end(arglist);
 }
 
-static int reg_message(int msg)
+static char * reg_gets(void)
 {
-    static const WCHAR formatW[] = {'%','s',0};
-    WCHAR msg_buffer[8192];
+    ULONG dwOldState;
+    ULONG cbRead;
+    char *result;
+    HANDLE hConIn;
+    static char buf[32];
+    static TCHAR conin[] = {'C','O','N','I','N','$',0};
+
+    hConIn = CreateFile(conin,
+                        GENERIC_READ | GENERIC_WRITE,
+                        FILE_SHARE_READ | FILE_SHARE_WRITE,
+                        NULL,
+                        OPEN_EXISTING,
+                        0,
+                        NULL);
+
+    GetConsoleMode(hConIn, &dwOldState);
+    SetConsoleMode(hConIn, ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT |
+                           ENABLE_ECHO_INPUT);
+
+    result = buf;
+    if (!ReadConsole(hConIn, buf, 31, &cbRead, NULL))
+        result = NULL;
+
+    if (result != NULL)
+    {
+        if (buf[cbRead - 1] == '\n')
+        {
+            if (cbRead > 1 && buf[cbRead - 2] == '\r')
+                buf[cbRead - 2] = '\0';
+            else
+                buf[cbRead - 1] = '\0';
+        }
+        else
+            buf[cbRead] = '\0';
+    }
 
-    LoadStringW(GetModuleHandleW(NULL), msg, msg_buffer,
-        sizeof(msg_buffer)/sizeof(WCHAR));
-    return reg_printfW(formatW, msg_buffer);
+    SetConsoleMode(hConIn, dwOldState);
+    CloseHandle(hConIn);
+
+    return result;
+}
+
+static void reg_message(int msg, ...)
+{
+    va_list arglist;
+    WCHAR buffer[8192];
+
+    va_start(arglist, msg);
+    LoadStringW(GetModuleHandleW(NULL), msg, buffer,
+        sizeof(buffer) / sizeof(WCHAR));
+    reg_vprintfW(buffer, arglist);
+    va_end(arglist);
 }
 
 static HKEY get_rootkey(LPWSTR key)
@@ -194,9 +244,14 @@ static int reg_add(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
 
         if (!force)
         {
-            if (RegQueryValueW(subkey,value_name,NULL,NULL)==ERROR_SUCCESS)
+            if (RegQueryValueExW(subkey,value_name,NULL,NULL,NULL,NULL) == 
+                ERROR_SUCCESS)
             {
-                /* FIXME:  Prompt for overwrite */
+                char *p;
+                reg_message(STRING_OVERWRITE, value_name);
+                p = reg_gets();
+                if (p == NULL || (p[0] != 'Y' && p[0] != 'y'))
+                    return 1;
             }
         }
 
@@ -267,7 +322,16 @@ static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
 
     if (!force)
     {
-        /* FIXME:  Prompt for delete */
+        char *p;
+        if (value_all)
+            reg_message(STRING_DELETE_ALL_VALUES, key_name);
+        else if (!value_name && !value_empty)
+            reg_message(STRING_DELETE_KEY, key_name);
+        else
+            reg_message(STRING_DELETE_VALUE, value_name);
+        p = reg_gets();
+        if (p == NULL || (p[0] != 'Y' && p[0] != 'y'))
+            return 1;
     }
 
     /* Delete subtree only if no /v* option is given */
diff --git a/programs/reg/reg.h b/programs/reg/reg.h
index c433a65..e9dcfeb 100644
--- a/programs/reg/reg.h
+++ b/programs/reg/reg.h
@@ -30,3 +30,7 @@
 #define STRING_INVALID_CMDLINE  107
 #define STRING_NO_REMOTE        108
 #define STRING_CANNOT_FIND      109
+#define STRING_OVERWRITE        110
+#define STRING_DELETE_VALUE     111
+#define STRING_DELETE_ALL_VALUES 112
+#define STRING_DELETE_KEY       113
-- 
1.6.1.3


More information about the wine-patches mailing list