diff src/ch/ethz/ssh2/channel/StreamForwarder.java @ 273:91a31873c42a ganymed

start conversion from trilead to ganymed
author Carl Byington <carl@five-ten-sg.com>
date Fri, 18 Jul 2014 11:21:46 -0700
parents
children 071eccdff8ea
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ch/ethz/ssh2/channel/StreamForwarder.java	Fri Jul 18 11:21:46 2014 -0700
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2006-2011 Christian Plattner. All rights reserved.
+ * Please refer to the LICENSE.txt for licensing details.
+ */
+package ch.ethz.ssh2.channel;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Socket;
+
+/**
+ * A StreamForwarder forwards data between two given streams. 
+ * If two StreamForwarder threads are used (one for each direction)
+ * then one can be configured to shutdown the underlying channel/socket
+ * if both threads have finished forwarding (EOF).
+ * 
+ * @author Christian Plattner
+ * @version 2.50, 03/15/10
+ */
+public class StreamForwarder extends Thread
+{
+	OutputStream os;
+	InputStream is;
+	byte[] buffer = new byte[Channel.CHANNEL_BUFFER_SIZE];
+	Channel c;
+	StreamForwarder sibling;
+	Socket s;
+	String mode;
+
+	StreamForwarder(Channel c, StreamForwarder sibling, Socket s, InputStream is, OutputStream os, String mode)
+			throws IOException
+	{
+		this.is = is;
+		this.os = os;
+		this.mode = mode;
+		this.c = c;
+		this.sibling = sibling;
+		this.s = s;
+	}
+
+	@Override
+	public void run()
+	{
+		try
+		{
+			while (true)
+			{
+				int len = is.read(buffer);
+				if (len <= 0)
+					break;
+				os.write(buffer, 0, len);
+				os.flush();
+			}
+		}
+		catch (IOException e)
+		{
+			try
+			{
+				c.cm.closeChannel(c, e, true);
+			}
+			catch (IOException ignored)
+			{
+			}
+		}
+		finally
+		{
+			try
+			{
+				os.close();
+			}
+			catch (IOException ignored)
+			{
+			}
+			try
+			{
+				is.close();
+			}
+			catch (IOException ignored)
+			{
+			}
+
+			if (sibling != null)
+			{
+				while (sibling.isAlive())
+				{
+					try
+					{
+						sibling.join();
+					}
+					catch (InterruptedException ignored)
+					{
+					}
+				}
+
+				try
+				{
+					c.cm.closeChannel(c, "StreamForwarder (" + mode + ") is cleaning up the connection", true);
+				}
+				catch (IOException ignored)
+				{
+				}
+
+				try
+				{
+					if (s != null)
+						s.close();
+				}
+				catch (IOException ignored)
+				{
+				}
+			}
+		}
+	}
+}
\ No newline at end of file