in src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveInputStream.java [467:544]
private void readDirectoryEntry(DumpArchiveEntry entry) throws IOException {
long size = entry.getEntrySize();
boolean first = true;
while (first || DumpArchiveConstants.SEGMENT_TYPE.ADDR == entry.getHeaderType()) {
// read the header that we just peeked at.
if (!first) {
raw.readRecord();
}
if (!names.containsKey(entry.getIno()) && DumpArchiveConstants.SEGMENT_TYPE.INODE == entry.getHeaderType()) {
pending.put(entry.getIno(), entry);
}
final int datalen = DumpArchiveConstants.TP_SIZE * entry.getHeaderCount();
if (blockBuffer.length < datalen) {
blockBuffer = IOUtils.readRange(raw, datalen);
if (blockBuffer.length != datalen) {
throw new EOFException();
}
} else if (raw.read(blockBuffer, 0, datalen) != datalen) {
throw new EOFException();
}
int reclen = 0;
for (int i = 0; i < datalen - 8 && i < size - 8; i += reclen) {
final int ino = DumpArchiveUtil.convert32(blockBuffer, i);
reclen = DumpArchiveUtil.convert16(blockBuffer, i + 4);
if (reclen == 0) {
throw new DumpArchiveException("reclen cannot be 0");
}
final byte type = blockBuffer[i + 6];
final String name = DumpArchiveUtil.decode(zipEncoding, blockBuffer, i + 8, blockBuffer[i + 7]);
if (CURRENT_PATH_SEGMENT.equals(name) || PARENT_PATH_SEGMENT.equals(name)) {
// do nothing...
continue;
}
final Dirent d = new Dirent(ino, entry.getIno(), type, name);
/*
* if ((type == 4) && names.containsKey(ino)) { System.out.println("we already have ino: " + names.get(ino)); }
*/
names.put(ino, d);
// check whether this allows us to fill anything in the pending list.
for (final Map.Entry<Integer, DumpArchiveEntry> mapEntry : pending.entrySet()) {
final DumpArchiveEntry v = mapEntry.getValue();
final String path = getPath(v);
if (path != null) {
v.setName(path);
v.setSimpleName(names.get(mapEntry.getKey()).getName());
queue.add(v);
}
}
// remove anything that we found. (We can't do it earlier
// because of concurrent modification exceptions.)
queue.forEach(e -> pending.remove(e.getIno()));
}
final byte[] peekBytes = raw.peek();
if (!DumpArchiveUtil.verify(peekBytes)) {
throw new InvalidFormatException();
}
entry = DumpArchiveEntry.parse(peekBytes);
first = false;
size -= DumpArchiveConstants.TP_SIZE;
}
}