mirror of https://github.com/wolfSSL/wolfssh.git
check for socket disconnect error
parent
249795ce9a
commit
a6a1297c93
|
@ -42,6 +42,11 @@ static char* workingDir;
|
||||||
#define MAX_CMD_SZ 7
|
#define MAX_CMD_SZ 7
|
||||||
|
|
||||||
|
|
||||||
|
static void err_msg(const char* s)
|
||||||
|
{
|
||||||
|
printf("%s\n", s);
|
||||||
|
}
|
||||||
|
|
||||||
static void myStatusCb(WOLFSSH* sshIn, word32* bytes, char* name)
|
static void myStatusCb(WOLFSSH* sshIn, word32* bytes, char* name)
|
||||||
{
|
{
|
||||||
char buf[80];
|
char buf[80];
|
||||||
|
@ -356,7 +361,7 @@ static INLINE char* SFTP_FGETS(func_args* args, char* msg, int msgSz)
|
||||||
int doCmds(func_args* args)
|
int doCmds(func_args* args)
|
||||||
{
|
{
|
||||||
byte quit = 0;
|
byte quit = 0;
|
||||||
int ret, err;
|
int ret = WS_SUCCESS, err;
|
||||||
byte resume = 0;
|
byte resume = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -364,12 +369,24 @@ int doCmds(func_args* args)
|
||||||
char msg[WOLFSSH_MAX_FILENAME * 2];
|
char msg[WOLFSSH_MAX_FILENAME * 2];
|
||||||
char* pt;
|
char* pt;
|
||||||
|
|
||||||
if (SFTP_FPUTS(args, "wolfSSH sftp> ") < 0)
|
if (wolfSSH_get_error(ssh) == WS_SOCKET_ERROR_E) {
|
||||||
err_sys("fputs error");
|
if (SFTP_FPUTS(args, "peer disconnected\n") < 0) {
|
||||||
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return WS_SOCKET_ERROR_E;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SFTP_FPUTS(args, "wolfSSH sftp> ") < 0) {
|
||||||
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
WMEMSET(msg, 0, sizeof(msg));
|
WMEMSET(msg, 0, sizeof(msg));
|
||||||
if (SFTP_FGETS(args, msg, sizeof(msg) - 1) == NULL)
|
if (SFTP_FGETS(args, msg, sizeof(msg) - 1) == NULL) {
|
||||||
err_sys("fgets error");
|
err_msg("fgets error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
msg[WOLFSSH_MAX_FILENAME * 2 - 1] = '\0';
|
msg[WOLFSSH_MAX_FILENAME * 2 - 1] = '\0';
|
||||||
|
|
||||||
if ((pt = WSTRNSTR(msg, "mkdir", sizeof(msg))) != NULL) {
|
if ((pt = WSTRNSTR(msg, "mkdir", sizeof(msg))) != NULL) {
|
||||||
|
@ -400,12 +417,16 @@ int doCmds(func_args* args)
|
||||||
if ((ret = wolfSSH_SFTP_MKDIR(ssh, pt, &atrb)) != WS_SUCCESS) {
|
if ((ret = wolfSSH_SFTP_MKDIR(ssh, pt, &atrb)) != WS_SUCCESS) {
|
||||||
err = wolfSSH_get_error(ssh);
|
err = wolfSSH_get_error(ssh);
|
||||||
if (ret == WS_PERMISSIONS) {
|
if (ret == WS_PERMISSIONS) {
|
||||||
if (SFTP_FPUTS(args, "Insufficient permissions\n") < 0)
|
if (SFTP_FPUTS(args, "Insufficient permissions\n") < 0) {
|
||||||
err_sys("fputs error");
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (err != WS_WANT_READ && err != WS_WANT_WRITE) {
|
else if (err != WS_WANT_READ && err != WS_WANT_WRITE) {
|
||||||
if (SFTP_FPUTS(args, "Error writing directory\n") < 0)
|
if (SFTP_FPUTS(args, "Error writing directory\n") < 0) {
|
||||||
err_sys("fputs error");
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
|
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
|
||||||
|
@ -454,7 +475,8 @@ int doCmds(func_args* args)
|
||||||
int maxSz = (int)(WSTRLEN(workingDir) + sz + 2);
|
int maxSz = (int)(WSTRLEN(workingDir) + sz + 2);
|
||||||
f = XMALLOC(maxSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
f = XMALLOC(maxSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
if (f == NULL) {
|
if (f == NULL) {
|
||||||
err_sys("Error malloc'ing");
|
err_msg("Error malloc'ing");
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
f[0] = '\0';
|
f[0] = '\0';
|
||||||
|
@ -475,8 +497,10 @@ int doCmds(func_args* args)
|
||||||
else {
|
else {
|
||||||
WSNPRINTF(buf, sizeof(buf), "fetching %s to %s\n", pt, to);
|
WSNPRINTF(buf, sizeof(buf), "fetching %s to %s\n", pt, to);
|
||||||
}
|
}
|
||||||
if (SFTP_FPUTS(args, buf) < 0)
|
if (SFTP_FPUTS(args, buf) < 0) {
|
||||||
err_sys("fputs error");
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
@ -487,12 +511,16 @@ int doCmds(func_args* args)
|
||||||
} while (ret == WS_WANT_READ || ret == WS_WANT_WRITE);
|
} while (ret == WS_WANT_READ || ret == WS_WANT_WRITE);
|
||||||
|
|
||||||
if (ret != WS_SUCCESS) {
|
if (ret != WS_SUCCESS) {
|
||||||
if (SFTP_FPUTS(args, "Error getting file\n") < 0)
|
if (SFTP_FPUTS(args, "Error getting file\n") < 0) {
|
||||||
err_sys("fputs error");
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (SFTP_FPUTS(args, "\n") < 0) /* new line after status output */
|
if (SFTP_FPUTS(args, "\n") < 0) { /* new line after status output */
|
||||||
err_sys("fputs error");
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
resume = 0;
|
resume = 0;
|
||||||
XFREE(f, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(f, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
@ -539,7 +567,8 @@ int doCmds(func_args* args)
|
||||||
int maxSz = (int)WSTRLEN(workingDir) + sz + 2;
|
int maxSz = (int)WSTRLEN(workingDir) + sz + 2;
|
||||||
f = XMALLOC(maxSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
f = XMALLOC(maxSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
if (f == NULL) {
|
if (f == NULL) {
|
||||||
err_sys("Error malloc'ing");
|
err_msg("Error malloc'ing");
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
f[0] = '\0';
|
f[0] = '\0';
|
||||||
|
@ -560,8 +589,10 @@ int doCmds(func_args* args)
|
||||||
else {
|
else {
|
||||||
WSNPRINTF(buf, sizeof(buf), "pushing %s to %s\n", pt, to);
|
WSNPRINTF(buf, sizeof(buf), "pushing %s to %s\n", pt, to);
|
||||||
}
|
}
|
||||||
if (SFTP_FPUTS(args, buf) < 0)
|
if (SFTP_FPUTS(args, buf) < 0) {
|
||||||
err_sys("fputs error");
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -571,12 +602,16 @@ int doCmds(func_args* args)
|
||||||
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
|
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
|
||||||
&& ret != WS_SUCCESS);
|
&& ret != WS_SUCCESS);
|
||||||
if (ret != WS_SUCCESS) {
|
if (ret != WS_SUCCESS) {
|
||||||
if (SFTP_FPUTS(args, "Error pushing file\n") < 0)
|
if (SFTP_FPUTS(args, "Error pushing file\n") < 0) {
|
||||||
err_sys("fputs error");
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (SFTP_FPUTS(args, "\n") < 0) /* new line after status output */
|
if (SFTP_FPUTS(args, "\n") < 0) { /* new line after status output */
|
||||||
err_sys("fputs error");
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
resume = 0;
|
resume = 0;
|
||||||
XFREE(f, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(f, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
@ -596,7 +631,8 @@ int doCmds(func_args* args)
|
||||||
int maxSz = (int)WSTRLEN(workingDir) + sz + 2;
|
int maxSz = (int)WSTRLEN(workingDir) + sz + 2;
|
||||||
f = XMALLOC(maxSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
f = XMALLOC(maxSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
if (f == NULL) {
|
if (f == NULL) {
|
||||||
err_sys("Error malloc'ing");
|
err_msg("Error malloc'ing");
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
f[0] = '\0';
|
f[0] = '\0';
|
||||||
|
@ -616,8 +652,10 @@ int doCmds(func_args* args)
|
||||||
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
|
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
|
||||||
&& ret != WS_SUCCESS);
|
&& ret != WS_SUCCESS);
|
||||||
if (ret != WS_SUCCESS) {
|
if (ret != WS_SUCCESS) {
|
||||||
if (SFTP_FPUTS(args, "Error changing directory\n") < 0)
|
if (SFTP_FPUTS(args, "Error changing directory\n") < 0) {
|
||||||
err_sys("fputs error");
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret == WS_SUCCESS) {
|
if (ret == WS_SUCCESS) {
|
||||||
|
@ -625,7 +663,8 @@ int doCmds(func_args* args)
|
||||||
XFREE(workingDir, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(workingDir, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
workingDir = (char*)XMALLOC(sz + 1, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
workingDir = (char*)XMALLOC(sz + 1, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
if (workingDir == NULL) {
|
if (workingDir == NULL) {
|
||||||
err_sys("Error malloc'ing");
|
err_msg("Error malloc'ing");
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
WMEMCPY(workingDir, pt, sz);
|
WMEMCPY(workingDir, pt, sz);
|
||||||
workingDir[sz] = '\0';
|
workingDir[sz] = '\0';
|
||||||
|
@ -669,7 +708,8 @@ int doCmds(func_args* args)
|
||||||
int maxSz = (int)WSTRLEN(workingDir) + sz + 2;
|
int maxSz = (int)WSTRLEN(workingDir) + sz + 2;
|
||||||
f = XMALLOC(maxSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
f = XMALLOC(maxSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
if (f == NULL) {
|
if (f == NULL) {
|
||||||
err_sys("Error malloc'ing");
|
err_msg("Error malloc'ing");
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
f[0] = '\0';
|
f[0] = '\0';
|
||||||
|
@ -689,8 +729,10 @@ int doCmds(func_args* args)
|
||||||
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
|
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
|
||||||
&& ret != WS_SUCCESS);
|
&& ret != WS_SUCCESS);
|
||||||
if (ret != WS_SUCCESS) {
|
if (ret != WS_SUCCESS) {
|
||||||
if (SFTP_FPUTS(args, "Unable to change path permissions\n") < 0)
|
if (SFTP_FPUTS(args, "Unable to change path permissions\n") < 0) {
|
||||||
err_sys("fputs error");
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
XFREE(f, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(f, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
@ -709,7 +751,8 @@ int doCmds(func_args* args)
|
||||||
int maxSz = (int)WSTRLEN(workingDir) + sz + 2;
|
int maxSz = (int)WSTRLEN(workingDir) + sz + 2;
|
||||||
f = XMALLOC(maxSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
f = XMALLOC(maxSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
if (f == NULL) {
|
if (f == NULL) {
|
||||||
err_sys("Error malloc'ing");
|
err_msg("Error malloc'ing");
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
f[0] = '\0';
|
f[0] = '\0';
|
||||||
|
@ -729,12 +772,16 @@ int doCmds(func_args* args)
|
||||||
&& ret != WS_SUCCESS);
|
&& ret != WS_SUCCESS);
|
||||||
if (ret != WS_SUCCESS) {
|
if (ret != WS_SUCCESS) {
|
||||||
if (ret == WS_PERMISSIONS) {
|
if (ret == WS_PERMISSIONS) {
|
||||||
if (SFTP_FPUTS(args, "Insufficient permissions\n") < 0)
|
if (SFTP_FPUTS(args, "Insufficient permissions\n") < 0) {
|
||||||
err_sys("fputs error");
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (SFTP_FPUTS(args, "Error writing directory\n") < 0)
|
if (SFTP_FPUTS(args, "Error writing directory\n") < 0) {
|
||||||
err_sys("fputs error");
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
XFREE(f, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(f, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
@ -771,12 +818,16 @@ int doCmds(func_args* args)
|
||||||
&& ret != WS_SUCCESS);
|
&& ret != WS_SUCCESS);
|
||||||
if (ret != WS_SUCCESS) {
|
if (ret != WS_SUCCESS) {
|
||||||
if (ret == WS_PERMISSIONS) {
|
if (ret == WS_PERMISSIONS) {
|
||||||
if (SFTP_FPUTS(args, "Insufficient permissions\n") < 0)
|
if (SFTP_FPUTS(args, "Insufficient permissions\n") < 0) {
|
||||||
err_sys("fputs error");
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (SFTP_FPUTS(args, "Error writing directory\n") < 0)
|
if (SFTP_FPUTS(args, "Error writing directory\n") < 0) {
|
||||||
err_sys("fputs error");
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
XFREE(f, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(f, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
@ -814,7 +865,8 @@ int doCmds(func_args* args)
|
||||||
int maxSz = (int)WSTRLEN(workingDir) + sz + 2;
|
int maxSz = (int)WSTRLEN(workingDir) + sz + 2;
|
||||||
f = XMALLOC(maxSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
f = XMALLOC(maxSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
if (f == NULL) {
|
if (f == NULL) {
|
||||||
err_sys("Error malloc'ing");
|
err_msg("Error malloc'ing");
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
f[0] = '\0';
|
f[0] = '\0';
|
||||||
|
@ -846,8 +898,10 @@ int doCmds(func_args* args)
|
||||||
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
|
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
|
||||||
&& ret != WS_SUCCESS);
|
&& ret != WS_SUCCESS);
|
||||||
if (ret != WS_SUCCESS) {
|
if (ret != WS_SUCCESS) {
|
||||||
if (SFTP_FPUTS(args, "Error with rename\n") < 0)
|
if (SFTP_FPUTS(args, "Error with rename\n") < 0) {
|
||||||
err_sys("fputs error");
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
XFREE(f, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(f, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
XFREE(fTo, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(fTo, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
@ -866,10 +920,14 @@ int doCmds(func_args* args)
|
||||||
&& current == NULL && err != WS_SUCCESS);
|
&& current == NULL && err != WS_SUCCESS);
|
||||||
tmp = current;
|
tmp = current;
|
||||||
while (tmp != NULL) {
|
while (tmp != NULL) {
|
||||||
if (SFTP_FPUTS(args, tmp->fName) < 0)
|
if (SFTP_FPUTS(args, tmp->fName) < 0) {
|
||||||
err_sys("fputs error");
|
err_msg("fputs error");
|
||||||
if (SFTP_FPUTS(args, "\n") < 0)
|
return -1;
|
||||||
err_sys("fputs error");
|
}
|
||||||
|
if (SFTP_FPUTS(args, "\n") < 0) {
|
||||||
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
wolfSSH_SFTPNAME_list_free(current);
|
wolfSSH_SFTPNAME_list_free(current);
|
||||||
|
@ -879,8 +937,10 @@ int doCmds(func_args* args)
|
||||||
/* display current working directory */
|
/* display current working directory */
|
||||||
if ((pt = WSTRNSTR(msg, "pwd", MAX_CMD_SZ)) != NULL) {
|
if ((pt = WSTRNSTR(msg, "pwd", MAX_CMD_SZ)) != NULL) {
|
||||||
if (SFTP_FPUTS(args, workingDir) < 0 ||
|
if (SFTP_FPUTS(args, workingDir) < 0 ||
|
||||||
SFTP_FPUTS(args, "\n") < 0)
|
SFTP_FPUTS(args, "\n") < 0) {
|
||||||
err_sys("fputs error");
|
err_msg("fputs error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1053,15 +1113,17 @@ THREAD_RETURN WOLFSSH_THREAD sftpclient_test(void* args)
|
||||||
n = NULL;
|
n = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
doCmds(args);
|
ret = doCmds(args);
|
||||||
|
|
||||||
XFREE(workingDir, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(workingDir, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
ret = wolfSSH_shutdown(ssh);
|
if (ret == WS_SUCCESS)
|
||||||
|
ret = wolfSSH_shutdown(ssh);
|
||||||
WCLOSESOCKET(sockFd);
|
WCLOSESOCKET(sockFd);
|
||||||
wolfSSH_free(ssh);
|
wolfSSH_free(ssh);
|
||||||
wolfSSH_CTX_free(ctx);
|
wolfSSH_CTX_free(ctx);
|
||||||
if (ret != WS_SUCCESS)
|
if (ret != WS_SUCCESS) {
|
||||||
err_sys("Closing stream failed.");
|
printf("error %d encountered\n", ret);
|
||||||
|
((func_args*)args)->return_code = ret;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue