1 2 package ch.ethz.ssh2.channel; 3 4 10 public class Channel 11 { 12 38 39 static final int STATE_OPENING = 1; 40 static final int STATE_OPEN = 2; 41 static final int STATE_CLOSED = 4; 42 43 static final int CHANNEL_BUFFER_SIZE = 30000; 44 45 49 50 final ChannelManager cm; 52 final ChannelOutputStream stdinStream; 53 final ChannelInputStream stdoutStream; 54 final ChannelInputStream stderrStream; 55 56 65 int localID = -1; 66 int remoteID = -1; 67 68 81 82 90 91 final Object channelSendLock = new Object (); 92 boolean closeMessageSent = false; 93 94 98 99 final byte[] msgWindowAdjust = new byte[9]; 100 101 104 int state = STATE_OPENING; 105 106 boolean closeMessageRecv = false; 107 108 111 int successCounter = 0; 112 int failedCounter = 0; 113 114 int localWindow = 0; 115 long remoteWindow = 0; 116 117 int localMaxPacketSize = -1; 118 int remoteMaxPacketSize = -1; 119 120 final byte[] stdoutBuffer = new byte[CHANNEL_BUFFER_SIZE]; 121 final byte[] stderrBuffer = new byte[CHANNEL_BUFFER_SIZE]; 122 123 int stdoutReadpos = 0; 124 int stdoutWritepos = 0; 125 int stderrReadpos = 0; 126 int stderrWritepos = 0; 127 128 boolean EOF = false; 129 130 Integer exit_status; 131 132 String exit_signal; 133 134 137 String hexX11FakeCookie; 138 139 143 private final Object reasonClosedLock = new Object (); 144 private String reasonClosed = null; 145 146 public Channel(ChannelManager cm) 147 { 148 this.cm = cm; 149 150 this.localWindow = CHANNEL_BUFFER_SIZE; 151 this.localMaxPacketSize = 35000 - 1024; 153 this.stdinStream = new ChannelOutputStream(this); 154 this.stdoutStream = new ChannelInputStream(this, false); 155 this.stderrStream = new ChannelInputStream(this, true); 156 } 157 158 159 160 public ChannelInputStream getStderrStream() 161 { 162 return stderrStream; 163 } 164 165 public ChannelOutputStream getStdinStream() 166 { 167 return stdinStream; 168 } 169 170 public ChannelInputStream getStdoutStream() 171 { 172 return stdoutStream; 173 } 174 175 public String getExitSignal() 176 { 177 synchronized (this) 178 { 179 return exit_signal; 180 } 181 } 182 183 public Integer getExitStatus() 184 { 185 synchronized (this) 186 { 187 return exit_status; 188 } 189 } 190 191 public String getReasonClosed() 192 { 193 synchronized (reasonClosedLock) 194 { 195 return reasonClosed; 196 } 197 } 198 199 public void setReasonClosed(String reasonClosed) 200 { 201 synchronized (reasonClosedLock) 202 { 203 if (this.reasonClosed == null) 204 this.reasonClosed = reasonClosed; 205 } 206 } 207 } 208 | Popular Tags |