[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