--- trunk/reactos/subsys/system/cmd/copy.c 2005-07-21 04:38:26 UTC (rev 16675)
+++ trunk/reactos/subsys/system/cmd/copy.c 2005-07-21 10:03:01 UTC (rev 16676)
@@ -25,6 +25,10 @@
*
* 13-Jul-2005 (Brandon Turner) <turnerb7@msu.edu>)
* Rewrite to clean up copy and support wildcard.
+ *
+ * 20-Jul-2005 (Brandon Turner) <turnerb7@msu.edu>)
+ * Add touch syntax. "copy arp.exe+,,"
+ * Copy command is now completed.
*/
#include <precomp.h>
@@ -47,7 +51,7 @@
#define BUFF_SIZE 16384 /* 16k = max buffer size */
-int copy (TCHAR source[MAX_PATH], TCHAR dest[MAX_PATH], int append, DWORD lpdwFlags)
+int copy (TCHAR source[MAX_PATH], TCHAR dest[MAX_PATH], INT append, DWORD lpdwFlags, BOOL bTouch)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
FILETIME srctime;
@@ -63,10 +67,41 @@
TCHAR TempSrc[MAX_PATH];
TCHAR * FileName;
+
#ifdef _DEBUG
DebugPrintf (_T("checking mode\n"));
#endif
+ if(bTouch)
+ {
+ hFileSrc = CreateFile (source, GENERIC_WRITE, FILE_SHARE_READ,
+ NULL, OPEN_EXISTING, 0, NULL);
+ if (hFileSrc == INVALID_HANDLE_VALUE)
+ {
+ LoadString(CMD_ModuleHandle, STRING_COPY_ERROR1, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, source);
+ nErrorLevel = 1;
+ return 0;
+ }
+
+ FILETIME NewFileTime;
+ SYSTEMTIME CurrentTime;
+
+ GetSystemTime(&CurrentTime);
+ SystemTimeToFileTime(&CurrentTime, &NewFileTime);
+ if(SetFileTime(hFileSrc,(LPFILETIME) NULL, (LPFILETIME) NULL, &NewFileTime))
+ {
+ CloseHandle(hFileSrc);
+ return 1;
+
+ }
+ else
+ {
+ CloseHandle(hFileSrc);
+ return 0;
+ }
+ }
+
dwAttrib = GetFileAttributes (source);
hFileSrc = CreateFile (source, GENERIC_READ, FILE_SHARE_READ,
@@ -78,7 +113,7 @@
nErrorLevel = 1;
return 0;
}
-
+
#ifdef _DEBUG
DebugPrintf (_T("getting time\n"));
#endif
@@ -87,7 +122,7 @@
#ifdef _DEBUG
DebugPrintf (_T("copy: flags has %s\n"),
- *lpdwFlags & COPY_ASCII ? "ASCII" : "BINARY");
+ lpdwFlags & COPY_ASCII ? "ASCII" : "BINARY");
#endif
/* Check to see if /D or /Z are true, if so we need a middle
@@ -304,6 +339,7 @@
BOOL bAppend = FALSE;
WIN32_FIND_DATA findBuffer;
HANDLE hFile;
+ BOOL bTouch = FALSE;
/* Used when something like "copy c*.exe d*.exe" during the process of
figuring out the new name */
TCHAR tmpName[MAX_PATH] = _T("");
@@ -318,9 +354,11 @@
TCHAR * UseThisName;
/* Stores the name( i.e. blah.txt or blah*.txt) which later we might need */
TCHAR PreserveName[MAX_PATH];
- /* for CMDCOPY env */
- TCHAR *evar;
- int size;
+ /* for CMDCOPY env */
+ TCHAR *evar;
+ int size;
+ TCHAR * szTouch;
+ BOOL bDone = FALSE;
/*Show help/usage info*/
@@ -491,20 +529,21 @@
{
/* There is not enough files, there has to be at least 1 */
ConOutResPuts(STRING_ERROR_REQ_PARAM_MISSING);
+ freep (arg);
return 1;
}
if(nFiles > 2)
{
/* there is too many file names in command */
- LoadString(CMD_ModuleHandle, STRING_ERROR_TOO_MANY_PARAMETERS, szMsg, RC_STRING_MAX_SIZE);
- ConErrPrintf(szMsg,_T(""));
- nErrorLevel = 1;
+ LoadString(CMD_ModuleHandle, STRING_ERROR_TOO_MANY_PARAMETERS, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg,_T(""));
+ nErrorLevel = 1;
+ freep (arg);
return 1;
}
- if((nDes != -1) &&
- ((_tcschr (arg[nSrc], _T('+')) != NULL) ||
+ if(((_tcschr (arg[nSrc], _T('+')) != NULL) ||
(_tcschr (arg[nSrc], _T('*')) != NULL && _tcschr (arg[nDes], _T('*')) == NULL) ||
(IsExistingDirectory (arg[nSrc]) && (_tcschr (arg[nDes], _T('*')) == NULL && !IsExistingDirectory (arg[nDes])))
))
@@ -522,7 +561,6 @@
do
{
-
/* Set up the string that is the path to the destination */
if(nDes != -1)
{
@@ -551,20 +589,42 @@
the chars one at a time until it gets too + */
while(TRUE)
{
-
if(!_tcsncmp (appendPointer,_T("+"),1) || !_tcsncmp (appendPointer,_T("\0"),1))
{
/* Now that the pointer is on the + we
need to go to the start of the next filename */
if(!_tcsncmp (appendPointer,_T("+"),1))
appendPointer++;
+ else
+ bDone = TRUE;
break;
+
}
+
_tcsncat(tmpName,appendPointer,1);
appendPointer++;
+
}
/* Finish the string off with a null char */
_tcsncat(tmpName,_T("\0"),1);
+
+ if(_tcschr (arg[nSrc], _T(',')) != NULL)
+ {
+ /* Only time there is a , in the source is when they are using touch
+ Cant have a destination and can only have on ,, at the end of the string
+ Cant have more then one file name */
+ szTouch = _tcsstr (arg[nSrc], _T("+"));
+ if(_tcsncmp (szTouch,_T("+,,\0"),4) || nDes != -1)
+ {
+ LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_PARAM_FORMAT, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg,arg[nSrc]);
+ nErrorLevel = 1;
+ freep (arg);
+ return 1;
+ }
+ bTouch = TRUE;
+ bDone = TRUE;
+ }
if(_tcslen(tmpName) == 2)
{
@@ -580,6 +640,7 @@
}
else
{
+ bDone = TRUE;
if(_tcslen(arg[nSrc]) == 2 && arg[nSrc][1] == _T(':'))
{
GetRootPath(arg[nSrc],szSrcPath,MAX_PATH);
@@ -617,8 +678,8 @@
/* Get a list of all the files */
hFile = FindFirstFile (szSrcPath, &findBuffer);
+
-
/* We need to figure out what the name of the file in the is going to be */
if((szDestPath[_tcslen(szDestPath) - 1] == _T('*') && szDestPath[_tcslen(szDestPath) - 2] == _T('\\')) ||
szDestPath[_tcslen(szDestPath) - 1] == _T('\\'))
@@ -648,7 +709,6 @@
else
break;
-
do
{
/* Set the override to yes each new file */
@@ -659,7 +719,7 @@
{
ConOutFormatMessage (GetLastError(), szSrcPath);
freep (arg);
- nErrorLevel = 1;
+ nErrorLevel = 1;
return 1;
}
@@ -677,7 +737,7 @@
{
ConOutFormatMessage (GetLastError (), szSrcPath);
freep (arg);
- nErrorLevel = 1;
+ nErrorLevel = 1;
return 1;
}
/* Copy over the destination path name */
@@ -738,25 +798,25 @@
}
}
-
+
/* Build the string path to the source file */
_tcscpy(tmpSrcPath,szSrcPath);
_tcscat (tmpSrcPath, findBuffer.cFileName);
-
+
/* Check to see if the file is the same file */
- if(!_tcscmp (tmpSrcPath, tmpDestPath))
+ if(!bTouch && !_tcscmp (tmpSrcPath, tmpDestPath))
continue;
-
+
/* Handle any overriding / prompting that needs to be done */
- if((!(dwFlags & COPY_NO_PROMPT) && IsExistingFile (tmpDestPath)) || dwFlags & COPY_PROMPT)
+ if(((!(dwFlags & COPY_NO_PROMPT) && IsExistingFile (tmpDestPath)) || dwFlags & COPY_PROMPT) && !bTouch)
nOverwrite = Overwrite(tmpDestPath);
if(nOverwrite == PROMPT_NO || nOverwrite == PROMPT_BREAK)
continue;
if(nOverwrite == PROMPT_ALL || (nOverwrite == PROMPT_YES && bAppend))
dwFlags |= COPY_NO_PROMPT;
-
+
/* Tell weather the copy was successful or not */
- if(copy(tmpSrcPath,tmpDestPath, bAppend, dwFlags))
+ if(copy(tmpSrcPath,tmpDestPath, bAppend, dwFlags, bTouch))
{
nFiles++;
/* only print source name when more then one file */
@@ -769,18 +829,19 @@
/* print out the error message */
LoadString(CMD_ModuleHandle, STRING_COPY_ERROR3, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg);
- nErrorLevel = 1;
+ ConOutFormatMessage (GetLastError(), szSrcPath);
+ nErrorLevel = 1;
}
-
+
/* Loop through all wildcard files */
}while(FindNextFile (hFile, &findBuffer));
/* Loop through all files in src string with a + */
- }while(_tcsncmp (appendPointer,_T("\0"),1));
-
+ }while(!bDone);
+
/* print out the number of files copied */
LoadString(CMD_ModuleHandle, STRING_COPY_FILE, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, nFiles);
-
+
CloseHandle(hFile);
freep (arg);
return 0;