void* CLibssh2::open_scp_write_channel(const std::string& remote_filepath, int filemode, size_t filesize, time_t mtime, time_t atime) { LIBSSH2_CHANNEL* channel = NULL; LIBSSH2_SESSION* session = static_cast<LIBSSH2_SESSION*>(_session); for (;;) { channel = libssh2_scp_send_ex(session, remote_filepath.c_str(), filemode&0777, filesize, (long)mtime, (long)atime); if (channel != NULL) break; int errcode = get_session_errcode(); if (errcode != LIBSSH2_ERROR_EAGAIN) { THROW_EXCEPTION(get_session_errmsg(), errcode); } else { if (!timedwait_socket()) { THROW_SYSCALL_EXCEPTION("open scp channel timeout", ETIMEDOUT, "poll"); } } } return channel; }
CURLcode Curl_scp_do(struct connectdata *conn, bool *done) { struct stat sb; struct SSHPROTO *scp = conn->data->reqdata.proto.ssh; CURLcode res = CURLE_OK; *done = TRUE; /* unconditionally */ if (conn->data->set.upload) { /* * NOTE!!! libssh2 requires that the destination path is a full path * that includes the destination file and name OR ends in a "/" . * If this is not done the destination file will be named the * same name as the last directory in the path. */ scp->ssh_channel = libssh2_scp_send_ex(scp->ssh_session, scp->path, LIBSSH2_SFTP_S_IRUSR| LIBSSH2_SFTP_S_IWUSR| LIBSSH2_SFTP_S_IRGRP| LIBSSH2_SFTP_S_IROTH, conn->data->set.infilesize, 0, 0); if (!scp->ssh_channel) return CURLE_FAILED_INIT; /* upload data */ res = Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL); } else { /* * We must check the remote file, if it is a directory no vaules will * be set in sb */ curl_off_t bytecount; memset(&sb, 0, sizeof(struct stat)); scp->ssh_channel = libssh2_scp_recv(scp->ssh_session, scp->path, &sb); if (!scp->ssh_channel) { if ((sb.st_mode == 0) && (sb.st_atime == 0) && (sb.st_mtime == 0) && (sb.st_size == 0)) { /* Since sb is still empty, it is likely the file was not found */ return CURLE_REMOTE_FILE_NOT_FOUND; } return libssh2_error_to_CURLE(conn); } /* download data */ bytecount = (curl_off_t) sb.st_size; conn->data->reqdata.maxdownload = (curl_off_t) sb.st_size; res = Curl_setup_transfer(conn, FIRSTSOCKET, bytecount, FALSE, NULL, -1, NULL); } return res; }
static PyObject * session_scp_send(SSH2_SessionObj *self, PyObject *args) { char *path; int mode; unsigned long filesize; long mtime = 0; long atime = 0; LIBSSH2_CHANNEL *channel; if (!PyArg_ParseTuple(args, "sik|ll:scp_send", &path, &mode, &filesize, &mtime, &atime)) return NULL; Py_BEGIN_ALLOW_THREADS channel = libssh2_scp_send_ex(self->session, path, mode, filesize, mtime, atime); Py_END_ALLOW_THREADS CHECK_RETURN_POINTER(channel, self) return (PyObject *)SSH2_Channel_New(channel, self); }