aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac4
-rw-r--r--lib/ssh.c16
-rw-r--r--lib/ssh.h8
3 files changed, 23 insertions, 5 deletions
diff --git a/configure.ac b/configure.ac
index 633f9e49a..fe57875d9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1984,7 +1984,9 @@ if test X"$OPT_LIBSSH2" != Xno; then
dnl libssh2_version is a post 1.0 addition
dnl libssh2_init and libssh2_exit were added in 1.2.5
- AC_CHECK_FUNCS( libssh2_version libssh2_init libssh2_exit)
+ dnl libssh2_scp_send64 was added in 1.2.6
+ AC_CHECK_FUNCS( libssh2_version libssh2_init libssh2_exit \
+ libssh2_scp_send64 )
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$DIR_SSH2"
export LD_LIBRARY_PATH
diff --git a/lib/ssh.c b/lib/ssh.c
index 67995058a..fe8c16a24 100644
--- a/lib/ssh.c
+++ b/lib/ssh.c
@@ -486,6 +486,17 @@ static int sshkeycallback(CURL *easy,
#endif
/*
+ * Earlier libssh2 versions didn't do SCP properly beyond 32bit sizes on 32bit
+ * architectures so we check of the necessary function is present.
+ */
+#ifdef HAVE_LIBSSH2_SCP_SEND64
+#define SCP_SEND(a,b,c,d) libssh2_scp_send_ex(a, b, (int)(c), (size_t)d, 0, 0)
+#else
+#define SCP_SEND(a,b,c,d) libssh2_scp_send64(a, b, (int)(c), \
+ (libssh2_uint64_t)d, 0, 0)
+#endif
+
+/*
* ssh_statemach_act() runs the SSH state machine as far as it can without
* blocking and without reaching the end. The data the pointer 'block' points
* to will be set to TRUE if the libssh2 function returns LIBSSH2_ERROR_EAGAIN
@@ -2083,9 +2094,8 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
* directory in the path.
*/
sshc->ssh_channel =
- libssh2_scp_send_ex(sshc->ssh_session, sftp_scp->path,
- (int)(data->set.new_file_perms),
- (size_t)data->set.infilesize, 0, 0);
+ SCP_SEND(sshc->ssh_session, sftp_scp->path, data->set.new_file_perms,
+ data->set.infilesize);
if(!sshc->ssh_channel) {
if(libssh2_session_last_errno(sshc->ssh_session) ==
LIBSSH2_ERROR_EAGAIN) {
diff --git a/lib/ssh.h b/lib/ssh.h
index b92b5c03b..d0882e956 100644
--- a/lib/ssh.h
+++ b/lib/ssh.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -158,6 +158,12 @@ struct ssh_conn {
# undef HAVE_LIBSSH2_SFTP_SEEK64
#endif
+#if defined(LIBSSH2_VERSION_NUM) && (LIBSSH2_VERSION_NUM >= 0x010206)
+# define HAVE_LIBSSH2_SCP_SEND64 1
+#else
+# undef HAVE_LIBSSH2_SFTP_SEEK64
+#endif
+
extern const struct Curl_handler Curl_handler_scp;
extern const struct Curl_handler Curl_handler_sftp;