private void queryDirectory(boolean firstQuery) { DiskShare share = Directory.this.share; // Query Directory Request EnumSet<SMB2QueryDirectoryRequest.SMB2QueryDirectoryFlags> flags; if (firstQuery) { flags = EnumSet.of(SMB2QueryDirectoryRequest.SMB2QueryDirectoryFlags.SMB2_RESTART_SCANS); } else { flags = EnumSet.noneOf(SMB2QueryDirectoryRequest.SMB2QueryDirectoryFlags.class); } FileInformationClass informationClass = decoder.getInformationClass(); SMB2QueryDirectoryResponse qdResp = share.queryDirectory(fileId, flags, informationClass, searchPattern); long status = qdResp.getHeader().getStatusCode(); byte[] buffer = qdResp.getOutputBuffer(); // The macOS SMB server doesn't always send a STATUS_NO_MORE_FILES response. Instead it keeps on sending // an identical response back. Detect if the response is identical to the previous one and abort the loop // if that's the case. // Additionally, STATUS_NO_SUCH_FILE is being returned when searchPattern does not match any files if (status == NtStatus.STATUS_NO_MORE_FILES.getValue() || status == NtStatus.STATUS_NO_SUCH_FILE.getValue() || (currentBuffer != null && Arrays.equals(currentBuffer, buffer))) { currentIterator = null; currentBuffer = null; } else { currentBuffer = buffer; currentIterator = FileInformationFactory.createFileInformationIterator(currentBuffer, decoder); } }
private void queryDirectory(boolean firstQuery) { DiskShare share = Directory.this.share; // Query Directory Request EnumSet<SMB2QueryDirectoryRequest.SMB2QueryDirectoryFlags> flags; if (firstQuery) { flags = EnumSet.of(SMB2QueryDirectoryRequest.SMB2QueryDirectoryFlags.SMB2_RESTART_SCANS); } else { flags = EnumSet.noneOf(SMB2QueryDirectoryRequest.SMB2QueryDirectoryFlags.class); } FileInformationClass informationClass = decoder.getInformationClass(); SMB2QueryDirectoryResponse qdResp = share.queryDirectory(fileId, flags, informationClass, searchPattern); long status = qdResp.getHeader().getStatusCode(); byte[] buffer = qdResp.getOutputBuffer(); // The macOS SMB server doesn't always send a STATUS_NO_MORE_FILES response. Instead it keeps on sending // an identical response back. Detect if the response is identical to the previous one and abort the loop // if that's the case. // Additionally, STATUS_NO_SUCH_FILE is being returned when searchPattern does not match any files if (status == NtStatus.STATUS_NO_MORE_FILES.getValue() || status == NtStatus.STATUS_NO_SUCH_FILE.getValue() || (currentBuffer != null && Arrays.equals(currentBuffer, buffer))) { currentIterator = null; currentBuffer = null; } else { currentBuffer = buffer; currentIterator = FileInformationFactory.createFileInformationIterator(currentBuffer, decoder); } }