diff options
author | Aris Adamantiadis <aris@0xbadc0de.be> | 2009-08-23 23:24:46 +0200 |
---|---|---|
committer | Aris Adamantiadis <aris@0xbadc0de.be> | 2009-08-23 23:24:46 +0200 |
commit | 1df1f86f7e1b2e28610ba338bb7898d55e8bd7ce (patch) | |
tree | 26514a82aa3ebbd454595026d2c9ee1344861cce /libssh/scp.c | |
parent | f9db9c5a9c0e50fe2e50c00ee5ce4173b9bd3408 (diff) | |
download | libssh-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.c | 36 |
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; +} |