mirror of https://github.com/wolfSSL/wolfssh.git
Update some more actions with Windows API calls instead of POSIX.
parent
69455eafe7
commit
9b817d702c
155
src/port.c
155
src/port.c
|
@ -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 */
|
||||
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue