protected int checkReadResponse(Response res, byte[] to, int offset) throws Buffer.BufferException, SFTPException { switch (res.getType()) { case DATA: int recvLen = res.readUInt32AsInt(); System.arraycopy(res.array(), res.rpos(), to, offset, recvLen); return recvLen; case STATUS: res.ensureStatusIs(StatusCode.EOF); return -1; default: throw new SFTPException("Unexpected packet: " + res.getType()); } }
public void handle() throws SFTPException { Response resp = new Response(packet, engine.getOperativeProtocolVersion()); Promise<Response, SFTPException> promise = promises.remove(resp.getRequestID()); log.debug("Received {} packet", resp.getType()); if (promise == null) throw new SFTPException("Received [" + resp.readType() + "] response for request-id " + resp.getRequestID() + ", no such request was made"); else promise.deliver(resp); }
private static byte[] readSingleNameAsBytes(Response res) throws IOException { res.ensurePacketTypeIs(PacketType.NAME); if (res.readUInt32AsInt() == 1) return res.readStringAsBytes(); else throw new SFTPException("Unexpected data in " + res.getType() + " packet"); }
@SuppressWarnings("PMD.CompareObjectsWithEquals") public Response ensureStatusIs(StatusCode acceptable) throws SFTPException { final StatusCode sc = readStatusCode(); if (sc != acceptable) error(sc); return this; }
public Response ensureStatusPacketIsOK() throws SFTPException { return ensurePacketTypeIs(PacketType.STATUS).ensureStatusIs(StatusCode.OK); }
public Response ensurePacketTypeIs(PacketType pt) throws SFTPException { if (getType() != pt) if (getType() == PacketType.STATUS) error(readStatusCode()); else throw new SFTPException("Unexpected packet " + getType()); return this; }
final Response res = requester.request(newRequest(PacketType.READDIR)) .retrieve(requester.getTimeoutMs(), TimeUnit.MILLISECONDS); switch (res.getType()) { final int count = res.readUInt32AsInt(); for (int i = 0; i < count; i++) { final String name = res.readString(requester.sub.getRemoteCharset()); res.readString(); // long name - IGNORED - shdve never been in the protocol final FileAttributes attrs = res.readFileAttributes(); final PathComponents comps = requester.getPathHelper().getComponents(path, name); final RemoteResourceInfo inf = new RemoteResourceInfo(comps, attrs); res.ensureStatusIs(StatusCode.EOF); break loop; throw new SFTPException("Unexpected packet: " + res.getType());
protected static String readSingleName(Response res) throws IOException { res.ensurePacketTypeIs(PacketType.NAME); if (res.readUInt32AsInt() == 1) return res.readString(); else throw new SFTPException("Unexpected data in " + res.getType() + " packet"); }
protected FileAttributes stat(PacketType pt, String path) throws IOException { return doRequest(newRequest(pt).putString(path, sub.getRemoteCharset())) .ensurePacketTypeIs(PacketType.ATTRS) .readFileAttributes(); }
private void checkWriteResponse(Promise<Response, SFTPException> responsePromise) throws SFTPException { responsePromise.retrieve(requester.getTimeoutMs(), TimeUnit.MILLISECONDS).ensureStatusPacketIsOK(); }
final Request request = sftp.newExtendedRequest("space-available").putString(directory.getAbsolute()); final Response response = sftp.request(request).retrieve(); switch(response.getType()) { case EXTENDED_REPLY: long bytesOnDevice = response.readUInt64(); long unusedBytesOnDevice = response.readUInt64(); long bytesAvailableToUser = response.readUInt64(); long unusedBytesAvailableToUser = response.readUInt64(); int bytesPerAllocationUnit = response.readUInt32AsInt(); throw new IOException(String.format("Unexpected response type %s", response.getType()));
public RemoteDirectory openDir(String path) throws IOException { final byte[] handle = doRequest( newRequest(PacketType.OPENDIR).putString(path, sub.getRemoteCharset()) ).ensurePacketTypeIs(PacketType.HANDLE).readBytes(); return new RemoteDirectory(this, path, handle); }
public RemoteDirectory openDir(String path) throws IOException { final String handle = doRequest( newRequest(PacketType.OPENDIR).putString(path) ).ensurePacketTypeIs(PacketType.HANDLE).readString(); return new RemoteDirectory(this, path, handle); }
private Space getSpaceStatVFSOpenSSH(SFTPEngine sftp, final Path directory) throws BackgroundException { try { final Request request = sftp.newExtendedRequest("statvfs@openssh.com").putString(directory.getAbsolute()); final Response response = sftp.request(request).retrieve(); switch(response.getType()) { case EXTENDED_REPLY: long blockSize = response.readUInt64(); /* file system block size */ long filesystemBlockSize = response.readUInt64(); /* fundamental fs block size */ long totalBlocks = response.readUInt64(); /* number of blocks (unit f_frsize) */ long filesystemFreeBlocks = response.readUInt64(); /* free blocks in file system */ long blocksAvailable = response.readUInt64(); /* free blocks for non-root */ long fileInodes = response.readUInt64(); /* total file inodes */ long fileInodesFree = response.readUInt64(); /* free file inodes */ long fileInodesAvailable = response.readUInt64(); /* free file inodes for to non-root */ byte[] filesystemID = new byte[8]; /* file system id */ response.readRawBytes(filesystemID); long flags = response.readUInt64(); /* bit mask of f_flag values */ long maximumFilenameLength = response.readUInt64(); /* maximum filename length */ long total = totalBlocks * filesystemBlockSize; long available = blocksAvailable * filesystemBlockSize; long used = total - available; return new Space(used, available); default: throw new IOException(String.format("Unexpected response type %s", response.getType())); } } catch(IOException e) { throw new SFTPExceptionMappingService().map("Failure to read attributes of {0}", e, directory); } }
public StatusCode readStatusCode() throws SFTPException { try { return StatusCode.fromInt(readUInt32AsInt()); } catch (BufferException be) { throw new SFTPException(be); } }
public void removeDir(String path) throws IOException { doRequest( newRequest(PacketType.RMDIR).putString(path, sub.getRemoteCharset()) ).ensureStatusIs(Response.StatusCode.OK); }
public List<RemoteResourceInfo> scan(RemoteResourceFilter filter) throws IOException { List<RemoteResourceInfo> rri = new LinkedList<RemoteResourceInfo>(); loop: for (; ; ) { final Response res = requester.request(newRequest(PacketType.READDIR)) .retrieve(requester.getTimeoutMs(), TimeUnit.MILLISECONDS); switch (res.getType()) { case NAME: final int count = res.readUInt32AsInt(); for (int i = 0; i < count; i++) { final String name = res.readString(); res.readString(); // long name - IGNORED - shdve never been in the protocol final FileAttributes attrs = res.readFileAttributes(); final PathComponents comps = requester.getPathHelper().getComponents(path, name); final RemoteResourceInfo inf = new RemoteResourceInfo(comps, attrs); if (!(name.equals(".") || name.equals("..")) && (filter == null || filter.accept(inf))) rri.add(inf); } break; case STATUS: res.ensureStatusIs(StatusCode.EOF); break loop; default: throw new SFTPException("Unexpected packet: " + res.getType()); } } return rri; }
public Response ensurePacketTypeIs(PacketType pt) throws SFTPException { if (getType() != pt) if (getType() == PacketType.STATUS) error(readStatusCode()); else throw new SFTPException("Unexpected packet " + getType()); return this; }
public FileAttributes fetchAttributes() throws IOException { return requester.request(newRequest(PacketType.FSTAT)) .retrieve(requester.getTimeoutMs(), TimeUnit.MILLISECONDS) .ensurePacketTypeIs(PacketType.ATTRS) .readFileAttributes(); }
@Override public void close() throws IOException { log.debug("Closing `{}`", this); requester.request(newRequest(PacketType.CLOSE)) .retrieve(requester.getTimeoutMs(), TimeUnit.MILLISECONDS) .ensureStatusPacketIsOK(); }