diff --git a/src/wolfsftp.c b/src/wolfsftp.c
index 8b2e94e..7ab3664 100644
--- a/src/wolfsftp.c
+++ b/src/wolfsftp.c
@@ -18,6 +18,7 @@
* along with wolfSSH. If not, see .
*/
+#define _CRT_SECURE_NO_WARNINGS
#ifdef HAVE_CONFIG_H
#include
@@ -523,10 +524,10 @@ int wolfSSH_SFTP_SendStatus(WOLFSSH* ssh, word32 status, word32 reqId,
maxSz = WOLFSSH_SFTP_HEADER + (UINT32_SZ * 3);
if (reason != NULL) {
- maxSz += WSTRLEN(reason);
+ maxSz += (word32)WSTRLEN(reason);
}
if (lang != NULL) {
- maxSz += WSTRLEN(lang);
+ maxSz += (word32)WSTRLEN(lang);
}
buf = (byte*)WMALLOC(maxSz, ssh->ctx->heap, DYNTYPE_BUFFER);
@@ -1045,6 +1046,76 @@ static int wolfSSH_SFTPNAME_readdir(WOLFSSH* ssh, WDIR* dir, WS_SFTPNAME* out,
return ret;
}
+#elif defined(USE_WINDOWS_API)
+/* helper function that gets file information from reading directory
+* @TODO allow user to override
+*
+* returns WS_SUCCESS on success
+*/
+static int wolfSSH_SFTPNAME_readdir(WOLFSSH* ssh, WDIR* dir, WS_SFTPNAME* out,
+ char* dirName)
+{
+ int sz;
+
+ if (dir == NULL || ssh == NULL || out == NULL) {
+ return WS_BAD_ARGUMENT;
+ }
+
+ dp = WREADDIR(dir);
+ if (dp == NULL) {
+ return WS_FATAL_ERROR;
+ }
+
+ sz = (int)WSTRLEN(dp->d_name);
+ out->fName = (char*)WMALLOC(sz + 1, out->heap, DYNTYPE_SFTP);
+ if (out->fName == NULL) {
+ return WS_MEMORY_E;
+ }
+ out->lName = (char*)WMALLOC(sz + 1, out->heap, DYNTYPE_SFTP);
+ if (out->lName == NULL) {
+ WFREE(out->fName, out->heap, DYNTYPE_SFTP);
+ return WS_MEMORY_E;
+ }
+
+ WMEMCPY(out->fName, dp->d_name, sz);
+ WMEMCPY(out->lName, dp->d_name, sz);
+ out->fName[sz] = '\0';
+ out->lName[sz] = '\0';
+ out->fSz = sz;
+ out->lSz = sz;
+
+ /* attempt to get file attributes. Could be directory or have none */
+ {
+ char* buf;
+ int bufSz;
+ int tmpSz;
+
+ bufSz = out->fSz + (int)WSTRLEN(dirName) + sizeof(WS_DELIM);
+ buf = (char*)WMALLOC(bufSz + 1, out->heap, DYNTYPE_SFTP);
+ if (buf == NULL) {
+ return WS_MEMORY_E;
+ }
+ buf[0] = '\0';
+ WSTRNCAT(buf, dirName, bufSz);
+ tmpSz = (int)WSTRLEN(buf);
+
+ /* add delimiter between path and file/dir name */
+ if (tmpSz + 1 < bufSz) {
+ buf[tmpSz] = WS_DELIM;
+ buf[tmpSz + 1] = '\0';
+ }
+ WSTRNCAT(buf, out->fName, bufSz);
+
+ clean_path(buf);
+ if (SFTP_GetAttributes(buf, &out->atrb, 0) != WS_SUCCESS) {
+ WLOG(WS_LOG_SFTP, "Unable to get attribute values for %s",
+ out->fName);
+ }
+ WFREE(buf, out->heap, DYNTYPE_SFTP);
+ }
+
+ return WS_SUCCESS;
+}
#else
/* helper function that gets file information from reading directory
* @TODO allow user to override
@@ -2021,7 +2092,7 @@ int SFTP_GetAttributes_Handle(WOLFSSH* ssh, byte* handle, int handleSz,
*/
int SFTP_GetAttributes(const char* fileName, WS_SFTP_FILEATRB* atr, byte link)
{
- struct stat stats;
+ WSTAT_T stats;
if (link) {
if (WLSTAT(fileName, &stats) != 0) {
@@ -3874,11 +3945,11 @@ int wolfSSH_SFTP_Rename(WOLFSSH* ssh, const char* old, const char* nw)
/* add old name to the packet */
idx = WOLFSSH_SFTP_HEADER;
c32toa((word32)WSTRLEN(old), data + idx); idx += UINT32_SZ;
- WMEMCPY(data + idx, (byte*)old, WSTRLEN(old)); idx += WSTRLEN(old);
+ WMEMCPY(data + idx, (byte*)old, WSTRLEN(old)); idx += (word32)WSTRLEN(old);
/* add new name to the packet */
c32toa((word32)WSTRLEN(nw), data + idx); idx += UINT32_SZ;
- WMEMCPY(data + idx, (byte*)nw, WSTRLEN(nw)); idx += WSTRLEN(nw);
+ WMEMCPY(data + idx, (byte*)nw, WSTRLEN(nw)); idx += (word32)WSTRLEN(nw);
/* send header and type specific data */
ret = wolfSSH_stream_send(ssh, data, idx);
@@ -4162,7 +4233,7 @@ int wolfSSH_SFTP_Get(WOLFSSH* ssh, char* from,
/* if resuming then check for saved offset */
if (resume) {
- gOfst = wolfSSH_SFTP_GetOfst(ssh, from, to);
+ gOfst = (long)wolfSSH_SFTP_GetOfst(ssh, from, to);
}
if (gOfst > 0) {
@@ -4237,7 +4308,7 @@ int wolfSSH_SFTP_Put(WOLFSSH* ssh, char* from, char* to, byte resume,
if (resume) {
/* check if offset was stored */
- pOfst = wolfSSH_SFTP_GetOfst(ssh, from, to);
+ pOfst = (long)wolfSSH_SFTP_GetOfst(ssh, from, to);
}
/* open file and get handle */
diff --git a/wolfssh/port.h b/wolfssh/port.h
index 77aa2fb..0e919e8 100644
--- a/wolfssh/port.h
+++ b/wolfssh/port.h
@@ -131,17 +131,26 @@ extern "C" {
#define WREWIND(s) rewind((s))
#define WSEEK_END SEEK_END
#define WUTIMES(f,t) utimes((f),(t))
- #define WCHMOD(f,m) chmod((f),(m))
+
+ #ifndef USE_WINDOWS_API
+ #define WCHMOD(f,m) chmod((f),(m))
+ #else
+ #define WCHMOD(f,m) _chmod((f),(m))
+ #endif
#if (defined(WOLFSSH_SCP) || defined(WOLFSSH_SFTP)) && \
!defined(WOLFSSH_SCP_USER_CALLBACKS) && \
!defined(NO_FILESYSTEM)
- /* for chdir() */
- #include
- /* for mkdir() */
- #include
- #define WCHDIR(p) chdir((p))
- #define WMKDIR(p,m) mkdir((p),(m))
+
+ #ifdef USE_WINDOWS_API
+ #include
+ #define WCHDIR(p) _chdir((p))
+ #define WMKDIR(p,m) _mkdir((p))
+ #else
+ #include
+ #include
+ #define WCHDIR(p) chdir((p))
+ #define WMKDIR(p,m) mkdir((p),(m))
#endif
#endif
#endif
@@ -149,7 +158,6 @@ extern "C" {
#ifndef WSTRING_USER
#include
-
WOLFSSH_API char* wstrnstr(const char*, const char*, unsigned int);
#define WMEMCPY(d,s,l) memcpy((d),(s),(l))
@@ -411,6 +419,46 @@ extern "C" {
#define WCLOSEDIR(d) NU_Done((d))
#define WREADDIR(d) (NU_Get_Next((d)) == NU_SUCCESS)?(d):NULL
#endif /* NO_WOLFSSH_DIR */
+#elif defined(USE_WINDOWS_API)
+
+ #include
+ #include
+ #include
+ #include
+ #include
+
+ #define WRMDIR(d) _rmdir((d))
+ #define WSTAT_T struct _stat
+ #define WSTAT(p,b) _stat((p),(b))
+ /*#define WLSTAT(p,b)*/
+ #define WREMOVE(d) remove((d))
+ #define WRENAME(o,n) rename((o),(n))
+ #define WGETCWD(r,rSz) _getcwd((r),(rSz))
+ #define WOPEN(f,m,p) _open((f),(m),(p))
+ #define WCLOSE(fd) _close((fd))
+ /*#define WPWRITE(fd,b,s,o)*/
+ /*#define WPREAD(fd,b,s,o)*/
+ #define WS_DELIM '\\'
+
+ #define WFD int
+ #define WOLFSSH_O_RDWR _O_RDWR
+ #define WOLFSSH_O_RDONLY _O_RDONLY
+ #define WOLFSSH_O_WRONLY _O_WRONLY
+ #define WOLFSSH_O_APPEND _O_APPEND
+ #define WOLFSSH_O_CREAT _O_CREAT
+ #define WOLFSSH_O_TRUNC _O_TRUNC
+ #define WOLFSSH_O_EXCL _O_EXCL
+
+ #ifndef NO_WOLFSSH_DIR
+ #define WDIR void*
+
+ /* returns 0 on success */
+ #define WOPENDIR(c,d) (-1)
+ #define WCLOSEDIR(d) (-1)
+ #define WREADDIR(d) (-1)
+ #endif /* NO_WOLFSSH_DIR */
+ #endif
+
#else
#include /* used for rmdir */
#include /* used for mkdir, stat, and lstat */