Jason Edmeades : xcopy: Add support for /P (Prompt).

Alexandre Julliard julliard at wine.codeweavers.com
Fri Mar 30 06:20:32 CDT 2007


Module: wine
Branch: master
Commit: 60e79adb53b78d6e78d90fb191ca62cd78fab13a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=60e79adb53b78d6e78d90fb191ca62cd78fab13a

Author: Jason Edmeades <us at edmeades.me.uk>
Date:   Thu Mar 29 22:21:09 2007 +0100

xcopy: Add support for /P (Prompt).

---

 programs/xcopy/xcopy.c |   26 +++++++++++++++++++++++++-
 1 files changed, 25 insertions(+), 1 deletions(-)

diff --git a/programs/xcopy/xcopy.c b/programs/xcopy/xcopy.c
index 97348dd..0539716 100644
--- a/programs/xcopy/xcopy.c
+++ b/programs/xcopy/xcopy.c
@@ -54,6 +54,7 @@
 #define OPT_REPLACEREAD  0x00000800
 #define OPT_COPYHIDSYS   0x00001000
 #define OPT_IGNOREERRORS 0x00002000
+#define OPT_SRCPROMPT    0x00004000
 
 #define MAXSTRING 8192
 
@@ -145,7 +146,10 @@ int main (int argc, char *argv[])
                 return RC_INITERROR;
             }
         } else {
-            /* Process all the switch options */
+            /* Process all the switch options
+                 Note: Windows docs say /P prompts when dest is created
+                       but tests show it is done for each src file
+                       regardless of the destination                   */
             switch (toupper(argvW[0][1])) {
             case 'I': flags |= OPT_ASSUMEDIR;     break;
             case 'S': flags |= OPT_RECURSIVE;     break;
@@ -161,6 +165,7 @@ int main (int argc, char *argv[])
             case 'R': flags |= OPT_REPLACEREAD;   break;
             case 'H': flags |= OPT_COPYHIDSYS;    break;
             case 'C': flags |= OPT_IGNOREERRORS;  break;
+            case 'P': flags |= OPT_SRCPROMPT;     break;
             case '-': if (toupper(argvW[0][2])=='Y')
                           flags &= ~OPT_NOPROMPT; break;
             default:
@@ -457,6 +462,25 @@ static int XCOPY_DoCopy(WCHAR *srcstem, WCHAR *srcspec,
                 }
             }
 
+            /* Prompt each file if necessary */
+            if (!skipFile && (flags & OPT_SRCPROMPT)) {
+                DWORD count;
+                char  answer[10];
+                BOOL  answered = FALSE;
+
+                while (!answered) {
+                    printf("%S? (Yes|No)\n", copyFrom);
+                    ReadFile (GetStdHandle(STD_INPUT_HANDLE), answer, sizeof(answer),
+                              &count, NULL);
+
+                    answered = TRUE;
+                    if (toupper(answer[0]) == 'N')
+                        skipFile = TRUE;
+                    else if (toupper(answer[0]) != 'Y')
+                        answered = FALSE;
+                }
+            }
+
             /* See if file exists */
             destAttribs = GetFileAttributesW(copyTo);
             if (!skipFile &&




More information about the wine-cvs mailing list