public override void start() { try { PipedOutputStream pos=new PipedOutputStream(); io.setOutputStream(pos); // PipedInputStream pis=new PipedInputStream(pos); PipedInputStream pis=new MyPipedInputStream(pos, 32*1024); io.setInputStream(pis); Request request=new RequestSftp(); request.request(session, this); // thread=Thread.currentThread(); // buf=new Buffer(); buf=new Buffer(rmpsize); packet=new Packet(buf); int i=0; int j=0; int length; int type; byte[] str; // send SSH_FXP_INIT sendINIT(); // receive SSH_FXP_VERSION buf.rewind(); i=io.ins.Read(buf.buffer, 0, buf.buffer.Length); //System.out.println(io+" "+io.ins+" "+io.out); length=buf.getInt(); type=buf.getByte(); // 2 -> SSH_FXP_VERSION server_version=buf.getInt(); //System.out.println("SFTP protocol server-version="+server_version); // send SSH_FXP_REALPATH sendREALPATH(Util.getBytes(".")); // receive SSH_FXP_NAME buf.rewind(); i=io.ins.Read(buf.buffer, 0, buf.buffer.Length); length=buf.getInt(); type=buf.getByte(); // 104 -> SSH_FXP_NAME buf.getInt(); // i=buf.getInt(); // count str=buf.getString(); // filename home=cwd=Util.getString(str); str=buf.getString(); // logname // SftpATTRS.getATTR(buf); // attrs lcwd=Path.GetFullPath("."); //thread=new Thread(this); //thread.setName("Sftp for "+session.host); //thread.start(); } catch(Exception e) { //System.out.println(e); if(e is JSchException) throw (JSchException)e; throw new JSchException(e.ToString()); } }
public Buffer read(Buffer buf) { int j=0; while(true) { buf.reset(); io.getByte(buf.buffer, buf.index, cipher_size); buf.index+=cipher_size; if(s2ccipher!=null) { s2ccipher.update(buf.buffer, 0, cipher_size, buf.buffer, 0); } // j=((buf.buffer[0]<<24)&0xff000000)| // ((buf.buffer[1]<<16)&0x00ff0000)| // ((buf.buffer[2]<< 8)&0x0000ff00)| // ((buf.buffer[3] )&0x000000ff); j=Util.ToInt32( buf.buffer, 0 ); j=j-4-cipher_size+8; if(j>0) { io.getByte(buf.buffer, buf.index, j); buf.index+=(j); if(s2ccipher!=null) { s2ccipher.update(buf.buffer, cipher_size, j, buf.buffer, cipher_size); } } /* io.getByte(buf.buffer, buf.index, 8); buf.index+=8; if(s2ccipher!=null){ s2ccipher.update(buf.buffer, 0, 8, buf.buffer, 0); } j=((buf.buffer[0]<<24)&0xff000000)| ((buf.buffer[1]<<16)&0x00ff0000)| ((buf.buffer[2]<< 8)&0x0000ff00)| ((buf.buffer[3] )&0x000000ff); io.getByte(buf.buffer, buf.index, j-4); buf.index+=(j-4); if(s2ccipher!=null){ s2ccipher.update(buf.buffer, 8, j-4, buf.buffer, 8); } */ if(s2cmac!=null) { s2cmac.update(seqi); s2cmac.update(buf.buffer, 0, buf.index); byte[] result=s2cmac.doFinal(); io.getByte(mac_buf, 0, mac_buf.Length); if(!Arrays.equals(result, mac_buf)) { System.Console.WriteLine("mac error"); throw new IOException("MAC Error"); } } seqi++; if(inflater!=null) { //inflater.uncompress(buf); int pad=buf.buffer[4]; uncompress_len[0]=buf.index-5-pad; byte[] foo=inflater.uncompress(buf.buffer, 5, uncompress_len); if(foo!=null) { buf.buffer=foo; buf.index=5+uncompress_len[0]; } else { System.Console.Error.WriteLine("fail in inflater"); break; } } int type=buf.buffer[5]&0xff; //System.Console.WriteLine("read: "+type); if(type==SSH_MSG_DISCONNECT) { buf.rewind(); buf.getInt();buf.getShort(); int reason_code=buf.getInt(); byte[] description=buf.getString(); byte[] language_tag=buf.getString(); /* System.Console.Error.WriteLine("SSH_MSG_DISCONNECT:"+ " "+reason_code+ " "+new String(description)+ " "+new String(language_tag)); */ throw new JSchException("SSH_MSG_DISCONNECT:"+ " "+reason_code+ " "+new String(description)+ " "+new String(language_tag)); //break; } else if(type==SSH_MSG_IGNORE) { } else if(type==SSH_MSG_DEBUG) { buf.rewind(); buf.getInt();buf.getShort(); /* byte always_display=(byte)buf.getByte(); byte[] message=buf.getString(); byte[] language_tag=buf.getString(); System.Console.Error.WriteLine("SSH_MSG_DEBUG:"+ " "+new String(message)+ " "+new String(language_tag)); */ } else if(type==SSH_MSG_CHANNEL_WINDOW_ADJUST) { buf.rewind(); buf.getInt();buf.getShort(); Channel c=Channel.getChannel(buf.getInt(), this); if(c==null) { } else { c.addRemoteWindowSize(buf.getInt()); } } else { break; } } buf.rewind(); return buf; }