Update some more actions with Windows API calls instead of POSIX.

pull/134/head
John Safranek 2019-01-29 17:11:10 -08:00
parent 69455eafe7
commit 9b817d702c
3 changed files with 178 additions and 9 deletions

View File

@ -161,7 +161,7 @@ void* WS_CreateFileA(const char* fileName, unsigned long desiredAccess,
fileHandle = CreateFileW(unicodeFileName, desiredAccess, shareMode,
NULL, creationDisposition, flags, NULL);
WFREE(unicodeFileName, heap, 0);
WFREE(unicodeFileName, heap, PORT_DYNTYPE_STRING);
return (void*)(error ? INVALID_HANDLE_VALUE : fileHandle);
}
@ -193,7 +193,7 @@ void* WS_FindFirstFileA(const char* fileName,
if (!error)
findHandle = FindFirstFileW(unicodeFileName, &findFileData);
WFREE(unicodeFileName, heap, 0);
WFREE(unicodeFileName, heap, PORT_DYNTYPE_STRING);
error = wcstombs_s(NULL, realFileName, realFileNameSz,
findFileData.cFileName, realFileNameSz);
@ -252,11 +252,160 @@ int WS_GetFileAttributesExA(const char* fileName, void* fileInfo, void* heap)
GetFileExInfoStandard, fileInfo);
}
WFREE(unicodeFileName, heap, 0);
WFREE(unicodeFileName, heap, PORT_DYNTYPE_STRING);
return success != 0;
}
int WS_RemoveDirectoryA(const char* dirName, void* heap)
{
BOOL success = 0;
wchar_t* unicodeDirName;
size_t unicodeDirNameSz = 0;
size_t returnSz = 0;
size_t dirNameSz = 0;
errno_t error;
dirNameSz = WSTRLEN(dirName);
error = mbstowcs_s(&unicodeDirNameSz, NULL, 0, dirName, 0);
if (error != 0)
return 0;
unicodeDirName = (wchar_t*)WMALLOC((unicodeDirNameSz+1)*sizeof(wchar_t),
heap, PORT_DYNTYPE_STRING);
if (unicodeDirName == NULL)
return 0;
error = mbstowcs_s(&returnSz, unicodeDirName, unicodeDirNameSz,
dirName, dirNameSz);
if (error == 0) {
success = RemoveDirectoryW(unicodeDirName);
}
WFREE(unicodeDirName, heap, PORT_DYNTYPE_STRING);
return success != 0;
}
int WS_CreateDirectoryA(const char* dirName, void* heap)
{
BOOL success = 0;
wchar_t* unicodeDirName;
size_t unicodeDirNameSz = 0;
size_t returnSz = 0;
size_t dirNameSz = 0;
errno_t error;
dirNameSz = WSTRLEN(dirName);
error = mbstowcs_s(&unicodeDirNameSz, NULL, 0, dirName, 0);
if (error != 0)
return 0;
unicodeDirName = (wchar_t*)WMALLOC((unicodeDirNameSz+1)*sizeof(wchar_t),
heap, PORT_DYNTYPE_STRING);
if (unicodeDirName == NULL)
return 0;
error = mbstowcs_s(&returnSz, unicodeDirName, unicodeDirNameSz,
dirName, dirNameSz);
if (error == 0) {
success = CreateDirectoryW(unicodeDirName, NULL);
}
WFREE(unicodeDirName, heap, PORT_DYNTYPE_STRING);
return success != 0;
}
int WS_MoveFileA(const char* oldName, const char* newName, void* heap)
{
BOOL success = 0;
wchar_t* unicodeOldName;
wchar_t* unicodeNewName;
size_t unicodeOldNameSz = 0;
size_t unicodeNewNameSz = 0;
size_t oldNameSz = 0;
size_t newNameSz = 0;
size_t returnSz = 0;
errno_t error;
oldNameSz = WSTRLEN(oldName);
error = mbstowcs_s(&unicodeOldNameSz, NULL, 0, oldName, 0);
if (error != 0)
return 0;
unicodeOldName = (wchar_t*)WMALLOC((unicodeOldNameSz+1)*sizeof(wchar_t),
heap, PORT_DYNTYPE_STRING);
if (unicodeOldName == NULL)
return 0;
error = mbstowcs_s(&returnSz, unicodeOldName, unicodeOldNameSz,
oldName, oldNameSz);
newNameSz = WSTRLEN(newName);
error = mbstowcs_s(&unicodeNewNameSz, NULL, 0, newName, 0);
if (error != 0)
return 0;
unicodeNewName = (wchar_t*)WMALLOC((unicodeNewNameSz+1)*sizeof(wchar_t),
heap, PORT_DYNTYPE_STRING);
if (unicodeNewName == NULL) {
WFREE(unicodeOldName, heap, PORT_DYNTYPE_STRING);
return 0;
}
error = mbstowcs_s(&returnSz, unicodeNewName, unicodeNewNameSz,
newName, newNameSz);
if (error == 0) {
success = MoveFileW(unicodeOldName, unicodeNewName);
}
WFREE(unicodeOldName, heap, PORT_DYNTYPE_STRING);
WFREE(unicodeNewName, heap, PORT_DYNTYPE_STRING);
return success != 0;
}
int WS_DeleteFileA(const char* fileName, void* heap)
{
BOOL success = 0;
wchar_t* unicodeFileName;
size_t unicodeFileNameSz = 0;
size_t returnSz = 0;
size_t fileNameSz = 0;
errno_t error;
fileNameSz = WSTRLEN(fileName);
error = mbstowcs_s(&unicodeFileNameSz, NULL, 0, fileName, 0);
if (error != 0)
return 0;
unicodeFileName = (wchar_t*)WMALLOC((unicodeFileNameSz+1)*sizeof(wchar_t),
heap, PORT_DYNTYPE_STRING);
if (unicodeFileName == NULL)
return 0;
error = mbstowcs_s(&returnSz, unicodeFileName, unicodeFileNameSz,
fileName, fileNameSz);
if (error == 0) {
success = DeleteFileW(unicodeFileName);
}
WFREE(unicodeFileName, heap, PORT_DYNTYPE_STRING);
return success != 0;
}
#endif /* USE_WINDOWS_API */

