From: <ga...@us...> - 2012-08-10 06:41:42
|
Revision: 5913 http://jnode.svn.sourceforge.net/jnode/?rev=5913&view=rev Author: galatnm Date: 2012-08-10 06:41:36 +0000 (Fri, 10 Aug 2012) Log Message: ----------- Add in support for extracting sym-link target and identify block, char, fifo and link obje Modified Paths: -------------- trunk/fs/src/fs/org/jnode/fs/ext2/Ext2Entry.java trunk/fs/src/fs/org/jnode/fs/ext2/Ext2File.java trunk/fs/src/fs/org/jnode/fs/ext2/INode.java Modified: trunk/fs/src/fs/org/jnode/fs/ext2/Ext2Entry.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/ext2/Ext2Entry.java 2012-08-10 06:39:34 UTC (rev 5912) +++ trunk/fs/src/fs/org/jnode/fs/ext2/Ext2Entry.java 2012-08-10 06:41:36 UTC (rev 5913) @@ -21,7 +21,6 @@ package org.jnode.fs.ext2; import java.io.IOException; - import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.jnode.fs.FSDirectory; @@ -97,7 +96,9 @@ return AbstractFSEntry.ROOT_ENTRY; else if (mode == Ext2Constants.EXT2_S_IFDIR) return AbstractFSEntry.DIR_ENTRY; - else if (mode == Ext2Constants.EXT2_S_IFREG || mode == Ext2Constants.EXT2_FT_SYMLINK) + else if (mode == Ext2Constants.EXT2_S_IFREG || mode == Ext2Constants.EXT2_S_IFLNK || + mode == Ext2Constants.EXT2_S_IFIFO || mode == Ext2Constants.EXT2_S_IFCHR || + mode == Ext2Constants.EXT2_S_IFBLK) return AbstractFSEntry.FILE_ENTRY; else return AbstractFSEntry.OTHER_ENTRY; Modified: trunk/fs/src/fs/org/jnode/fs/ext2/Ext2File.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/ext2/Ext2File.java 2012-08-10 06:39:34 UTC (rev 5912) +++ trunk/fs/src/fs/org/jnode/fs/ext2/Ext2File.java 2012-08-10 06:41:36 UTC (rev 5913) @@ -22,7 +22,6 @@ import java.io.IOException; import java.nio.ByteBuffer; - import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.jnode.fs.FileSystemException; @@ -180,20 +179,27 @@ try { if (len + off > getLength()) throw new IOException("Can't read past the file!"); - long blockSize = iNode.getExt2FileSystem().getBlockSize(); - long bytesRead = 0; - while (bytesRead < len) { - long blockNr = (fileOffset + bytesRead) / blockSize; - long blockOffset = (fileOffset + bytesRead) % blockSize; - long copyLength = Math.min(len - bytesRead, blockSize - blockOffset); - log.debug("blockNr: " + blockNr + ", blockOffset: " + blockOffset + ", copyLength: " + copyLength + - ", bytesRead: " + bytesRead); + if ((iNode.getMode() & Ext2Constants.EXT2_S_IFLNK) == Ext2Constants.EXT2_S_IFLNK) { + // Sym-links are a special case: the data seems to be stored inline in the iNode + System.arraycopy(iNode.getINodeBlockData(), 0, dest, 0, Math.min(64, dest.length)); + } + else { + long blockSize = iNode.getExt2FileSystem().getBlockSize(); + long bytesRead = 0; + while (bytesRead < len) { + long blockNr = (fileOffset + bytesRead) / blockSize; + long blockOffset = (fileOffset + bytesRead) % blockSize; + long copyLength = Math.min(len - bytesRead, blockSize - blockOffset); - System.arraycopy(iNode.getDataBlock(blockNr), (int) blockOffset, dest, off + (int) bytesRead, - (int) copyLength); + log.debug("blockNr: " + blockNr + ", blockOffset: " + blockOffset + ", copyLength: " + copyLength + + ", bytesRead: " + bytesRead); - bytesRead += copyLength; + System.arraycopy(iNode.getDataBlock(blockNr), (int) blockOffset, dest, off + (int) bytesRead, + (int) copyLength); + + bytesRead += copyLength; + } } } catch (Throwable ex) { final IOException ioe = new IOException(); Modified: trunk/fs/src/fs/org/jnode/fs/ext2/INode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/ext2/INode.java 2012-08-10 06:39:34 UTC (rev 5912) +++ trunk/fs/src/fs/org/jnode/fs/ext2/INode.java 2012-08-10 06:41:36 UTC (rev 5913) @@ -270,6 +270,17 @@ } /** + * Gets the data stored inline in the inode's i_block element. + * + * @return the inode block data. + */ + public byte[] getINodeBlockData() { + byte[] buffer = new byte[64]; + System.arraycopy(data, 40, buffer, 0, buffer.length); + return buffer; + } + + /** * Return the number of the block in the filesystem that stores the ith * block of the inode (i is a sequential index from the beginning of the * file) @@ -286,10 +297,7 @@ private long getDataBlockNr(long i) throws IOException { if ((getFlags() & Ext2Constants.EXT4_INODE_EXTENTS_FLAG) != 0) { if (extentHeader == null) { - byte[] headerBuffer = new byte[64]; - System.arraycopy(data, 40, headerBuffer, 0, headerBuffer.length); - - extentHeader = new ExtentHeader(headerBuffer); + extentHeader = new ExtentHeader(getINodeBlockData()); } return extentHeader.getBlockNumber(i); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |