summaryrefslogtreecommitdiff
path: root/src/ssh.c
diff options
context:
space:
mode:
authorRyo Nakamura <upa@haeena.net>2022-10-23 19:11:07 +0900
committerRyo Nakamura <upa@haeena.net>2022-10-23 19:11:07 +0900
commite6339bf4641e8ba47b5221f9bb5a5adfefeb3c8e (patch)
tree682149f53034a8e078c4463ad0849acaaf343a11 /src/ssh.c
parent0213b316c5358c6232aed066ad29ff5397b6af7b (diff)
cleanup copy codes
Diffstat (limited to 'src/ssh.c')
-rw-r--r--src/ssh.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/ssh.c b/src/ssh.c
index 31a679f..536b63e 100644
--- a/src/ssh.c
+++ b/src/ssh.c
@@ -243,3 +243,40 @@ void ssh_sftp_close(sftp_session sftp)
ssh_disconnect(ssh);
ssh_free(ssh);
}
+
+
+/* from libssh/src/channels.c:
+ *
+ * All implementations MUST be able to process packets with an
+ * uncompressed payload length of 32768 bytes or less and a total packet
+ * size of 35000 bytes or less.
+ */
+#define CHANNEL_MAX_PACKET 32768
+
+int sftp_write2(sftp_file sf, const void *buf, size_t len)
+{
+ int n, ret, nbytes;
+
+ for (nbytes = 0; nbytes < len;) {
+ ret = sftp_write(sf, buf + nbytes,
+ min(len - nbytes, CHANNEL_MAX_PACKET));
+ if (ret < 0)
+ return ret;
+ nbytes += ret;
+ }
+ return nbytes;
+}
+
+int sftp_read2(sftp_file sf, void *buf, size_t len)
+{
+ int n, ret, nbytes;
+
+ for (nbytes = 0; nbytes < len;) {
+ ret = sftp_read(sf, buf + nbytes,
+ min(len - nbytes, CHANNEL_MAX_PACKET));
+ if (ret < 0)
+ return ret;
+ nbytes += ret;
+ }
+ return nbytes;
+}