comparison src/ch/ethz/ssh2/channel/RemoteAcceptThread.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
comparison
equal deleted inserted replaced
272:ce2f4e397703 273:91a31873c42a
1 /*
2 * Copyright (c) 2006-2011 Christian Plattner. All rights reserved.
3 * Please refer to the LICENSE.txt for licensing details.
4 */
5 package ch.ethz.ssh2.channel;
6
7 import java.io.IOException;
8 import java.net.Socket;
9
10 import ch.ethz.ssh2.log.Logger;
11
12 /**
13 * RemoteAcceptThread.
14 *
15 * @author Christian Plattner
16 * @version $Id: RemoteAcceptThread.java 119 2014-04-12 20:30:58Z dkocher@sudo.ch $
17 */
18 public class RemoteAcceptThread extends Thread
19 {
20 private static final Logger log = Logger.getLogger(RemoteAcceptThread.class);
21
22 Channel c;
23
24 String remoteConnectedAddress;
25 int remoteConnectedPort;
26 String remoteOriginatorAddress;
27 int remoteOriginatorPort;
28 String targetAddress;
29 int targetPort;
30
31 Socket s;
32
33 public RemoteAcceptThread(Channel c, String remoteConnectedAddress, int remoteConnectedPort,
34 String remoteOriginatorAddress, int remoteOriginatorPort, String targetAddress, int targetPort)
35 {
36 this.c = c;
37 this.remoteConnectedAddress = remoteConnectedAddress;
38 this.remoteConnectedPort = remoteConnectedPort;
39 this.remoteOriginatorAddress = remoteOriginatorAddress;
40 this.remoteOriginatorPort = remoteOriginatorPort;
41 this.targetAddress = targetAddress;
42 this.targetPort = targetPort;
43
44 log.debug("RemoteAcceptThread: " + remoteConnectedAddress + "/" + remoteConnectedPort + ", R: "
45 + remoteOriginatorAddress + "/" + remoteOriginatorPort);
46 }
47
48 @Override
49 public void run()
50 {
51 try
52 {
53 c.cm.sendOpenConfirmation(c);
54
55 s = new Socket(targetAddress, targetPort);
56
57 StreamForwarder r2l = new StreamForwarder(c, null, null, c.getStdoutStream(), s.getOutputStream(),
58 "RemoteToLocal");
59 StreamForwarder l2r = new StreamForwarder(c, null, null, s.getInputStream(), c.getStdinStream(),
60 "LocalToRemote");
61
62 /* No need to start two threads, one can be executed in the current thread */
63
64 r2l.setDaemon(true);
65 r2l.start();
66 l2r.run();
67
68 while (r2l.isAlive())
69 {
70 try
71 {
72 r2l.join();
73 }
74 catch (InterruptedException ignored)
75 {
76 }
77 }
78
79 /* If the channel is already closed, then this is a no-op */
80
81 c.cm.closeChannel(c, "EOF on both streams reached.", true);
82 s.close();
83 }
84 catch (IOException e)
85 {
86 log.warning("IOException in proxy code: " + e.getMessage());
87
88 try
89 {
90 c.cm.closeChannel(c, e, true);
91 }
92 catch (IOException ignored)
93 {
94 }
95 try
96 {
97 if (s != null)
98 s.close();
99 }
100 catch (IOException ignored)
101 {
102 }
103 }
104 }
105 }