View File

@ -1299,7 +1299,7 @@ int wolfSSH_SFTP_RecvRMDIR(WOLFSSH* ssh, int reqId, byte* data, word32 maxSz)
#ifndef USE_WINDOWS_API
ret = WRMDIR(dir);
#else /* USE_WINDOWS_API */
ret = RemoveDirectoryA(dir) == 0;
ret = WS_RemoveDirectoryA(dir, ssh->ctx->heap) == 0;
#endif /* USE_WINDOWS_API */
WFREE(dir, ssh->ctx->heap, DYNTYPE_BUFFER);
@ -1394,7 +1394,7 @@ int wolfSSH_SFTP_RecvMKDIR(WOLFSSH* ssh, int reqId, byte* data, word32 maxSz)
#ifndef USE_WINDOWS_API
ret = WMKDIR(dir, mode);
#else /* USE_WINDOWS_API */
ret = CreateDirectoryA(dir, NULL) == 0;
ret = WS_CreateDirectoryA(dir, ssh->ctx->heap) == 0;
#endif /* USE_WINDOWS_API */
WFREE(dir, ssh->ctx->heap, DYNTYPE_BUFFER);
@ -3001,7 +3001,12 @@ int wolfSSH_SFTP_RecvRemove(WOLFSSH* ssh, int reqId, byte* data, word32 maxSz)
name[sz] = '\0';
clean_path(name);
if ((ret = WREMOVE(name)) < 0) {
#ifndef USE_WINDOWS_API
if ((ret = WREMOVE(name)) < 0)
#else /* USE_WINDOWS_API */
if (WS_DeleteFileA(name, ssh->ctx->heap) == 0)
#endif /* USE_WINDOWS_API */
{
WLOG(WS_LOG_SFTP, "Error removing file");
#if defined(WOLFSSL_NUCLEUS) && defined(DEBUG_WOLFSSH)
if (ret == NUF_ACCES)
@ -3100,9 +3105,16 @@ int wolfSSH_SFTP_RecvRename(WOLFSSH* ssh, int reqId, byte* data, word32 maxSz)
clean_path(old);
clean_path(nw);
if (ret == WS_SUCCESS && WRENAME(old, nw) < 0) {
WLOG(WS_LOG_SFTP, "Error renaming file");
ret = WS_BAD_FILE_E;
if (ret == WS_SUCCESS) {
#ifndef USE_WINDOWS_API
if (WRENAME(old, nw) < 0)
#else /* USE_WINDOWS_API */
if (WS_MoveFileA(old, nw, ssh->ctx->heap) == 0)
#endif /* USE_WINDOWS_API */
{
WLOG(WS_LOG_SFTP, "Error renaming file");
ret = WS_BAD_FILE_E;
}
}
/* Let the client know the results from trying to rename the file */

View File

@ -160,6 +160,14 @@ extern "C" {
char* realFileName, size_t realFileNameSz);
WOLFSSH_LOCAL int WS_GetFileAttributesExA(const char* fileName,
void* fileInfo, void* heap);
WOLFSSH_LOCAL int WS_RemoveDirectoryA(const char* dirName,
void* heap);
WOLFSSH_LOCAL int WS_CreateDirectoryA(const char* dirName,
void* heap);
WOLFSSH_LOCAL int WS_MoveFileA(const char* oldName,
const char* newName, void* heap);
WOLFSSH_LOCAL int WS_DeleteFileA(const char* fileName,
void* heap);
#ifndef _WIN32_WCE
#include <direct.h>