|
@@ -688,14 +688,11 @@ static CURLcode ssh_check_fingerprint(struct connectdata *conn)
|
|
|
sshc->actualcode = CURLE_PEER_FAILED_VERIFICATION;
|
|
|
return sshc->actualcode;
|
|
|
}
|
|
|
- else {
|
|
|
- infof(data, "MD5 checksum match!\n");
|
|
|
- /* as we already matched, we skip the check for known hosts */
|
|
|
- return CURLE_OK;
|
|
|
- }
|
|
|
+ infof(data, "MD5 checksum match!\n");
|
|
|
+ /* as we already matched, we skip the check for known hosts */
|
|
|
+ return CURLE_OK;
|
|
|
}
|
|
|
- else
|
|
|
- return ssh_knownhost(conn);
|
|
|
+ return ssh_knownhost(conn);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -738,7 +735,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc) {
|
|
|
+ if(rc) {
|
|
|
failf(data, "Failure establishing ssh session");
|
|
|
state(conn, SSH_SESSION_FREE);
|
|
|
sshc->actualcode = CURLE_FAILED_INIT;
|
|
@@ -782,16 +779,14 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
state(conn, SSH_AUTH_DONE);
|
|
|
break;
|
|
|
}
|
|
|
+ err = libssh2_session_last_errno(sshc->ssh_session);
|
|
|
+ if(err == LIBSSH2_ERROR_EAGAIN)
|
|
|
+ rc = LIBSSH2_ERROR_EAGAIN;
|
|
|
else {
|
|
|
- err = libssh2_session_last_errno(sshc->ssh_session);
|
|
|
- if(err == LIBSSH2_ERROR_EAGAIN)
|
|
|
- rc = LIBSSH2_ERROR_EAGAIN;
|
|
|
- else {
|
|
|
- state(conn, SSH_SESSION_FREE);
|
|
|
- sshc->actualcode = libssh2_session_error_to_CURLE(err);
|
|
|
- }
|
|
|
- break;
|
|
|
+ state(conn, SSH_SESSION_FREE);
|
|
|
+ sshc->actualcode = libssh2_session_error_to_CURLE(err);
|
|
|
}
|
|
|
+ break;
|
|
|
}
|
|
|
infof(data, "SSH authentication methods available: %s\n",
|
|
|
sshc->authlist);
|
|
@@ -942,7 +937,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc == 0) {
|
|
|
+ if(rc == 0) {
|
|
|
sshc->authed = TRUE;
|
|
|
infof(data, "Initialized password authentication\n");
|
|
|
state(conn, SSH_AUTH_DONE);
|
|
@@ -1081,7 +1076,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc == 0) {
|
|
|
+ if(rc == 0) {
|
|
|
sshc->authed = TRUE;
|
|
|
infof(data, "Initialized keyboard interactive authentication\n");
|
|
|
}
|
|
@@ -1120,21 +1115,19 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
*/
|
|
|
sshc->sftp_session = libssh2_sftp_init(sshc->ssh_session);
|
|
|
if(!sshc->sftp_session) {
|
|
|
+ char *err_msg;
|
|
|
if(libssh2_session_last_errno(sshc->ssh_session) ==
|
|
|
LIBSSH2_ERROR_EAGAIN) {
|
|
|
rc = LIBSSH2_ERROR_EAGAIN;
|
|
|
break;
|
|
|
}
|
|
|
- else {
|
|
|
- char *err_msg;
|
|
|
|
|
|
- (void)libssh2_session_last_error(sshc->ssh_session,
|
|
|
- &err_msg, NULL, 0);
|
|
|
- failf(data, "Failure initializing sftp session: %s", err_msg);
|
|
|
- state(conn, SSH_SESSION_FREE);
|
|
|
- sshc->actualcode = CURLE_FAILED_INIT;
|
|
|
- break;
|
|
|
- }
|
|
|
+ (void)libssh2_session_last_error(sshc->ssh_session,
|
|
|
+ &err_msg, NULL, 0);
|
|
|
+ failf(data, "Failure initializing sftp session: %s", err_msg);
|
|
|
+ state(conn, SSH_SESSION_FREE);
|
|
|
+ sshc->actualcode = CURLE_FAILED_INIT;
|
|
|
+ break;
|
|
|
}
|
|
|
state(conn, SSH_SFTP_REALPATH);
|
|
|
break;
|
|
@@ -1151,7 +1144,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc > 0) {
|
|
|
+ if(rc > 0) {
|
|
|
/* It seems that this string is not always NULL terminated */
|
|
|
tempHome[rc] = '\0';
|
|
|
sshc->homedir = strdup(tempHome);
|
|
@@ -1265,7 +1258,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
state(conn, SSH_SFTP_NEXT_QUOTE);
|
|
|
break;
|
|
|
}
|
|
|
- else if(cmd) {
|
|
|
+ if(cmd) {
|
|
|
/*
|
|
|
* the arguments following the command must be separated from the
|
|
|
* command with a space so we can check for it unconditionally
|
|
@@ -1325,7 +1318,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
state(conn, SSH_SFTP_QUOTE_STAT);
|
|
|
break;
|
|
|
}
|
|
|
- else if(strncasecompare(cmd, "ln ", 3) ||
|
|
|
+ if(strncasecompare(cmd, "ln ", 3) ||
|
|
|
strncasecompare(cmd, "symlink ", 8)) {
|
|
|
/* symbolic linking */
|
|
|
/* sshc->quote_path1 is the source */
|
|
@@ -1447,7 +1440,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc != 0 && !sshc->acceptfail) { /* get those attributes */
|
|
|
+ if(rc != 0 && !sshc->acceptfail) { /* get those attributes */
|
|
|
err = sftp_libssh2_last_error(sshc->sftp_session);
|
|
|
Curl_safefree(sshc->quote_path1);
|
|
|
Curl_safefree(sshc->quote_path2);
|
|
@@ -1518,7 +1511,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc != 0 && !sshc->acceptfail) {
|
|
|
+ if(rc != 0 && !sshc->acceptfail) {
|
|
|
err = sftp_libssh2_last_error(sshc->sftp_session);
|
|
|
Curl_safefree(sshc->quote_path1);
|
|
|
Curl_safefree(sshc->quote_path2);
|
|
@@ -1541,7 +1534,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc != 0 && !sshc->acceptfail) {
|
|
|
+ if(rc != 0 && !sshc->acceptfail) {
|
|
|
err = sftp_libssh2_last_error(sshc->sftp_session);
|
|
|
Curl_safefree(sshc->quote_path1);
|
|
|
Curl_safefree(sshc->quote_path2);
|
|
@@ -1562,7 +1555,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc != 0 && !sshc->acceptfail) {
|
|
|
+ if(rc != 0 && !sshc->acceptfail) {
|
|
|
err = sftp_libssh2_last_error(sshc->sftp_session);
|
|
|
Curl_safefree(sshc->quote_path1);
|
|
|
failf(data, "mkdir command failed: %s", sftp_libssh2_strerror(err));
|
|
@@ -1586,7 +1579,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc != 0 && !sshc->acceptfail) {
|
|
|
+ if(rc != 0 && !sshc->acceptfail) {
|
|
|
err = sftp_libssh2_last_error(sshc->sftp_session);
|
|
|
Curl_safefree(sshc->quote_path1);
|
|
|
Curl_safefree(sshc->quote_path2);
|
|
@@ -1605,7 +1598,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc != 0 && !sshc->acceptfail) {
|
|
|
+ if(rc != 0 && !sshc->acceptfail) {
|
|
|
err = sftp_libssh2_last_error(sshc->sftp_session);
|
|
|
Curl_safefree(sshc->quote_path1);
|
|
|
failf(data, "rmdir command failed: %s", sftp_libssh2_strerror(err));
|
|
@@ -1623,7 +1616,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc != 0 && !sshc->acceptfail) {
|
|
|
+ if(rc != 0 && !sshc->acceptfail) {
|
|
|
err = sftp_libssh2_last_error(sshc->sftp_session);
|
|
|
Curl_safefree(sshc->quote_path1);
|
|
|
failf(data, "rm command failed: %s", sftp_libssh2_strerror(err));
|
|
@@ -1646,7 +1639,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc != 0 && !sshc->acceptfail) {
|
|
|
+ if(rc != 0 && !sshc->acceptfail) {
|
|
|
err = sftp_libssh2_last_error(sshc->sftp_session);
|
|
|
Curl_safefree(sshc->quote_path1);
|
|
|
failf(data, "statvfs command failed: %s", sftp_libssh2_strerror(err));
|
|
@@ -1709,7 +1702,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc == 0) {
|
|
|
+ if(rc == 0) {
|
|
|
data->info.filetime = (long)attrs.mtime;
|
|
|
}
|
|
|
|
|
@@ -1747,7 +1740,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc) {
|
|
|
+ if(rc) {
|
|
|
data->state.resume_from = 0;
|
|
|
}
|
|
|
else {
|
|
@@ -1782,48 +1775,47 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
|
|
|
if(LIBSSH2_ERROR_EAGAIN == rc)
|
|
|
break;
|
|
|
- else {
|
|
|
- if(LIBSSH2_ERROR_SFTP_PROTOCOL == rc)
|
|
|
- /* only when there was an SFTP protocol error can we extract
|
|
|
- the sftp error! */
|
|
|
- err = sftp_libssh2_last_error(sshc->sftp_session);
|
|
|
- else
|
|
|
- err = -1; /* not an sftp error at all */
|
|
|
|
|
|
- if(sshc->secondCreateDirs) {
|
|
|
- state(conn, SSH_SFTP_CLOSE);
|
|
|
- sshc->actualcode = err>= LIBSSH2_FX_OK?
|
|
|
- sftp_libssh2_error_to_CURLE(err):CURLE_SSH;
|
|
|
- failf(data, "Creating the dir/file failed: %s",
|
|
|
- sftp_libssh2_strerror(err));
|
|
|
- break;
|
|
|
- }
|
|
|
- else if(((err == LIBSSH2_FX_NO_SUCH_FILE) ||
|
|
|
- (err == LIBSSH2_FX_FAILURE) ||
|
|
|
- (err == LIBSSH2_FX_NO_SUCH_PATH)) &&
|
|
|
- (data->set.ftp_create_missing_dirs &&
|
|
|
- (strlen(sftp_scp->path) > 1))) {
|
|
|
- /* try to create the path remotely */
|
|
|
- rc = 0; /* clear rc and continue */
|
|
|
- sshc->secondCreateDirs = 1;
|
|
|
- state(conn, SSH_SFTP_CREATE_DIRS_INIT);
|
|
|
- break;
|
|
|
- }
|
|
|
+ if(LIBSSH2_ERROR_SFTP_PROTOCOL == rc)
|
|
|
+ /* only when there was an SFTP protocol error can we extract
|
|
|
+ the sftp error! */
|
|
|
+ err = sftp_libssh2_last_error(sshc->sftp_session);
|
|
|
+ else
|
|
|
+ err = -1; /* not an sftp error at all */
|
|
|
+
|
|
|
+ if(sshc->secondCreateDirs) {
|
|
|
state(conn, SSH_SFTP_CLOSE);
|
|
|
sshc->actualcode = err>= LIBSSH2_FX_OK?
|
|
|
sftp_libssh2_error_to_CURLE(err):CURLE_SSH;
|
|
|
- if(!sshc->actualcode) {
|
|
|
- /* Sometimes, for some reason libssh2_sftp_last_error() returns
|
|
|
- zero even though libssh2_sftp_open() failed previously! We need
|
|
|
- to work around that! */
|
|
|
- sshc->actualcode = CURLE_SSH;
|
|
|
- err=-1;
|
|
|
- }
|
|
|
- failf(data, "Upload failed: %s (%d/%d)",
|
|
|
- err>= LIBSSH2_FX_OK?sftp_libssh2_strerror(err):"ssh error",
|
|
|
- err, rc);
|
|
|
+ failf(data, "Creating the dir/file failed: %s",
|
|
|
+ sftp_libssh2_strerror(err));
|
|
|
break;
|
|
|
}
|
|
|
+ if(((err == LIBSSH2_FX_NO_SUCH_FILE) ||
|
|
|
+ (err == LIBSSH2_FX_FAILURE) ||
|
|
|
+ (err == LIBSSH2_FX_NO_SUCH_PATH)) &&
|
|
|
+ (data->set.ftp_create_missing_dirs &&
|
|
|
+ (strlen(sftp_scp->path) > 1))) {
|
|
|
+ /* try to create the path remotely */
|
|
|
+ rc = 0; /* clear rc and continue */
|
|
|
+ sshc->secondCreateDirs = 1;
|
|
|
+ state(conn, SSH_SFTP_CREATE_DIRS_INIT);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ state(conn, SSH_SFTP_CLOSE);
|
|
|
+ sshc->actualcode = err>= LIBSSH2_FX_OK?
|
|
|
+ sftp_libssh2_error_to_CURLE(err):CURLE_SSH;
|
|
|
+ if(!sshc->actualcode) {
|
|
|
+ /* Sometimes, for some reason libssh2_sftp_last_error() returns
|
|
|
+ zero even though libssh2_sftp_open() failed previously! We need
|
|
|
+ to work around that! */
|
|
|
+ sshc->actualcode = CURLE_SSH;
|
|
|
+ err=-1;
|
|
|
+ }
|
|
|
+ failf(data, "Upload failed: %s (%d/%d)",
|
|
|
+ err>= LIBSSH2_FX_OK?sftp_libssh2_strerror(err):"ssh error",
|
|
|
+ err, rc);
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
/* If we have a restart point then we need to seek to the correct
|
|
@@ -1836,32 +1828,30 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
}
|
|
|
|
|
|
if(seekerr != CURL_SEEKFUNC_OK) {
|
|
|
+ curl_off_t passed=0;
|
|
|
|
|
|
if(seekerr != CURL_SEEKFUNC_CANTSEEK) {
|
|
|
failf(data, "Could not seek stream");
|
|
|
return CURLE_FTP_COULDNT_USE_REST;
|
|
|
}
|
|
|
/* seekerr == CURL_SEEKFUNC_CANTSEEK (can't seek to offset) */
|
|
|
- else {
|
|
|
- curl_off_t passed=0;
|
|
|
- do {
|
|
|
- size_t readthisamountnow =
|
|
|
- (data->state.resume_from - passed > CURL_OFF_T_C(BUFSIZE)) ?
|
|
|
- BUFSIZE : curlx_sotouz(data->state.resume_from - passed);
|
|
|
-
|
|
|
- size_t actuallyread =
|
|
|
- data->state.fread_func(data->state.buffer, 1,
|
|
|
- readthisamountnow, data->state.in);
|
|
|
-
|
|
|
- passed += actuallyread;
|
|
|
- if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
|
|
|
- /* this checks for greater-than only to make sure that the
|
|
|
- CURL_READFUNC_ABORT return code still aborts */
|
|
|
- failf(data, "Failed to read data");
|
|
|
- return CURLE_FTP_COULDNT_USE_REST;
|
|
|
- }
|
|
|
- } while(passed < data->state.resume_from);
|
|
|
- }
|
|
|
+ do {
|
|
|
+ size_t readthisamountnow =
|
|
|
+ (data->state.resume_from - passed > CURL_OFF_T_C(BUFSIZE)) ?
|
|
|
+ BUFSIZE : curlx_sotouz(data->state.resume_from - passed);
|
|
|
+
|
|
|
+ size_t actuallyread =
|
|
|
+ data->state.fread_func(data->state.buffer, 1,
|
|
|
+ readthisamountnow, data->state.in);
|
|
|
+
|
|
|
+ passed += actuallyread;
|
|
|
+ if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
|
|
|
+ /* this checks for greater-than only to make sure that the
|
|
|
+ CURL_READFUNC_ABORT return code still aborts */
|
|
|
+ failf(data, "Failed to read data");
|
|
|
+ return CURLE_FTP_COULDNT_USE_REST;
|
|
|
+ }
|
|
|
+ } while(passed < data->state.resume_from);
|
|
|
}
|
|
|
|
|
|
/* now, decrease the size of the read */
|
|
@@ -1926,9 +1916,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
state(conn, SSH_SFTP_CREATE_DIRS_MKDIR);
|
|
|
break;
|
|
|
}
|
|
|
- else {
|
|
|
- state(conn, SSH_SFTP_UPLOAD_INIT);
|
|
|
- }
|
|
|
+ state(conn, SSH_SFTP_UPLOAD_INIT);
|
|
|
break;
|
|
|
|
|
|
case SSH_SFTP_CREATE_DIRS_MKDIR:
|
|
@@ -1956,9 +1944,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
sshc->actualcode = result?result:CURLE_SSH;
|
|
|
break;
|
|
|
}
|
|
|
- else {
|
|
|
- rc = 0; /* clear rc and continue */
|
|
|
- }
|
|
|
+ rc = 0; /* clear rc and continue */
|
|
|
}
|
|
|
state(conn, SSH_SFTP_CREATE_DIRS);
|
|
|
break;
|
|
@@ -1985,15 +1971,13 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
rc = LIBSSH2_ERROR_EAGAIN;
|
|
|
break;
|
|
|
}
|
|
|
- else {
|
|
|
- err = sftp_libssh2_last_error(sshc->sftp_session);
|
|
|
- failf(data, "Could not open directory for reading: %s",
|
|
|
- sftp_libssh2_strerror(err));
|
|
|
- state(conn, SSH_SFTP_CLOSE);
|
|
|
- result = sftp_libssh2_error_to_CURLE(err);
|
|
|
- sshc->actualcode = result?result:CURLE_SSH;
|
|
|
- break;
|
|
|
- }
|
|
|
+ err = sftp_libssh2_last_error(sshc->sftp_session);
|
|
|
+ failf(data, "Could not open directory for reading: %s",
|
|
|
+ sftp_libssh2_strerror(err));
|
|
|
+ state(conn, SSH_SFTP_CLOSE);
|
|
|
+ result = sftp_libssh2_error_to_CURLE(err);
|
|
|
+ sshc->actualcode = result?result:CURLE_SSH;
|
|
|
+ break;
|
|
|
}
|
|
|
sshc->readdir_filename = malloc(PATH_MAX+1);
|
|
|
if(!sshc->readdir_filename) {
|
|
@@ -2200,15 +2184,13 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
rc = LIBSSH2_ERROR_EAGAIN;
|
|
|
break;
|
|
|
}
|
|
|
- else {
|
|
|
- err = sftp_libssh2_last_error(sshc->sftp_session);
|
|
|
- failf(data, "Could not open remote file for reading: %s",
|
|
|
- sftp_libssh2_strerror(err));
|
|
|
- state(conn, SSH_SFTP_CLOSE);
|
|
|
- result = sftp_libssh2_error_to_CURLE(err);
|
|
|
- sshc->actualcode = result?result:CURLE_SSH;
|
|
|
- break;
|
|
|
- }
|
|
|
+ err = sftp_libssh2_last_error(sshc->sftp_session);
|
|
|
+ failf(data, "Could not open remote file for reading: %s",
|
|
|
+ sftp_libssh2_strerror(err));
|
|
|
+ state(conn, SSH_SFTP_CLOSE);
|
|
|
+ result = sftp_libssh2_error_to_CURLE(err);
|
|
|
+ sshc->actualcode = result?result:CURLE_SSH;
|
|
|
+ break;
|
|
|
}
|
|
|
state(conn, SSH_SFTP_DOWNLOAD_STAT);
|
|
|
break;
|
|
@@ -2223,7 +2205,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc ||
|
|
|
+ if(rc ||
|
|
|
!(attrs.flags & LIBSSH2_SFTP_ATTR_SIZE) ||
|
|
|
(attrs.filesize == 0)) {
|
|
|
/*
|
|
@@ -2321,18 +2303,17 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
state(conn, SSH_STOP);
|
|
|
break;
|
|
|
}
|
|
|
- else {
|
|
|
- Curl_setup_transfer(conn, FIRSTSOCKET, data->req.size,
|
|
|
- FALSE, NULL, -1, NULL);
|
|
|
+ Curl_setup_transfer(conn, FIRSTSOCKET, data->req.size,
|
|
|
+ FALSE, NULL, -1, NULL);
|
|
|
|
|
|
- /* not set by Curl_setup_transfer to preserve keepon bits */
|
|
|
- conn->writesockfd = conn->sockfd;
|
|
|
+ /* not set by Curl_setup_transfer to preserve keepon bits */
|
|
|
+ conn->writesockfd = conn->sockfd;
|
|
|
+
|
|
|
+ /* we want to use the _receiving_ function even when the socket turns
|
|
|
+ out writableable as the underlying libssh2 recv function will deal
|
|
|
+ with both accordingly */
|
|
|
+ conn->cselect_bits = CURL_CSELECT_IN;
|
|
|
|
|
|
- /* we want to use the _receiving_ function even when the socket turns
|
|
|
- out writableable as the underlying libssh2 recv function will deal
|
|
|
- with both accordingly */
|
|
|
- conn->cselect_bits = CURL_CSELECT_IN;
|
|
|
- }
|
|
|
if(result) {
|
|
|
/* this should never occur; the close state should be entered
|
|
|
at the time the error occurs */
|
|
@@ -2350,7 +2331,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc < 0) {
|
|
|
+ if(rc < 0) {
|
|
|
infof(data, "Failed to close libssh2 file\n");
|
|
|
}
|
|
|
sshc->sftp_handle = NULL;
|
|
@@ -2384,7 +2365,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc < 0) {
|
|
|
+ if(rc < 0) {
|
|
|
infof(data, "Failed to close libssh2 file\n");
|
|
|
}
|
|
|
sshc->sftp_handle = NULL;
|
|
@@ -2394,7 +2375,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc < 0) {
|
|
|
+ if(rc < 0) {
|
|
|
infof(data, "Failed to stop libssh2 sftp subsystem\n");
|
|
|
}
|
|
|
sshc->sftp_session = NULL;
|
|
@@ -2439,22 +2420,21 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
SCP_SEND(sshc->ssh_session, sftp_scp->path, data->set.new_file_perms,
|
|
|
data->state.infilesize);
|
|
|
if(!sshc->ssh_channel) {
|
|
|
+ int ssh_err;
|
|
|
+ char *err_msg;
|
|
|
+
|
|
|
if(libssh2_session_last_errno(sshc->ssh_session) ==
|
|
|
LIBSSH2_ERROR_EAGAIN) {
|
|
|
rc = LIBSSH2_ERROR_EAGAIN;
|
|
|
break;
|
|
|
}
|
|
|
- else {
|
|
|
- int ssh_err;
|
|
|
- char *err_msg;
|
|
|
|
|
|
- ssh_err = (int)(libssh2_session_last_error(sshc->ssh_session,
|
|
|
- &err_msg, NULL, 0));
|
|
|
- failf(conn->data, "%s", err_msg);
|
|
|
- state(conn, SSH_SCP_CHANNEL_FREE);
|
|
|
- sshc->actualcode = libssh2_session_error_to_CURLE(ssh_err);
|
|
|
- break;
|
|
|
- }
|
|
|
+ ssh_err = (int)(libssh2_session_last_error(sshc->ssh_session,
|
|
|
+ &err_msg, NULL, 0));
|
|
|
+ failf(conn->data, "%s", err_msg);
|
|
|
+ state(conn, SSH_SCP_CHANNEL_FREE);
|
|
|
+ sshc->actualcode = libssh2_session_error_to_CURLE(ssh_err);
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
/* upload data */
|
|
@@ -2509,22 +2489,22 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
#endif
|
|
|
|
|
|
if(!sshc->ssh_channel) {
|
|
|
+ int ssh_err;
|
|
|
+ char *err_msg;
|
|
|
+
|
|
|
if(libssh2_session_last_errno(sshc->ssh_session) ==
|
|
|
LIBSSH2_ERROR_EAGAIN) {
|
|
|
rc = LIBSSH2_ERROR_EAGAIN;
|
|
|
break;
|
|
|
}
|
|
|
- else {
|
|
|
- int ssh_err;
|
|
|
- char *err_msg;
|
|
|
|
|
|
- ssh_err = (int)(libssh2_session_last_error(sshc->ssh_session,
|
|
|
- &err_msg, NULL, 0));
|
|
|
- failf(conn->data, "%s", err_msg);
|
|
|
- state(conn, SSH_SCP_CHANNEL_FREE);
|
|
|
- sshc->actualcode = libssh2_session_error_to_CURLE(ssh_err);
|
|
|
- break;
|
|
|
- }
|
|
|
+
|
|
|
+ ssh_err = (int)(libssh2_session_last_error(sshc->ssh_session,
|
|
|
+ &err_msg, NULL, 0));
|
|
|
+ failf(conn->data, "%s", err_msg);
|
|
|
+ state(conn, SSH_SCP_CHANNEL_FREE);
|
|
|
+ sshc->actualcode = libssh2_session_error_to_CURLE(ssh_err);
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
/* download data */
|
|
@@ -2562,7 +2542,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc) {
|
|
|
+ if(rc) {
|
|
|
infof(data, "Failed to send libssh2 channel EOF\n");
|
|
|
}
|
|
|
}
|
|
@@ -2575,7 +2555,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc) {
|
|
|
+ if(rc) {
|
|
|
infof(data, "Failed to get channel EOF: %d\n", rc);
|
|
|
}
|
|
|
}
|
|
@@ -2588,7 +2568,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc) {
|
|
|
+ if(rc) {
|
|
|
infof(data, "Channel failed to close: %d\n", rc);
|
|
|
}
|
|
|
}
|
|
@@ -2601,7 +2581,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc < 0) {
|
|
|
+ if(rc < 0) {
|
|
|
infof(data, "Failed to free libssh2 scp subsystem\n");
|
|
|
}
|
|
|
sshc->ssh_channel = NULL;
|
|
@@ -2623,7 +2603,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc < 0) {
|
|
|
+ if(rc < 0) {
|
|
|
infof(data, "Failed to free libssh2 scp subsystem\n");
|
|
|
}
|
|
|
sshc->ssh_channel = NULL;
|
|
@@ -2634,7 +2614,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc < 0) {
|
|
|
+ if(rc < 0) {
|
|
|
infof(data, "Failed to disconnect libssh2 session\n");
|
|
|
}
|
|
|
}
|
|
@@ -2659,7 +2639,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc < 0) {
|
|
|
+ if(rc < 0) {
|
|
|
infof(data, "Failed to disconnect from libssh2 agent\n");
|
|
|
}
|
|
|
libssh2_agent_free(sshc->ssh_agent);
|
|
@@ -2677,7 +2657,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
|
|
break;
|
|
|
}
|
|
|
- else if(rc < 0) {
|
|
|
+ if(rc < 0) {
|
|
|
infof(data, "Failed to free libssh2 session\n");
|
|
|
}
|
|
|
sshc->ssh_session = NULL;
|
|
@@ -2843,6 +2823,7 @@ static CURLcode ssh_block_statemach(struct connectdata *conn,
|
|
|
while((sshc->state != SSH_STOP) && !result) {
|
|
|
bool block;
|
|
|
long left;
|
|
|
+ struct timeval now = Curl_tvnow();
|
|
|
|
|
|
result = ssh_statemach_act(conn, &block);
|
|
|
if(result)
|
|
@@ -2850,12 +2831,10 @@ static CURLcode ssh_block_statemach(struct connectdata *conn,
|
|
|
|
|
|
if(Curl_pgrsUpdate(conn))
|
|
|
return CURLE_ABORTED_BY_CALLBACK;
|
|
|
- else {
|
|
|
- struct timeval now = Curl_tvnow();
|
|
|
- result = Curl_speedcheck(data, now);
|
|
|
- if(result)
|
|
|
- break;
|
|
|
- }
|
|
|
+
|
|
|
+ result = Curl_speedcheck(data, now);
|
|
|
+ if(result)
|
|
|
+ break;
|
|
|
|
|
|
left = Curl_timeleft(data, NULL, duringconnect);
|
|
|
if(left < 0) {
|