From f6251734fcb118bb513f8484b45aa653f5c76eb1 Mon Sep 17 00:00:00 2001 From: Dan Fandrich Date: Thu, 30 Aug 2007 23:03:59 +0000 Subject: [PATCH] Added more accurate error code returns from SFTP operations. Added test case 615 to test an SFTP upload failure. --- CHANGES | 3 +++ RELEASE-NOTES | 1 + lib/ssh.c | 44 +++++++++++++++++++++++++++++++----------- tests/data/Makefile.am | 3 ++- tests/data/test615 | 44 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 83 insertions(+), 12 deletions(-) create mode 100644 tests/data/test615 diff --git a/CHANGES b/CHANGES index 0f2bb3c76..9f723b585 100644 --- a/CHANGES +++ b/CHANGES @@ -52,6 +52,9 @@ Dan F (30 August 2007) - Documented some newer error codes in libcurl-error(3) +- Added more accurate error code returns from SFTP operations. Added test + case 615 to test an SFTP upload failure. + Dan F (28 August 2007) - Some minor internal type and const changes based on a splint scan. diff --git a/RELEASE-NOTES b/RELEASE-NOTES index ea8a4baaf..66716a59e 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -20,6 +20,7 @@ This release includes the following changes: o builds and runs on OS/400 o several error codes and options were marked as obsolete and subject to future removal (set CURL_NO_OLDIES to see if your application is using them) + o SFTP errors can return more specific error codes This release includes the following bugfixes: diff --git a/lib/ssh.c b/lib/ssh.c index 538d1d537..50ec429b3 100644 --- a/lib/ssh.c +++ b/lib/ssh.c @@ -95,7 +95,6 @@ #include "speedcheck.h" #include "getinfo.h" -#include "strtoofft.h" #include "strequal.h" #include "sslgen.h" #include "connect.h" @@ -166,15 +165,32 @@ kbd_callback(const char *name, int name_len, const char *instruction, static CURLcode sftp_libssh2_error_to_CURLE(unsigned long err) { - if (err == LIBSSH2_FX_OK) - return CURLE_OK; + switch (err) { + case LIBSSH2_FX_OK: + return CURLE_OK; - /* TODO: map some of the libssh2 errors to the more appropriate CURLcode - error code, and possibly add a few new SSH-related one. We must however - not return or even depend on libssh2 errors in the public libcurl API */ + case LIBSSH2_FX_NO_SUCH_FILE: + case LIBSSH2_FX_NO_SUCH_PATH: + return CURLE_REMOTE_FILE_NOT_FOUND; - if (err == LIBSSH2_FX_NO_SUCH_FILE) - return CURLE_REMOTE_FILE_NOT_FOUND; + case LIBSSH2_FX_PERMISSION_DENIED: + case LIBSSH2_FX_WRITE_PROTECT: + case LIBSSH2_FX_LOCK_CONFlICT: + return CURLE_REMOTE_ACCESS_DENIED; + + case LIBSSH2_FX_NO_SPACE_ON_FILESYSTEM: + case LIBSSH2_FX_QUOTA_EXCEEDED: + return CURLE_REMOTE_DISK_FULL; + + case LIBSSH2_FX_FILE_ALREADY_EXISTS: + return CURLE_REMOTE_FILE_EXISTS; + + case LIBSSH2_FX_DIR_NOT_EMPTY: + return CURLE_QUOTE_ERROR; + + default: + break; + } return CURLE_SSH; } @@ -183,6 +199,11 @@ static CURLcode libssh2_session_error_to_CURLE(int err) { if (err == LIBSSH2_ERROR_ALLOC) return CURLE_OUT_OF_MEMORY; + + /* TODO: map some more of the libssh2 errors to the more appropriate CURLcode + error code, and possibly add a few new SSH-related one. We must however + not return or even depend on libssh2 errors in the public libcurl API */ + return CURLE_SSH; } @@ -1065,15 +1086,16 @@ static CURLcode ssh_statemach_act(struct connectdata *conn) * same name as the last directory in the path. */ sftp_scp->sftp_handle = - libssh2_sftp_open(sftp_scp->sftp_session, sftp_scp->path, - LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC, - data->set.new_file_perms); + libssh2_sftp_open(sftp_scp->sftp_session, sftp_scp->path, + LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC, + data->set.new_file_perms); if (!sftp_scp->sftp_handle) { if (libssh2_session_last_errno(sftp_scp->ssh_session) == LIBSSH2_ERROR_EAGAIN) { break; } else { err = libssh2_sftp_last_error(sftp_scp->sftp_session); + failf(data, "Upload failed: %s", sftp_libssh2_strerror(err)); if (sshc->secondCreateDirs) { state(conn, SSH_SFTP_CLOSE); sshc->actualCode = err; diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 5506cf2d1..a8c7691e5 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -43,4 +43,5 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \ test296 test297 test298 test610 test611 test612 test406 test407 test408 \ test409 test613 test614 test700 test701 test702 test704 test705 test703 \ test706 test707 test350 test351 test352 test353 test289 test540 test354 \ - test231 test1000 test1001 test1002 test1003 test1004 test1005 test1006 + test231 test1000 test1001 test1002 test1003 test1004 test1005 test1006 \ + test615 diff --git a/tests/data/test615 b/tests/data/test615 new file mode 100644 index 000000000..124982644 --- /dev/null +++ b/tests/data/test615 @@ -0,0 +1,44 @@ + + + +SFTP +SFTP put +FAILURE + + + +# +# Client-side + + +sftp + + +perl %SRCDIR/libtest/test613.pl prepare %PWD/log/test615.dir + + +SFTP put remote failure + + +--key curl_client_key --pubkey curl_client_key.pub -u %USER: -T log/file615.txt sftp://%HOSTIP:%SSHPORT%PWD/log/test615.dir/rofile.txt + + +perl %SRCDIR/libtest/test613.pl postprocess %PWD/log/test615.dir + + +Test data +for ssh upload test + + + +# +# Verify data after the test has been "shot" + + +9 + + +disable + + +