148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood/* 248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * Copyright (c) 2006-2011 Christian Plattner. All rights reserved. 348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * Please refer to the LICENSE.txt for licensing details. 448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodpackage ch.ethz.ssh2; 648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodimport java.io.IOException; 848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodimport java.io.InputStream; 948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodimport java.io.OutputStream; 1048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodimport java.net.InetAddress; 1148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 1248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodimport ch.ethz.ssh2.channel.Channel; 1348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodimport ch.ethz.ssh2.channel.ChannelManager; 1448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 1548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood/** 1648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * A <code>LocalStreamForwarder</code> forwards an Input- and Outputstream 1748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * pair via the secure tunnel to another host (which may or may not be identical 1848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * to the remote SSH-2 server). 1948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * 2048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @author Christian Plattner 2148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @version 2.50, 03/15/10 2248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 2348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodpublic class LocalStreamForwarder 2448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood{ 2548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood private ChannelManager cm; 2648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 2748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood private Channel cn; 2848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 2948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood LocalStreamForwarder(ChannelManager cm, String host_to_connect, int port_to_connect) throws IOException 3048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood { 3148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood this.cm = cm; 3248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood cn = cm.openDirectTCPIPChannel(host_to_connect, port_to_connect, 3348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood InetAddress.getLocalHost().getHostAddress(), 0); 3448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood } 3548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 3648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood /** 3748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @return An <code>InputStream</code> object. 3848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @throws IOException 3948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 4048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood public InputStream getInputStream() throws IOException 4148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood { 4248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood return cn.getStdoutStream(); 4348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood } 4448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 4548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood /** 4648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * Get the OutputStream. Please be aware that the implementation MAY use an 4748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * internal buffer. To make sure that the buffered data is sent over the 4848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * tunnel, you have to call the <code>flush</code> method of the 4948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * <code>OutputStream</code>. To signal EOF, please use the 5048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * <code>close</code> method of the <code>OutputStream</code>. 5148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * 5248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @return An <code>OutputStream</code> object. 5348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @throws IOException 5448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 5548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood public OutputStream getOutputStream() throws IOException 5648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood { 5748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood return cn.getStdinStream(); 5848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood } 5948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood 6048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood /** 6148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * Close the underlying SSH forwarding channel and free up resources. 6248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * You can also use this method to force the shutdown of the underlying 6348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * forwarding channel. Pending output (OutputStream not flushed) will NOT 6448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * be sent. Pending input (InputStream) can still be read. If the shutdown 6548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * operation is already in progress (initiated from either side), then this 6648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * call is a no-op. 6748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * 6848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @throws IOException 6948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */ 7048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood public void close() throws IOException 7148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood { 7248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood cm.closeChannel(cn, "Closed due to user request.", true); 7348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood } 7448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood} 75