File kdump-sftp-data-transfer.patch of Package kdump
From: Petr Tesarik <ptesarik@suse.cz>
Date: Wed, 15 Apr 2015 12:22:49 +0200
Subject: Implement file data transfer over SFTP
References: FATE#318874, bsc#917747
Patch-mainline: v0.8.16
Git-commit: d9c2ad963e8a968076f002ef6745b706093ac7c3
This commit implements the actual write into the file.
Signed-off-by: Petr Tesarik <ptesarik@suse.cz>
---
kdumptool/sshtransfer.cc | 50 +++++++++++++++++++++++++++++++++++++++++++++++
kdumptool/sshtransfer.h | 3 ++
2 files changed, 53 insertions(+)
--- a/kdumptool/sshtransfer.cc
+++ b/kdumptool/sshtransfer.cc
@@ -424,6 +424,28 @@ void SFTPTransfer::perform(DataProvider
string handle = createfile(fp);
try {
+ dataprovider->prepare();
+ ByteVector buffer(BUFSIZ);
+ off_t off = 0;
+ try {
+ while (true) {
+ char *bufp = (char*) buffer.data();
+ size_t len = dataprovider->getData(bufp, buffer.size());
+
+ // finished?
+ if (len == 0)
+ break;
+
+ buffer.resize(len);
+ writefile(handle, off, buffer);
+ off += buffer.size();
+ buffer.resize(buffer.capacity());
+ }
+ } catch (...) {
+ dataprovider->finish();
+ throw;
+ }
+ dataprovider->finish();
} catch (...) {
closefile(handle);
throw;
@@ -552,6 +574,34 @@ void SFTPTransfer::closefile(const std::
Stringutil::number2string(unsigned(type)));
unsigned long errcode = pkt.getInt32();
+ if (errcode != SSH_FX_OK)
+ throw KSFTPError("close failed on " + handle, errcode);
+}
+
+/* -------------------------------------------------------------------------- */
+void SFTPTransfer::writefile(const std::string &handle, off_t off,
+ const ByteVector &data)
+{
+ SFTPPacket pkt;
+ pkt.addByte(SSH_FXP_WRITE);
+ pkt.addInt32(nextId());
+ pkt.addString(handle);
+ pkt.addInt64(off);
+ pkt.addInt32(data.size());
+ pkt.addByteVector(data);
+ sendPacket(pkt);
+
+ recvPacket(pkt);
+ unsigned char type = pkt.getByte();
+ unsigned long id = pkt.getInt32();
+ if (id != m_lastid)
+ throw KError("SFTP request/reply id mismatch");
+
+ if (type != SSH_FXP_STATUS)
+ throw KError("Invalid response to SSH_FXP_WRITE: type " +
+ Stringutil::number2string(unsigned(type)));
+
+ unsigned long errcode = pkt.getInt32();
if (errcode != SSH_FX_OK)
throw KSFTPError("close failed on " + handle, errcode);
}
--- a/kdumptool/sshtransfer.h
+++ b/kdumptool/sshtransfer.h
@@ -124,6 +124,7 @@ enum {
SSH_FXP_VERSION = 2,
SSH_FXP_OPEN = 3,
SSH_FXP_CLOSE = 4,
+ SSH_FXP_WRITE = 6,
SSH_FXP_MKDIR = 14,
SSH_FXP_STAT = 17,
SSH_FXP_STATUS = 101,
@@ -230,6 +231,8 @@ class SFTPTransfer : public URLTransfer
void mkpath(const std::string &path);
std::string createfile(const std::string &file);
void closefile(const std::string &handle);
+ void writefile(const std::string &handle, off_t off,
+ const ByteVector &data);
private:
SubProcess m_process;