t.start();
}
public void msgChannelRequest(byte[] msg, int msglen) throws IOException
{
TypesReader tr = new TypesReader(msg, 0, msglen);
tr.readByte(); // skip packet type
int id = tr.readUINT32();
Channel c = getChannel(id);
if (c == null)
throw new IOException("Unexpected SSH_MSG_CHANNEL_REQUEST message for non-existent channel " + id);
ServerSessionImpl server_session = null;
if (server_state != null)
{
synchronized (c)
{
server_session = c.ss;
}
}
String type = tr.readString("US-ASCII");
boolean wantReply = tr.readBoolean();
log.debug("Got SSH_MSG_CHANNEL_REQUEST (channel " + id + ", '" + type + "')");
if (type.equals("exit-status"))
{
if (wantReply != false)
throw new IOException(
"Badly formatted SSH_MSG_CHANNEL_REQUEST exit-status message, 'want reply' is true");
int exit_status = tr.readUINT32();
if (tr.remain() != 0)
throw new IOException("Badly formatted SSH_MSG_CHANNEL_REQUEST message");
synchronized (c)
{
c.exit_status = new Integer(exit_status);
c.notifyAll();
}
log.debug("Got EXIT STATUS (channel " + id + ", status " + exit_status + ")");
return;
}
if ((server_state == null) && (type.equals("exit-signal")))
{
if (wantReply != false)
throw new IOException(
"Badly formatted SSH_MSG_CHANNEL_REQUEST exit-signal message, 'want reply' is true");
String signame = tr.readString("US-ASCII");
tr.readBoolean();
tr.readString();
tr.readString();
if (tr.remain() != 0)
throw new IOException("Badly formatted SSH_MSG_CHANNEL_REQUEST message");
synchronized (c)
{
c.exit_signal = signame;
c.notifyAll();
}
log.debug("Got EXIT SIGNAL (channel " + id + ", signal " + signame + ")");
return;
}
if ((server_session != null) && (type.equals("pty-req")))
{
PtySettings pty = new PtySettings();
pty.term = tr.readString();
pty.term_width_characters = tr.readUINT32();
pty.term_height_characters = tr.readUINT32();
pty.term_width_pixels = tr.readUINT32();
pty.term_height_pixels = tr.readUINT32();
pty.terminal_modes = tr.readByteString();
if (tr.remain() != 0)
throw new IOException("Badly formatted SSH_MSG_CHANNEL_REQUEST message");
Runnable run_after_sending_success = null;
ServerSessionCallback sscb = server_session.getServerSessionCallback();
if (sscb != null)
run_after_sending_success = sscb.requestPtyReq(server_session, pty);
if (wantReply)
{
if (run_after_sending_success != null)
{
tm.sendAsynchronousMessage(new PacketChannelSuccess(c.remoteID).getPayload());
}
else
{
tm.sendAsynchronousMessage(new PacketChannelFailure(c.remoteID).getPayload());
}
}
if (run_after_sending_success != null)
{
runAsync(run_after_sending_success);
}
return;
}
if ((server_session != null) && (type.equals("shell")))
{
if (tr.remain() != 0)
throw new IOException("Badly formatted SSH_MSG_CHANNEL_REQUEST message");
Runnable run_after_sending_success = null;
ServerSessionCallback sscb = server_session.getServerSessionCallback();
if (sscb != null)
run_after_sending_success = sscb.requestShell(server_session);
if (wantReply)
{
if (run_after_sending_success != null)
{
tm.sendAsynchronousMessage(new PacketChannelSuccess(c.remoteID).getPayload());
}
else
{
tm.sendAsynchronousMessage(new PacketChannelFailure(c.remoteID).getPayload());
}
}
if (run_after_sending_success != null)
{
runAsync(run_after_sending_success);
}
return;
}
if ((server_session != null) && (type.equals("exec")))
{
String command = tr.readString();
if (tr.remain() != 0)
throw new IOException("Badly formatted SSH_MSG_CHANNEL_REQUEST message");
Runnable run_after_sending_success = null;
ServerSessionCallback sscb = server_session.getServerSessionCallback();