You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "Guillaume Nodet (JIRA)" <ji...@apache.org> on 2010/11/26 21:26:14 UTC
[jira] Resolved: (SSHD-89) Client pipe
[ https://issues.apache.org/jira/browse/SSHD-89?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Guillaume Nodet resolved SSHD-89.
---------------------------------
Resolution: Fixed
Fix Version/s: 0.6.0
Assignee: Guillaume Nodet
Committing to https://svn.apache.org/repos/asf/mina/sshd/trunk ...
M sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSession.java
M sshd-core/src/test/java/org/apache/sshd/ClientTest.java
Committed r1039551
> Client pipe
> -----------
>
> Key: SSHD-89
> URL: https://issues.apache.org/jira/browse/SSHD-89
> Project: MINA SSHD
> Issue Type: Bug
> Reporter: Doron Fediuck
> Assignee: Guillaume Nodet
> Fix For: 0.6.0
>
>
> I found a case where I need to implement something of this concept:
> "gzip /tmp/sample.txt | ssh user@some.host.com gunzip -c > /tmp/sample.txt"
> I'm implementing a client that gzip's the file and send it to a remote machine
> in stdin. Here's a snip of my implementation:
> // Create the GZIP output stream
> ByteArrayOutputStream baosGZipped = new ByteArrayOutputStream ();
> GZIPOutputStream gzOut = new GZIPOutputStream(baosGZipped);
> // Open the input file
> FileInputStream src = new FileInputStream(sourceFileName);
> byte[] buf = new byte[1024];
> int len;
> while ((len = src.read(buf)) > 0) {
> gzOut.write(buf, 0, len);
> }
> src.close();
> // Complete the GZIP file
> gzOut.finish();
> gzOut.flush();
> gzOut.close();
> //create channel
> ClientChannel channel = session.createExecChannel("gunzip -c >" + destFile);
> ByteArrayInputStream in = new ByteArrayInputStream(baosGZipped.toByteArray());
> channel.setIn(in);
> ByteArrayOutputStream out = new ByteArrayOutputStream();
> channel.setOut(out);
> ByteArrayOutputStream err = new ByteArrayOutputStream();
> channel.setErr(err);
> //open channel
> channel.open();
> //wait close
> channel.waitFor(ClientChannel.CLOSED, 0);
> What I discovered is that this will never end !!!
> The problem is, that there's a pumpInputStream in ClientInputStreamPump thread (org/apache/sshd/client/channel/ChannelSession.java),
> that will never end until closeFuture.isClosed. Since this does not happen, the unzip in the remote host doesn't end, and the channel will
> never close. This prevents the client from a proper pipe implementation.
> There should be a method to properly end this while-loop thus the remote side will be able to finish and close.
> ie-
> public void CloseStream() {
> streamStop = true;
> }
> and change pumpInputStream like this:
> -while (!closeFuture.isClosed())
> +while (!closeFuture.isClosed() && !streamStop)
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.