mirror of https://github.com/wolfSSL/wolfssh.git
add status callback to SCP no filesystem
parent
649a523b35
commit
9a83d7998a
|
@ -2500,7 +2500,7 @@ int wsScpRecvCallback(WOLFSSH* ssh, int state, const char* basePath,
|
||||||
int sz;
|
int sz;
|
||||||
|
|
||||||
if (ctx == NULL) {
|
if (ctx == NULL) {
|
||||||
wolfSSH_SetScpErrorMsg(ssh, "SCP receive ctx not set");
|
WLOG(WS_LOG_DEBUG, scpState, "SCP receive ctx not set");
|
||||||
return WS_SCP_ABORT;
|
return WS_SCP_ABORT;
|
||||||
}
|
}
|
||||||
recvBuffer = (ScpBuffer*)ctx;
|
recvBuffer = (ScpBuffer*)ctx;
|
||||||
|
@ -2521,6 +2521,11 @@ int wsScpRecvCallback(WOLFSSH* ssh, int state, const char* basePath,
|
||||||
WMEMCPY(recvBuffer->name, fileName, sz);
|
WMEMCPY(recvBuffer->name, fileName, sz);
|
||||||
recvBuffer->mTime = mTime;
|
recvBuffer->mTime = mTime;
|
||||||
recvBuffer->mode = fileMode;
|
recvBuffer->mode = fileMode;
|
||||||
|
if (recvBuffer->status) {
|
||||||
|
if (recvBuffer->status(ssh, fileName, WOLFSSH_SCP_NEW_FILE,
|
||||||
|
recvBuffer) != WS_SUCCESS)
|
||||||
|
ret = WS_SCP_ABORT;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WOLFSSH_SCP_FILE_PART:
|
case WOLFSSH_SCP_FILE_PART:
|
||||||
|
@ -2529,11 +2534,21 @@ int wsScpRecvCallback(WOLFSSH* ssh, int state, const char* basePath,
|
||||||
bufSz : recvBuffer->bufferSz - recvBuffer->idx;
|
bufSz : recvBuffer->bufferSz - recvBuffer->idx;
|
||||||
WMEMCPY(recvBuffer->buffer + recvBuffer->idx, buf, sz);
|
WMEMCPY(recvBuffer->buffer + recvBuffer->idx, buf, sz);
|
||||||
recvBuffer->fileSz += sz;
|
recvBuffer->fileSz += sz;
|
||||||
|
if (recvBuffer->status) {
|
||||||
|
if (recvBuffer->status(ssh, recvBuffer->name,
|
||||||
|
WOLFSSH_SCP_FILE_PART, recvBuffer) != WS_SUCCESS)
|
||||||
|
ret = WS_SCP_ABORT;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WOLFSSH_SCP_FILE_DONE:
|
case WOLFSSH_SCP_FILE_DONE:
|
||||||
recvBuffer->idx = 0; /* rewind when done */
|
recvBuffer->idx = 0; /* rewind when done */
|
||||||
recvBuffer->mTime = 0; /* @TODO set time if wanted */
|
recvBuffer->mTime = 0; /* @TODO set time if wanted */
|
||||||
|
if (recvBuffer->status) {
|
||||||
|
if (recvBuffer->status(ssh, recvBuffer->name,
|
||||||
|
WOLFSSH_SCP_FILE_DONE, recvBuffer) != WS_SUCCESS)
|
||||||
|
ret = WS_SCP_ABORT;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WOLFSSH_SCP_NEW_DIR:
|
case WOLFSSH_SCP_NEW_DIR:
|
||||||
|
@ -2566,7 +2581,7 @@ int wsScpSendCallback(WOLFSSH* ssh, int state, const char* peerRequest,
|
||||||
int ret = WS_SUCCESS;
|
int ret = WS_SUCCESS;
|
||||||
|
|
||||||
if (ctx == NULL) {
|
if (ctx == NULL) {
|
||||||
wolfSSH_SetScpErrorMsg(ssh, "no ctx sent to hold file info");
|
WLOG(WS_LOG_DEBUG, scpState, "no ctx sent to hold file info");
|
||||||
return WS_SCP_ABORT;
|
return WS_SCP_ABORT;
|
||||||
}
|
}
|
||||||
sendBuffer = (ScpBuffer*)ctx;
|
sendBuffer = (ScpBuffer*)ctx;
|
||||||
|
@ -2582,17 +2597,26 @@ int wsScpSendCallback(WOLFSSH* ssh, int state, const char* peerRequest,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
*totalFileSz = sendBuffer->bufferSz;
|
|
||||||
*mTime = sendBuffer->mTime;
|
|
||||||
*aTime = sendBuffer->mTime;
|
|
||||||
*fileMode = sendBuffer->mode;
|
|
||||||
ret = ExtractFileName(peerRequest, fileName, fileNameSz);
|
ret = ExtractFileName(peerRequest, fileName, fileNameSz);
|
||||||
|
if (ret == WS_SUCCESS && sendBuffer->status) {
|
||||||
|
if ( sendBuffer->status(ssh, fileName,
|
||||||
|
WOLFSSH_SCP_SINGLE_FILE_REQUEST, sendBuffer)
|
||||||
|
!= WS_SUCCESS) {
|
||||||
|
ret = WS_SCP_ABORT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (WSTRLEN(fileName) != sendBuffer->nameSz ||
|
if (WSTRLEN(fileName) != sendBuffer->nameSz ||
|
||||||
WMEMCMP(sendBuffer->name, fileName, fileNameSz) != 0) {
|
WMEMCMP(sendBuffer->name, fileName, fileNameSz) != 0) {
|
||||||
wolfSSH_SetScpErrorMsg(ssh, "file name did not match");
|
wolfSSH_SetScpErrorMsg(ssh, "file name did not match");
|
||||||
ret = WS_SCP_ABORT;
|
ret = WS_SCP_ABORT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
*totalFileSz = sendBuffer->bufferSz;
|
||||||
|
*mTime = sendBuffer->mTime;
|
||||||
|
*aTime = sendBuffer->mTime;
|
||||||
|
*fileMode = sendBuffer->mode;
|
||||||
|
|
||||||
/* copy over buffer info */
|
/* copy over buffer info */
|
||||||
if (sendBuffer->idx >= sendBuffer->bufferSz) {
|
if (sendBuffer->idx >= sendBuffer->bufferSz) {
|
||||||
|
@ -2628,6 +2652,13 @@ int wsScpSendCallback(WOLFSSH* ssh, int state, const char* peerRequest,
|
||||||
ret = WS_EOF;
|
ret = WS_EOF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sendBuffer->status(ssh, sendBuffer->name,
|
||||||
|
WOLFSSH_SCP_CONTINUE_FILE_TRANSFER, sendBuffer)
|
||||||
|
!= WS_SUCCESS) {
|
||||||
|
ret = WS_SCP_ABORT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -52,6 +52,21 @@ extern "C" {
|
||||||
#define DEFAULT_SCP_BUFFER_SZ DEFAULT_MAX_PACKET_SZ
|
#define DEFAULT_SCP_BUFFER_SZ DEFAULT_MAX_PACKET_SZ
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
enum WS_ScpFileStates {
|
||||||
|
/* sink */
|
||||||
|
WOLFSSH_SCP_NEW_REQUEST = 0,
|
||||||
|
WOLFSSH_SCP_NEW_FILE,
|
||||||
|
WOLFSSH_SCP_FILE_PART,
|
||||||
|
WOLFSSH_SCP_FILE_DONE,
|
||||||
|
WOLFSSH_SCP_NEW_DIR,
|
||||||
|
WOLFSSH_SCP_END_DIR,
|
||||||
|
/* source */
|
||||||
|
WOLFSSH_SCP_SINGLE_FILE_REQUEST,
|
||||||
|
WOLFSSH_SCP_RECURSIVE_REQUEST,
|
||||||
|
WOLFSSH_SCP_CONTINUE_FILE_TRANSFER
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#if !defined(WOLFSSH_SCP_USER_CALLBACKS)
|
#if !defined(WOLFSSH_SCP_USER_CALLBACKS)
|
||||||
#if !defined(NO_FILESYSTEM)
|
#if !defined(NO_FILESYSTEM)
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
@ -80,7 +95,8 @@ extern "C" {
|
||||||
} ScpDir;
|
} ScpDir;
|
||||||
#else
|
#else
|
||||||
/* Use a buffer for built in no filesystem send/recv */
|
/* Use a buffer for built in no filesystem send/recv */
|
||||||
typedef struct ScpBuffer {
|
typedef struct ScpBuffer ScpBuffer;
|
||||||
|
struct ScpBuffer {
|
||||||
char name[DEFAULT_SCP_FILE_NAME_SZ];
|
char name[DEFAULT_SCP_FILE_NAME_SZ];
|
||||||
byte* buffer;
|
byte* buffer;
|
||||||
word64 mTime;
|
word64 mTime;
|
||||||
|
@ -89,24 +105,11 @@ extern "C" {
|
||||||
word32 idx; /* current index into "buffer" */
|
word32 idx; /* current index into "buffer" */
|
||||||
word32 nameSz;
|
word32 nameSz;
|
||||||
int mode;
|
int mode;
|
||||||
} ScpBuffer;
|
int (*status)(WOLFSSH* ssh, const char* fileName, enum WS_ScpFileStates state, ScpBuffer* file);
|
||||||
|
};
|
||||||
#endif /* NO_FILESYSTEM */
|
#endif /* NO_FILESYSTEM */
|
||||||
#endif /* WOLFSSH_SCP_USER_CALLBACKS */
|
#endif /* WOLFSSH_SCP_USER_CALLBACKS */
|
||||||
|
|
||||||
enum WS_ScpFileStates {
|
|
||||||
/* sink */
|
|
||||||
WOLFSSH_SCP_NEW_REQUEST = 0,
|
|
||||||
WOLFSSH_SCP_NEW_FILE,
|
|
||||||
WOLFSSH_SCP_FILE_PART,
|
|
||||||
WOLFSSH_SCP_FILE_DONE,
|
|
||||||
WOLFSSH_SCP_NEW_DIR,
|
|
||||||
WOLFSSH_SCP_END_DIR,
|
|
||||||
/* source */
|
|
||||||
WOLFSSH_SCP_SINGLE_FILE_REQUEST,
|
|
||||||
WOLFSSH_SCP_RECURSIVE_REQUEST,
|
|
||||||
WOLFSSH_SCP_CONTINUE_FILE_TRANSFER
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef int (*WS_CallbackScpRecv)(WOLFSSH*, int, const char*, const char*,
|
typedef int (*WS_CallbackScpRecv)(WOLFSSH*, int, const char*, const char*,
|
||||||
int, word64, word64, word32, byte*, word32,
|
int, word64, word64, word32, byte*, word32,
|
||||||
word32, void*);
|
word32, void*);
|
||||||
|
|
Loading…
Reference in New Issue