Author: cfinck Date: Fri Nov 23 19:21:10 2007 New Revision: 30698
URL: http://svn.reactos.org/svn/reactos?rev=30698&view=rev Log: [FORMATTING] - Fix the indentation mess - Fix some typos in comments
No code changes
Modified: trunk/reactos/base/shell/cmd/copy.c
Modified: trunk/reactos/base/shell/cmd/copy.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/copy.c?rev=3... ============================================================================== --- trunk/reactos/base/shell/cmd/copy.c (original) +++ trunk/reactos/base/shell/cmd/copy.c Fri Nov 23 19:21:10 2007 @@ -37,838 +37,817 @@
enum { - COPY_ASCII = 0x001, /* /A */ - COPY_DECRYPT = 0x004, /* /D */ - COPY_VERIFY = 0x008, /* /V : Dummy, Never will be Impleneted */ - COPY_SHORTNAME = 0x010, /* /N : Dummy, Never will be Impleneted */ - COPY_NO_PROMPT = 0x020, /* /Y */ - COPY_PROMPT = 0x040, /* /-Y */ - COPY_RESTART = 0x080, /* /Z */ - COPY_BINARY = 0x100, /* /B */ + COPY_ASCII = 0x001, /* /A */ + COPY_DECRYPT = 0x004, /* /D */ + COPY_VERIFY = 0x008, /* /V : Dummy, Never will be Impleneted */ + COPY_SHORTNAME = 0x010, /* /N : Dummy, Never will be Impleneted */ + COPY_NO_PROMPT = 0x020, /* /Y */ + COPY_PROMPT = 0x040, /* /-Y */ + COPY_RESTART = 0x080, /* /Z */ + COPY_BINARY = 0x100, /* /B */ };
INT copy (TCHAR source[MAX_PATH], - TCHAR dest[MAX_PATH], - INT append, - DWORD lpdwFlags, - BOOL bTouch) + TCHAR dest[MAX_PATH], + INT append, + DWORD lpdwFlags, + BOOL bTouch) { - TCHAR szMsg[RC_STRING_MAX_SIZE]; - FILETIME srctime,NewFileTime; - HANDLE hFileSrc; - HANDLE hFileDest; - LPBYTE buffer; - DWORD dwAttrib; - DWORD dwRead; - DWORD dwWritten; - BOOL bEof = FALSE; - TCHAR TrueDest[MAX_PATH]; - TCHAR TempSrc[MAX_PATH]; - TCHAR * FileName; - SYSTEMTIME CurrentTime; - - /* Check Breaker */ - if(CheckCtrlBreak(BREAK_INPUT)) - return 0; - -#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); + TCHAR szMsg[RC_STRING_MAX_SIZE]; + FILETIME srctime,NewFileTime; + HANDLE hFileSrc; + HANDLE hFileDest; + LPBYTE buffer; + DWORD dwAttrib; + DWORD dwRead; + DWORD dwWritten; + BOOL bEof = FALSE; + TCHAR TrueDest[MAX_PATH]; + TCHAR TempSrc[MAX_PATH]; + TCHAR * FileName; + SYSTEMTIME CurrentTime; + + /* Check Breaker */ + if(CheckCtrlBreak(BREAK_INPUT)) + return 0; + +#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; + } + + GetSystemTime(&CurrentTime); + SystemTimeToFileTime(&CurrentTime, &NewFileTime); + if(SetFileTime(hFileSrc,(LPFILETIME) NULL, (LPFILETIME) NULL, &NewFileTime)) + { + CloseHandle(hFileSrc); + nErrorLevel = 1; + return 1; + + } + else + { + CloseHandle(hFileSrc); + return 0; + } + } + + dwAttrib = GetFileAttributes (source); + + hFileSrc = CreateFile (source, GENERIC_READ, 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; - } - - GetSystemTime(&CurrentTime); - SystemTimeToFileTime(&CurrentTime, &NewFileTime); - if(SetFileTime(hFileSrc,(LPFILETIME) NULL, (LPFILETIME) NULL, &NewFileTime)) - { - CloseHandle(hFileSrc); - nErrorLevel = 1; - return 1; - - } - else - { - CloseHandle(hFileSrc); - return 0; - } - } - - dwAttrib = GetFileAttributes (source); - - hFileSrc = CreateFile (source, GENERIC_READ, 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); + return 0; + } + +#ifdef _DEBUG + DebugPrintf (_T("getting time\n")); +#endif + + GetFileTime (hFileSrc, &srctime, NULL, NULL); + +#ifdef _DEBUG + DebugPrintf (_T("copy: flags has %s\n"), + lpdwFlags & COPY_ASCII ? "ASCII" : "BINARY"); +#endif + + /* Check to see if /D or /Z are true, if so we need a middle + man to copy the file too to allow us to use CopyFileEx later */ + if(lpdwFlags & COPY_DECRYPT) + { + GetEnvironmentVariable(_T("TEMP"),TempSrc,MAX_PATH); + _tcscat(TempSrc,_T("\")); + FileName = _tcsrchr(source,_T('\')); + FileName++; + _tcscat(TempSrc,FileName); + /* This is needed to be on the end to prevent an error + if the user did "copy /D /Z foo bar then it would be copied + too %TEMP%\foo here and when %TEMP%\foo when it sets it up + for COPY_RESTART, this would mean it is copying to itself + which would error when it tried to open the handles for ReadFile + and WriteFile */ + _tcscat(TempSrc,_T(".decrypt")); + if(!CopyFileEx(source, TempSrc, NULL, NULL, FALSE, COPY_FILE_ALLOW_DECRYPTED_DESTINATION)) + { + nErrorLevel = 1; + return 0; + } + _tcscpy(source, TempSrc); + } + + + if(lpdwFlags & COPY_RESTART) + { + _tcscpy(TrueDest, dest); + GetEnvironmentVariable(_T("TEMP"),dest,MAX_PATH); + _tcscat(dest,_T("\")); + FileName = _tcsrchr(TrueDest,_T('\')); + FileName++; + _tcscat(dest,FileName); + } + + + if (!IsExistingFile (dest)) + { +#ifdef _DEBUG + DebugPrintf (_T("opening/creating\n")); +#endif + hFileDest = + CreateFile (dest, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); + } + else if (!append) + { +#ifdef _DEBUG + DebugPrintf (_T("SetFileAttributes (%s, FILE_ATTRIBUTE_NORMAL);\n"), dest); +#endif + SetFileAttributes (dest, FILE_ATTRIBUTE_NORMAL); + +#ifdef _DEBUG + DebugPrintf (_T("DeleteFile (%s);\n"), dest); +#endif + DeleteFile (dest); + + hFileDest = CreateFile (dest, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); + } + else + { + LONG lFilePosHigh = 0; + + if (!_tcscmp (dest, source)) + { + CloseHandle (hFileSrc); + return 0; + } + +#ifdef _DEBUG + DebugPrintf (_T("opening/appending\n")); +#endif + SetFileAttributes (dest, FILE_ATTRIBUTE_NORMAL); + + hFileDest = + CreateFile (dest, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); + + /* Move to end of file to start writing */ + SetFilePointer (hFileDest, 0, &lFilePosHigh,FILE_END); + } + + + if (hFileDest == INVALID_HANDLE_VALUE) + { + CloseHandle (hFileSrc); + ConOutResPuts(STRING_ERROR_PATH_NOT_FOUND); nErrorLevel = 1; - return 0; - } - -#ifdef _DEBUG - DebugPrintf (_T("getting time\n")); -#endif - - GetFileTime (hFileSrc, &srctime, NULL, NULL); - -#ifdef _DEBUG - DebugPrintf (_T("copy: flags has %s\n"), - lpdwFlags & COPY_ASCII ? "ASCII" : "BINARY"); -#endif - - /* Check to see if /D or /Z are true, if so we need a middle - man to copy the file too to allow us to use CopyFileEx later */ - if(lpdwFlags & COPY_DECRYPT) - { - GetEnvironmentVariable(_T("TEMP"),TempSrc,MAX_PATH); - _tcscat(TempSrc,_T("\")); - FileName = _tcsrchr(source,_T('\')); - FileName++; - _tcscat(TempSrc,FileName); - /* This is needed to be on the end to prevent an error - if the user did "copy /D /Z foo bar then it would be copied - too %TEMP%\foo here and when %TEMP%\foo when it sets it up - for COPY_RESTART, this would mean it is copying to itself - which would error when it tried to open the handles for ReadFile - and WriteFile */ - _tcscat(TempSrc,_T(".decrypt")); - if(!CopyFileEx(source, TempSrc, NULL, NULL, FALSE, COPY_FILE_ALLOW_DECRYPTED_DESTINATION)) - { - nErrorLevel = 1; - return 0; - } - _tcscpy(source, TempSrc); - } - - - if(lpdwFlags & COPY_RESTART) - { - _tcscpy(TrueDest, dest); - GetEnvironmentVariable(_T("TEMP"),dest,MAX_PATH); - _tcscat(dest,_T("\")); - FileName = _tcsrchr(TrueDest,_T('\')); - FileName++; - _tcscat(dest,FileName); - } - - - if (!IsExistingFile (dest)) - { -#ifdef _DEBUG - DebugPrintf (_T("opening/creating\n")); -#endif - hFileDest = - CreateFile (dest, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); - } - else if (!append) - { -#ifdef _DEBUG - DebugPrintf (_T("SetFileAttributes (%s, FILE_ATTRIBUTE_NORMAL);\n"), dest); -#endif - SetFileAttributes (dest, FILE_ATTRIBUTE_NORMAL); - -#ifdef _DEBUG - DebugPrintf (_T("DeleteFile (%s);\n"), dest); -#endif - DeleteFile (dest); - - hFileDest = CreateFile (dest, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); - } - else - { - LONG lFilePosHigh = 0; - - if (!_tcscmp (dest, source)) - { - CloseHandle (hFileSrc); - return 0; - } - -#ifdef _DEBUG - DebugPrintf (_T("opening/appending\n")); -#endif - SetFileAttributes (dest, FILE_ATTRIBUTE_NORMAL); - - hFileDest = - CreateFile (dest, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); - - /* Move to end of file to start writing */ - SetFilePointer (hFileDest, 0, &lFilePosHigh,FILE_END); - } - - - if (hFileDest == INVALID_HANDLE_VALUE) - { - CloseHandle (hFileSrc); - ConOutResPuts(STRING_ERROR_PATH_NOT_FOUND); + return 0; + } + + /* A page-aligned buffer usually give more speed */ + buffer = (LPBYTE)VirtualAlloc(NULL, BUFF_SIZE, MEM_COMMIT, PAGE_READWRITE); + if (buffer == NULL) + { + CloseHandle (hFileDest); + CloseHandle (hFileSrc); + ConOutResPuts(STRING_ERROR_OUT_OF_MEMORY); nErrorLevel = 1; - return 0; - } - - /* A page-aligned buffer usually give more speed */ - buffer = (LPBYTE)VirtualAlloc(NULL, BUFF_SIZE, MEM_COMMIT, PAGE_READWRITE); - if (buffer == NULL) - { - CloseHandle (hFileDest); - CloseHandle (hFileSrc); - ConOutResPuts(STRING_ERROR_OUT_OF_MEMORY); - nErrorLevel = 1; - return 0; - } - - do - { - - ReadFile (hFileSrc, buffer, BUFF_SIZE, &dwRead, NULL); - if (lpdwFlags & COPY_ASCII) - { - LPBYTE pEof = memchr(buffer, 0x1A, dwRead); - if (pEof != NULL) - { - bEof = TRUE; - dwRead = pEof-buffer+1; - break; - } - } - - if (dwRead == 0) - break; - - WriteFile (hFileDest, buffer, dwRead, &dwWritten, NULL); - if (dwWritten != dwRead || CheckCtrlBreak(BREAK_INPUT)) - { - ConOutResPuts(STRING_COPY_ERROR3); - - cmd_free (buffer); - CloseHandle (hFileDest); - CloseHandle (hFileSrc); - nErrorLevel = 1; - return 0; - } - } - while (!bEof); - -#ifdef _DEBUG - DebugPrintf (_T("setting time\n")); -#endif - SetFileTime (hFileDest, &srctime, NULL, NULL); - - if ((lpdwFlags & COPY_ASCII) && !bEof) - { - /* we're dealing with ASCII files! */ - buffer[0] = 0x1A; -#ifdef _DEBUG - DebugPrintf (_T("appending ^Z\n")); -#endif - WriteFile (hFileDest, buffer, sizeof(CHAR), &dwWritten, NULL); - } - - VirtualFree (buffer, 0, MEM_RELEASE); - CloseHandle (hFileDest); - CloseHandle (hFileSrc); - -#ifdef _DEBUG - DebugPrintf (_T("setting mode\n")); -#endif - SetFileAttributes (dest, dwAttrib); - - /* Now finish off the copy if needed with CopyFileEx */ - if(lpdwFlags & COPY_RESTART) - { - if(!CopyFileEx(dest, TrueDest, NULL, NULL, FALSE, COPY_FILE_RESTARTABLE)) - { - nErrorLevel = 1; - DeleteFile(dest); - return 0; - } - /* Take care of file in the temp folder */ - DeleteFile(dest); - - } - - if(lpdwFlags & COPY_DECRYPT) - DeleteFile(TempSrc); - - return 1; + return 0; + } + + do + { + ReadFile (hFileSrc, buffer, BUFF_SIZE, &dwRead, NULL); + if (lpdwFlags & COPY_ASCII) + { + LPBYTE pEof = memchr(buffer, 0x1A, dwRead); + if (pEof != NULL) + { + bEof = TRUE; + dwRead = pEof-buffer+1; + break; + } + } + + if (dwRead == 0) + break; + + WriteFile (hFileDest, buffer, dwRead, &dwWritten, NULL); + if (dwWritten != dwRead || CheckCtrlBreak(BREAK_INPUT)) + { + ConOutResPuts(STRING_COPY_ERROR3); + + cmd_free (buffer); + CloseHandle (hFileDest); + CloseHandle (hFileSrc); + nErrorLevel = 1; + return 0; + } + } + while (!bEof); + +#ifdef _DEBUG + DebugPrintf (_T("setting time\n")); +#endif + SetFileTime (hFileDest, &srctime, NULL, NULL); + + if ((lpdwFlags & COPY_ASCII) && !bEof) + { + /* we're dealing with ASCII files! */ + buffer[0] = 0x1A; +#ifdef _DEBUG + DebugPrintf (_T("appending ^Z\n")); +#endif + WriteFile (hFileDest, buffer, sizeof(CHAR), &dwWritten, NULL); + } + + VirtualFree (buffer, 0, MEM_RELEASE); + CloseHandle (hFileDest); + CloseHandle (hFileSrc); + +#ifdef _DEBUG + DebugPrintf (_T("setting mode\n")); +#endif + SetFileAttributes (dest, dwAttrib); + + /* Now finish off the copy if needed with CopyFileEx */ + if(lpdwFlags & COPY_RESTART) + { + if(!CopyFileEx(dest, TrueDest, NULL, NULL, FALSE, COPY_FILE_RESTARTABLE)) + { + nErrorLevel = 1; + DeleteFile(dest); + return 0; + } + /* Take care of file in the temp folder */ + DeleteFile(dest); + + } + + if(lpdwFlags & COPY_DECRYPT) + DeleteFile(TempSrc); + + return 1; }
static INT CopyOverwrite (LPTSTR fn) { - /*ask the user if they want to override*/ - TCHAR szMsg[RC_STRING_MAX_SIZE]; - INT res; - LoadString(CMD_ModuleHandle, STRING_COPY_HELP1, szMsg, RC_STRING_MAX_SIZE); - ConOutPrintf(szMsg,fn); - res = FilePromptYNA (_T("")); - return res; + /*ask the user if they want to override*/ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + INT res; + LoadString(CMD_ModuleHandle, STRING_COPY_HELP1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg,fn); + res = FilePromptYNA (_T("")); + return res; }
INT cmd_copy (LPTSTR cmd, LPTSTR param) { - TCHAR szMsg[RC_STRING_MAX_SIZE]; - LPTSTR *arg; - INT argc, i, nFiles, nOverwrite = 0, nSrc = -1, nDes = -1; - /* this is the path up to the folder of the src and dest ie C:\windows\ */ - TCHAR szDestPath[MAX_PATH]; - TCHAR szSrcPath[MAX_PATH]; - DWORD dwFlags = 0; - /* If this is the type of copy where we are adding files */ - 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(""); - /* Pointer to keep track of how far through the append input(file1+file2+file3) we are */ - TCHAR * appendPointer = _T("\0"); - /* The full path to src and dest. This has drive letter, folders, and filename */ - TCHAR tmpDestPath[MAX_PATH]; - TCHAR tmpSrcPath[MAX_PATH]; - /* A bool on weather or not the destination name will be taking from the input */ - BOOL bSrcName = FALSE; - /* Seems like a waste but it is a pointer used to copy from input to PreserveName */ - 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; - TCHAR * szTouch; - BOOL bDone = FALSE; - - - /*Show help/usage info*/ - if (!_tcsncmp (param, _T("/?"), 2)) - { - ConOutResPaging(TRUE, STRING_COPY_HELP2); - return 0; - } - - nErrorLevel = 0; - - /* Get the envor value if it exists */ - evar = cmd_alloc(512 * sizeof(TCHAR)); - if (evar==NULL) size = 0; - else - { - size = GetEnvironmentVariable (_T("COPYCMD"), evar, 512); - } - if (size > 512) - { - evar = cmd_realloc(evar,size * sizeof(TCHAR) ); - if (evar!=NULL) - { - size = GetEnvironmentVariable (_T("COPYCMD"), evar, size); - } + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LPTSTR *arg; + INT argc, i, nFiles, nOverwrite = 0, nSrc = -1, nDes = -1; + /* this is the path up to the folder of the src and dest ie C:\windows\ */ + TCHAR szDestPath[MAX_PATH]; + TCHAR szSrcPath[MAX_PATH]; + DWORD dwFlags = 0; + /* If this is the type of copy where we are adding files */ + 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(""); + /* Pointer to keep track of how far through the append input(file1+file2+file3) we are */ + TCHAR * appendPointer = _T("\0"); + /* The full path to src and dest. This has drive letter, folders, and filename */ + TCHAR tmpDestPath[MAX_PATH]; + TCHAR tmpSrcPath[MAX_PATH]; + /* A bool on weather or not the destination name will be taking from the input */ + BOOL bSrcName = FALSE; + /* Seems like a waste but it is a pointer used to copy from input to PreserveName */ + 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; + TCHAR * szTouch; + BOOL bDone = FALSE; + + + /* Show help/usage info */ + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE, STRING_COPY_HELP2); + return 0; + } + + nErrorLevel = 0; + + /* Get the envor value if it exists */ + evar = cmd_alloc(512 * sizeof(TCHAR)); + if (evar == NULL) + size = 0; else - { - size=0; - } - } - - /* check see if we did get any env variable */ - if (size !=0) - { - int t=0; - /* scan and set the flags */ - for (t=0;t<size;t++) - { - if (_tcsncicmp(_T("/A"),&evar[t],2)==0) - { - dwFlags |=COPY_ASCII; - t++; - } - - else if (_tcsncicmp(_T("/B"),&evar[t],2)==0) - { - dwFlags |= COPY_BINARY; - t++; - } - else if (_tcsncicmp(_T("/D"),&evar[t],2)==0) - { - dwFlags |= COPY_DECRYPT; - t++; - } - - else if (_tcsncicmp(_T("/V"),&evar[t],2)==0) - { - dwFlags |= COPY_VERIFY; - t++; - } - - else if (_tcsncicmp(_T("/N"),&evar[t],2)==0) - { - dwFlags |= COPY_SHORTNAME; - t++; - } - - else if (_tcsncicmp(_T("/Y"),&evar[t],2)==0) - { + size = GetEnvironmentVariable (_T("COPYCMD"), evar, 512); + + if (size > 512) + { + evar = cmd_realloc(evar,size * sizeof(TCHAR) ); + if (evar!=NULL) + size = GetEnvironmentVariable (_T("COPYCMD"), evar, size); + else + size=0; + } + + /* check see if we did get any env variable */ + if (size !=0) + { + int t=0; + /* scan and set the flags */ + for (t=0;t<size;t++) + { + if (_tcsncicmp(_T("/A"),&evar[t],2) == 0) + { + dwFlags |=COPY_ASCII; + t++; + } + else if (_tcsncicmp(_T("/B"),&evar[t],2) == 0) + { + dwFlags |= COPY_BINARY; + t++; + } + else if (_tcsncicmp(_T("/D"),&evar[t],2) == 0) + { + dwFlags |= COPY_DECRYPT; + t++; + } + else if (_tcsncicmp(_T("/V"),&evar[t],2) == 0) + { + dwFlags |= COPY_VERIFY; + t++; + } + else if (_tcsncicmp(_T("/N"),&evar[t],2) == 0) + { + dwFlags |= COPY_SHORTNAME; + t++; + } + else if (_tcsncicmp(_T("/Y"),&evar[t],2) == 0) + { + dwFlags |= COPY_NO_PROMPT; + t++; + } + else if (_tcsncicmp(_T("/-Y"),&evar[t],3) == 0) + { + dwFlags |= COPY_PROMPT; + t+=2; + } + else if (_tcsncicmp(_T("/Z"),&evar[t],2) == 0) + { + dwFlags |= COPY_PROMPT; + t++; + } + } + } + cmd_free(evar); + + + /* Split the user input into array */ + arg = split (param, &argc, FALSE); + nFiles = argc; + + + /* Read switches and count files */ + for (i = 0; i < argc; i++) + { + if (*arg[i] == _T('/')) + { + if (_tcslen(arg[i]) >= 2) + { + switch (_totupper(arg[i][1])) + { + case _T('A'): + dwFlags |= COPY_ASCII; + break; + + case _T('B'): + dwFlags |= COPY_BINARY; + break; + + case _T('D'): + dwFlags |= COPY_DECRYPT; + break; + + case _T('V'): + dwFlags |= COPY_VERIFY; + break; + + case _T('N'): + dwFlags |= COPY_SHORTNAME; + break; + + case _T('Y'): + dwFlags |= COPY_NO_PROMPT; + dwFlags &= ~COPY_PROMPT; + break; + + case _T('-'): + if(_tcslen(arg[i]) >= 3) + if(_totupper(arg[i][2]) == _T('Y')) + { + dwFlags &= ~COPY_NO_PROMPT; + dwFlags |= COPY_PROMPT; + } + + break; + + case _T('Z'): + dwFlags |= COPY_RESTART; + break; + + default: + /* Invalid switch */ + LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_SWITCH, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, _totupper(arg[i][1])); + nErrorLevel = 1; + return 1; + break; + } + } + /* If it was a switch, subtract from total arguments */ + nFiles--; + } + else + { + /* If it isn't a switch then it is the source or destination */ + if(nSrc == -1) + { + nSrc = i; + } + else if(*arg[i] == _T('+') || *arg[i] == _T(',')) + { + /* Add these onto the source string + this way we can do all checks + directly on source string later on */ + _tcscat(arg[nSrc],arg[i]); + nFiles--; + } + else if(nDes == -1) + { + nDes = i; + } + } + } + + /* keep quiet within batch files */ + if (bc != NULL) + { dwFlags |= COPY_NO_PROMPT; - t++; - } - - else if (_tcsncicmp(_T("/-Y"),&evar[t],3)==0) - { - dwFlags |= COPY_PROMPT; - t+=2; - } - - else if (_tcsncicmp(_T("/Z"),&evar[t],2)==0) - { - dwFlags |= COPY_PROMPT; - t++; - } - } - } - cmd_free(evar); - - - /*Split the user input into array*/ - arg = split (param, &argc, FALSE); - nFiles = argc; - - - /*Read switches and count files*/ - for (i = 0; i < argc; i++) - { - if (*arg[i] == _T('/')) - { - if (_tcslen(arg[i]) >= 2) - { - switch (_totupper(arg[i][1])) - { - - case _T('A'): - dwFlags |= COPY_ASCII; - break; - - case _T('B'): - dwFlags |= COPY_BINARY; - break; - - case _T('D'): - dwFlags |= COPY_DECRYPT; - break; - - case _T('V'): - dwFlags |= COPY_VERIFY; - break; - - case _T('N'): - dwFlags |= COPY_SHORTNAME; - break; - - case _T('Y'): - dwFlags |= COPY_NO_PROMPT; - dwFlags &= ~COPY_PROMPT; - break; - - case _T('-'): - if(_tcslen(arg[i]) >= 3) - if(_totupper(arg[i][2]) == _T('Y')) - { - dwFlags &= ~COPY_NO_PROMPT; - dwFlags |= COPY_PROMPT; - } - - break; - - case _T('Z'): - dwFlags |= COPY_RESTART; - break; - - default: - /* invaild switch */ - LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_SWITCH, szMsg, RC_STRING_MAX_SIZE); - ConOutPrintf(szMsg, _totupper(arg[i][1])); - nErrorLevel = 1; - return 1; - break; - } - } - /*If it was a switch, subtract from total arguments*/ - nFiles--; - } - else - { - /*if it isnt a switch then it is the source or destination*/ - if(nSrc == -1) - { - nSrc = i; - } - else if(*arg[i] == _T('+') || *arg[i] == _T(',')) - { - /* Add these onto the source string - this way we can do all checks - directly on source string later on */ - _tcscat(arg[nSrc],arg[i]); - nFiles--; - } - else if(nDes == -1) - { - nDes = i; - } - - } - } - - /* keep quiet within batch files */ - if (bc != NULL) - { - dwFlags |= COPY_NO_PROMPT; - dwFlags &= ~COPY_PROMPT; - } - - if(nFiles < 1) - { - /* 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 */ + dwFlags &= ~COPY_PROMPT; + } + + if(nFiles < 1) + { + /* There are not enough files, there has to be at least 1 */ + ConOutResPuts(STRING_ERROR_REQ_PARAM_MISSING); + freep (arg); + return 1; + } + + if(nFiles > 2) + { + /* There are too many file names in command */ LoadString(CMD_ModuleHandle, STRING_ERROR_TOO_MANY_PARAMETERS, szMsg, RC_STRING_MAX_SIZE); - ConErrPrintf(szMsg,_T("")); + ConErrPrintf(szMsg,_T("")); nErrorLevel = 1; - freep (arg); - return 1; - } - - 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]))) - )) - { - /* There is a + in the source filename, this means - that there is more then one file being put into - one file. */ - bAppend = TRUE; - if(_tcschr (arg[nSrc], _T('+')) != NULL) - appendPointer = arg[nSrc]; - } - - /* Reusing the number of files variable */ - nFiles = 0; - - do - { - /* Set up the string that is the path to the destination */ - if(nDes != -1) - { - if(_tcslen(arg[nDes]) == 2 && arg[nDes][1] == _T(':')) - { - GetRootPath(arg[nDes],szDestPath,MAX_PATH); - } - else - /* If the user entered two file names then form the full string path*/ - GetFullPathName (arg[nDes], MAX_PATH, szDestPath, NULL); - - } - else - { - /* If no destination was entered then just use - the current directory as the destination */ - GetCurrentDirectory (MAX_PATH, szDestPath); - } - - - /* Get the full string of the path to the source file*/ - if(_tcschr (arg[nSrc], _T('+')) != NULL) - { - _tcscpy(tmpName,_T("\0")); - /* Loop through the source file name and copy all - 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) - { - if(tmpName[1] == _T(':')) - { - - GetRootPath(tmpName,szSrcPath,MAX_PATH); - } - } - else - /* Get the full path to first file in the string of file names */ - GetFullPathName (tmpName, MAX_PATH, szSrcPath, NULL); - } - else - { - bDone = TRUE; - if(_tcslen(arg[nSrc]) == 2 && arg[nSrc][1] == _T(':')) - { - GetRootPath(arg[nSrc],szSrcPath,MAX_PATH); - } - else - /* Get the full path of the source file */ - GetFullPathName (arg[nSrc], MAX_PATH, szSrcPath, NULL); - - } - - /* From this point on, we can assume that the shortest path is 3 letters long - and that would be [DriveLetter]:\ */ - - /* If there is no * in the path name and it is a folder - then we will need to add a wildcard to the pathname - so FindFirstFile comes up with all the files in that - folder */ - if(_tcschr (szSrcPath, _T('*')) == NULL && - IsExistingDirectory (szSrcPath)) - { - /* If it doesnt have a \ at the end already then on needs to be added */ - if(szSrcPath[_tcslen(szSrcPath) - 1] != _T('\')) - _tcscat (szSrcPath, _T("\")); - /* Add a wildcard after the \ */ - _tcscat (szSrcPath, _T("*")); - } - /* Make sure there is an ending slash to the path if the dest is a folder */ - if(_tcschr (szDestPath, _T('*')) == NULL && - IsExistingDirectory(szDestPath)) - { - if(szDestPath[_tcslen(szDestPath) - 1] != _T('\')) - _tcscat (szDestPath, _T("\")); - } - - - /* 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('\')) - { - /* In this case we will be using the same name as the source file - for the destination file because destination is a folder */ - bSrcName = TRUE; - } - else - { - /* Save the name the user entered */ - UseThisName = _tcsrchr(szDestPath,_T('\')); - UseThisName++; - _tcscpy(PreserveName,UseThisName); - } - - /* Strip the paths back to the folder they are in */ - for(i = (_tcslen(szSrcPath) - 1); i > -1; i--) - if(szSrcPath[i] != _T('\')) - szSrcPath[i] = _T('\0'); - else - break; - - for(i = (_tcslen(szDestPath) - 1); i > -1; i--) - if(szDestPath[i] != _T('\')) - szDestPath[i] = _T('\0'); - else - break; - - do - { - /* Check Breaker */ - if(CheckCtrlBreak(BREAK_INPUT)) - { - freep(arg); - return 1; - } - /* Set the override to yes each new file */ - nOverwrite = 1; - - /* If it couldnt open the file handle, print out the error */ - if(hFile == INVALID_HANDLE_VALUE) - { - ConOutFormatMessage (GetLastError(), szSrcPath); - freep (arg); - nErrorLevel = 1; - return 1; - } - - /* Ignore the . and .. files */ - if(!_tcscmp (findBuffer.cFileName, _T(".")) || - !_tcscmp (findBuffer.cFileName, _T(".."))|| - findBuffer.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - continue; - - /* Copy the base folder over to a tmp string */ - _tcscpy(tmpDestPath,szDestPath); - - /* Can't put a file into a folder that isnt there */ - if(!IsExistingDirectory(szDestPath)) - { - ConOutFormatMessage (GetLastError (), szSrcPath); - freep (arg); - nErrorLevel = 1; - return 1; - } - /* Copy over the destination path name */ - if(bSrcName) - _tcscat (tmpDestPath, findBuffer.cFileName); - else - { - /* If there is no wildcard you can use the name the user entered */ - if(_tcschr (PreserveName, _T('*')) == NULL) - { - _tcscat (tmpDestPath, PreserveName); - } - else - { - /* The following lines of copy were written by someone else - (most likely Eric Khoul) and it was taken from ren.c */ - LPTSTR p,q,r; - TCHAR DoneFile[MAX_PATH]; - /* build destination file name */ - p = findBuffer.cFileName; - q = PreserveName; - r = DoneFile; - while(*q != 0) - { - if (*q == '*') - { - q++; - while (*p != 0 && *p != *q) - { - *r = *p; - p++; - r++; - } - } - else if (*q == '?') - { - q++; - if (*p != 0) - { - *r = *p; - p++; - r++; - } - } - else - { - *r = *q; - if (*p != 0) - p++; - q++; - r++; - } - } - *r = 0; - /* Add the filename to the tmp string path */ - _tcscat (tmpDestPath, DoneFile); - - } - } - - - /* 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(!bTouch && !_tcscmp (tmpSrcPath, tmpDestPath)) - { - LoadString(CMD_ModuleHandle, STRING_COPY_ERROR2, szMsg, RC_STRING_MAX_SIZE); - ConOutPrintf(szMsg); + freep (arg); + return 1; + } + + 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]))) + )) + { + /* There is a + in the source filename, this means + that there is more then one file being put into + one file. */ + bAppend = TRUE; + if(_tcschr (arg[nSrc], _T('+')) != NULL) + appendPointer = arg[nSrc]; + } + + /* Reusing the number of files variable */ + nFiles = 0; + + do + { + /* Set up the string that is the path to the destination */ + if(nDes != -1) + { + if(_tcslen(arg[nDes]) == 2 && arg[nDes][1] == _T(':')) + { + GetRootPath(arg[nDes],szDestPath,MAX_PATH); + } + else + /* If the user entered two file names then form the full string path */ + GetFullPathName (arg[nDes], MAX_PATH, szDestPath, NULL); + } + else + { + /* If no destination was entered then just use + the current directory as the destination */ + GetCurrentDirectory (MAX_PATH, szDestPath); + } + + /* Get the full string of the path to the source file */ + if(_tcschr (arg[nSrc], _T('+')) != NULL) + { + _tcscpy(tmpName,_T("\0")); + /* Loop through the source file name and copy all + 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) + { + if(tmpName[1] == _T(':')) + { + GetRootPath(tmpName,szSrcPath,MAX_PATH); + } + } + else + /* Get the full path to first file in the string of file names */ + GetFullPathName (tmpName, MAX_PATH, szSrcPath, NULL); + } + else + { + bDone = TRUE; + if(_tcslen(arg[nSrc]) == 2 && arg[nSrc][1] == _T(':')) + { + GetRootPath(arg[nSrc],szSrcPath,MAX_PATH); + } + else + /* Get the full path of the source file */ + GetFullPathName (arg[nSrc], MAX_PATH, szSrcPath, NULL); + } + + /* From this point on, we can assume that the shortest path is 3 letters long + and that would be [DriveLetter]:\ */ + + /* If there is no * in the path name and it is a folder + then we will need to add a wildcard to the pathname + so FindFirstFile comes up with all the files in that + folder */ + if(_tcschr (szSrcPath, _T('*')) == NULL && + IsExistingDirectory (szSrcPath)) + { + /* If it doesnt have a \ at the end already then on needs to be added */ + if(szSrcPath[_tcslen(szSrcPath) - 1] != _T('\')) + _tcscat (szSrcPath, _T("\")); + /* Add a wildcard after the \ */ + _tcscat (szSrcPath, _T("*")); + } + /* Make sure there is an ending slash to the path if the dest is a folder */ + if(_tcschr (szDestPath, _T('*')) == NULL && + IsExistingDirectory(szDestPath)) + { + if(szDestPath[_tcslen(szDestPath) - 1] != _T('\')) + _tcscat (szDestPath, _T("\")); + } + + /* 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('\')) + { + /* In this case we will be using the same name as the source file + for the destination file because destination is a folder */ + bSrcName = TRUE; + } + else + { + /* Save the name the user entered */ + UseThisName = _tcsrchr(szDestPath,_T('\')); + UseThisName++; + _tcscpy(PreserveName,UseThisName); + } + + /* Strip the paths back to the folder they are in */ + for(i = (_tcslen(szSrcPath) - 1); i > -1; i--) + if(szSrcPath[i] != _T('\')) + szSrcPath[i] = _T('\0'); + else + break; + + for(i = (_tcslen(szDestPath) - 1); i > -1; i--) + if(szDestPath[i] != _T('\')) + szDestPath[i] = _T('\0'); + else + break; + + do + { + /* Check Breaker */ + if(CheckCtrlBreak(BREAK_INPUT)) + { + freep(arg); + return 1; + } + /* Set the override to yes each new file */ + nOverwrite = 1; + + /* If it couldnt open the file handle, print out the error */ + if(hFile == INVALID_HANDLE_VALUE) + { + ConOutFormatMessage (GetLastError(), szSrcPath); + freep (arg); + nErrorLevel = 1; + return 1; + } + + /* Ignore the . and .. files */ + if(!_tcscmp (findBuffer.cFileName, _T(".")) || + !_tcscmp (findBuffer.cFileName, _T(".."))|| + findBuffer.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + continue; + + /* Copy the base folder over to a tmp string */ + _tcscpy(tmpDestPath,szDestPath); + + /* Can't put a file into a folder that isnt there */ + if(!IsExistingDirectory(szDestPath)) + { + ConOutFormatMessage (GetLastError (), szSrcPath); + freep (arg); + nErrorLevel = 1; + return 1; + } + /* Copy over the destination path name */ + if(bSrcName) + _tcscat (tmpDestPath, findBuffer.cFileName); + else + { + /* If there is no wildcard you can use the name the user entered */ + if(_tcschr (PreserveName, _T('*')) == NULL) + { + _tcscat (tmpDestPath, PreserveName); + } + else + { + /* The following lines of copy were written by someone else + (most likely Eric Khoul) and it was taken from ren.c */ + LPTSTR p,q,r; + TCHAR DoneFile[MAX_PATH]; + /* build destination file name */ + p = findBuffer.cFileName; + q = PreserveName; + r = DoneFile; + while(*q != 0) + { + if (*q == '*') + { + q++; + while (*p != 0 && *p != *q) + { + *r = *p; + p++; + r++; + } + } + else if (*q == '?') + { + q++; + if (*p != 0) + { + *r = *p; + p++; + r++; + } + } + else + { + *r = *q; + if (*p != 0) + p++; + q++; + r++; + } + } + *r = 0; + /* Add the filename to the tmp string path */ + _tcscat (tmpDestPath, DoneFile); + } + } + + /* 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(!bTouch && !_tcscmp (tmpSrcPath, tmpDestPath)) + { + LoadString(CMD_ModuleHandle, STRING_COPY_ERROR2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg);
nErrorLevel = 1; break; }
- /* Handle any overriding / prompting that needs to be done */ - if(((!(dwFlags & COPY_NO_PROMPT) && IsExistingFile (tmpDestPath)) || dwFlags & COPY_PROMPT) && !bTouch) - nOverwrite = CopyOverwrite(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, bTouch)) - { - nFiles++; - /* only print source name when more then one file */ - if(_tcschr (arg[nSrc], _T('+')) != NULL || _tcschr (arg[nSrc], _T('*')) != NULL) - ConOutPrintf(_T("%s\n"),findBuffer.cFileName); - //LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR1, szMsg, RC_STRING_MAX_SIZE); - } - else - { - /* print out the error message */ - LoadString(CMD_ModuleHandle, STRING_COPY_ERROR3, szMsg, RC_STRING_MAX_SIZE); - ConOutPrintf(szMsg); - ConOutFormatMessage (GetLastError(), szSrcPath); - nErrorLevel = 1; - } - - /* Loop through all wildcard files */ - }while(FindNextFile (hFile, &findBuffer)); - /* Loop through all files in src string with a + */ - }while(!bDone); - - /* print out the number of files copied */ - LoadString(CMD_ModuleHandle, STRING_COPY_FILE, szMsg, RC_STRING_MAX_SIZE); - ConOutPrintf(szMsg, nFiles); - - FindClose(hFile); - if (arg!=NULL) - freep(arg); - - return 0; + /* Handle any overriding / prompting that needs to be done */ + if(((!(dwFlags & COPY_NO_PROMPT) && IsExistingFile (tmpDestPath)) || dwFlags & COPY_PROMPT) && !bTouch) + nOverwrite = CopyOverwrite(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, bTouch)) + { + nFiles++; + /* only print source name when more then one file */ + if(_tcschr (arg[nSrc], _T('+')) != NULL || _tcschr (arg[nSrc], _T('*')) != NULL) + ConOutPrintf(_T("%s\n"),findBuffer.cFileName); + //LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR1, szMsg, RC_STRING_MAX_SIZE); + } + else + { + /* print out the error message */ + LoadString(CMD_ModuleHandle, STRING_COPY_ERROR3, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg); + ConOutFormatMessage (GetLastError(), szSrcPath); + nErrorLevel = 1; + } + + /* Loop through all wildcard files */ + } while(FindNextFile (hFile, &findBuffer)); + + /* Loop through all files in src string with a + */ + } while(!bDone); + + /* print out the number of files copied */ + LoadString(CMD_ModuleHandle, STRING_COPY_FILE, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, nFiles); + + FindClose(hFile); + + if (arg != NULL) + freep(arg); + + return 0; }
- #endif /* INCLUDE_CMD_COPY */