check for socket disconnect error

pull/134/head
Jacob Barthelmeh 2019-02-07 11:07:10 -07:00
parent 249795ce9a
commit a6a1297c93
1 changed files with 115 additions and 53 deletions

View File

@ -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);
if (ret == WS_SUCCESS)
ret = wolfSSH_shutdown(ssh); 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;
} }