aboutsummaryrefslogtreecommitdiff
path: root/libssh/scp.c
diff options
context:
space:
mode:
authorAris Adamantiadis <aris@0xbadc0de.be>2009-08-23 23:24:46 +0200
committerAris Adamantiadis <aris@0xbadc0de.be>2009-08-23 23:24:46 +0200
commit1df1f86f7e1b2e28610ba338bb7898d55e8bd7ce (patch)
tree26514a82aa3ebbd454595026d2c9ee1344861cce /libssh/scp.c
parentf9db9c5a9c0e50fe2e50c00ee5ce4173b9bd3408 (diff)
downloadlibssh-1df1f86f7e1b2e28610ba338bb7898d55e8bd7ce.tar.gz
libssh-1df1f86f7e1b2e28610ba338bb7898d55e8bd7ce.tar.xz
libssh-1df1f86f7e1b2e28610ba338bb7898d55e8bd7ce.zip
added ssh_scp_read
Diffstat (limited to 'libssh/scp.c')
-rw-r--r--libssh/scp.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/libssh/scp.c b/libssh/scp.c
index c3d7e494..2c891472 100644
--- a/libssh/scp.c
+++ b/libssh/scp.c
@@ -423,3 +423,39 @@ int ssh_scp_accept_request(ssh_scp scp){
scp->state=SSH_SCP_READ_INITED;
return SSH_OK;
}
+
+/** @brief Read from a remote scp file
+ * @param buffer Destination buffer
+ * @param size Size of the buffer
+ * @returns Number of bytes read
+ * @returns SSH_ERROR An error happened while reading
+ */
+int ssh_scp_read(ssh_scp scp, void *buffer, size_t size){
+ int r;
+ if(scp->state == SSH_SCP_READ_REQUESTED && scp->request_type == SSH_SCP_REQUEST_NEWFILE){
+ r=ssh_scp_accept_request(scp);
+ if(r==SSH_ERROR)
+ return r;
+ }
+ if(scp->state != SSH_SCP_READ_READING){
+ ssh_set_error(scp->session,SSH_FATAL,"ssh_scp_read called under invalid state");
+ return SSH_ERROR;
+ }
+ if(scp->processed + size > scp->filelen)
+ size = scp->filelen - scp->processed;
+ if(size > 65536)
+ size=65536; /* avoid too large reads */
+ r=channel_read(scp->channel,buffer,size,0);
+ if(r != SSH_ERROR)
+ scp->processed += r;
+ else {
+ scp->state=SSH_SCP_ERROR;
+ return SSH_ERROR;
+ }
+ /* Check if we arrived at end of file */
+ if(scp->processed == scp->filelen) {
+ scp->processed=scp->filelen=0;
+ scp->state=SSH_SCP_READ_INITED;
+ }
+ return r;
+}