|
From: <ga...@us...> - 2012-08-09 11:04:54
|
Revision: 5901
http://jnode.svn.sourceforge.net/jnode/?rev=5901&view=rev
Author: galatnm
Date: 2012-08-09 11:04:47 +0000 (Thu, 09 Aug 2012)
Log Message:
-----------
Add initial support for HFSX file systems (patch from L. Quinane)
Modified Paths:
--------------
trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusFileSystemType.java
trunk/fs/src/fs/org/jnode/fs/hfsplus/SuperBlock.java
trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentDescriptor.java
Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusFileSystemType.java
===================================================================
--- trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusFileSystemType.java 2012-07-09 08:15:39 UTC (rev 5900)
+++ trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusFileSystemType.java 2012-08-09 11:04:47 UTC (rev 5901)
@@ -22,14 +22,11 @@
import java.io.IOException;
import java.nio.ByteBuffer;
-
import org.jnode.driver.Device;
import org.jnode.driver.block.FSBlockDeviceAPI;
import org.jnode.fs.BlockDeviceFileSystemType;
import org.jnode.fs.FileSystemException;
import org.jnode.partitions.PartitionTableEntry;
-import org.jnode.partitions.ibm.IBMPartitionTableEntry;
-import org.jnode.partitions.ibm.IBMPartitionTypes;
import org.jnode.util.BigEndian;
public class HfsPlusFileSystemType implements BlockDeviceFileSystemType<HfsPlusFileSystem> {
@@ -48,13 +45,13 @@
public final boolean supports(final PartitionTableEntry pte, final byte[] firstSector,
final FSBlockDeviceAPI devApi) {
- if (pte != null) {
+ /*if (pte != null) {
if (pte instanceof IBMPartitionTableEntry) {
if (((IBMPartitionTableEntry) pte).getSystemIndicator() != IBMPartitionTypes.PARTTYPE_LINUXNATIVE) {
return false;
}
}
- }
+ } */
// need to check the magic
ByteBuffer magic = ByteBuffer.allocate(2);
try {
@@ -63,7 +60,7 @@
return false;
}
int magicNumber = BigEndian.getInt16(magic.array(), 0);
- return (magicNumber == SuperBlock.HFSPLUS_SUPER_MAGIC);
+ return (magicNumber == SuperBlock.HFSPLUS_SUPER_MAGIC || magicNumber == SuperBlock.HFSX_SUPER_MAGIC);
}
}
Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/SuperBlock.java
===================================================================
--- trunk/fs/src/fs/org/jnode/fs/hfsplus/SuperBlock.java 2012-07-09 08:15:39 UTC (rev 5900)
+++ trunk/fs/src/fs/org/jnode/fs/hfsplus/SuperBlock.java 2012-08-09 11:04:47 UTC (rev 5901)
@@ -41,7 +41,8 @@
*/
public class SuperBlock extends HfsPlusObject {
- public static final int HFSPLUS_SUPER_MAGIC = 0x482b;
+ public static final int HFSPLUS_SUPER_MAGIC = 0x482b; // H+
+ public static final int HFSX_SUPER_MAGIC = 0x4858; // HX
public static final int HFSPLUS_MIN_VERSION = 0x0004; /* HFS+ */
public static final int HFSPLUS_CURRENT_VERSION = 5; /* HFSX */
@@ -85,7 +86,7 @@
fs.getApi().read(1024, b);
data = new byte[SUPERBLOCK_LENGTH];
System.arraycopy(b.array(), 0, data, 0, SUPERBLOCK_LENGTH);
- if (getMagic() != HFSPLUS_SUPER_MAGIC) {
+ if (getMagic() != HFSPLUS_SUPER_MAGIC && getMagic() != HFSX_SUPER_MAGIC) {
throw new FileSystemException("Not hfs+ volume header (" + getMagic() +
": bad magic)");
}
@@ -151,7 +152,7 @@
forkdata.addDescriptor(0, desc);
forkdata.write(data, 112);
// Journal creation
- int nextBlock = 0;
+ long nextBlock = 0;
if (params.isJournaled()) {
this.setFileCount(2);
this.setAttribute(HFSPLUS_VOL_JOURNALED_BIT);
@@ -248,8 +249,8 @@
return BigEndian.getInt32(data, 12);
}
- public final void setJournalInfoBlock(final int value) {
- BigEndian.setInt32(data, 12, value);
+ public final void setJournalInfoBlock(final long value) {
+ BigEndian.setInt32(data, 12, (int) value);
}
//
Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentDescriptor.java
===================================================================
--- trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentDescriptor.java 2012-07-09 08:15:39 UTC (rev 5900)
+++ trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentDescriptor.java 2012-08-09 11:04:47 UTC (rev 5901)
@@ -27,10 +27,10 @@
public static final int EXTENT_DESCRIPTOR_LENGTH = 8;
/** The first allocation block. */
- private int startBlock;
+ private long startBlock;
/** The length in allocation blocks of the extent. */
- private int blockCount;
+ private long blockCount;
public ExtentDescriptor() {
this.startBlock = 0;
@@ -43,7 +43,7 @@
* @param startBlock first allocation block.
* @param blockCount number of blocks in the extent.
*/
- public ExtentDescriptor(int startBlock, int blockCount) {
+ public ExtentDescriptor(long startBlock, long blockCount) {
this.startBlock = startBlock;
this.blockCount = blockCount;
}
@@ -57,8 +57,8 @@
public ExtentDescriptor(final byte[] src, final int offset) {
byte[] data = new byte[EXTENT_DESCRIPTOR_LENGTH];
System.arraycopy(src, offset, data, 0, EXTENT_DESCRIPTOR_LENGTH);
- startBlock = BigEndian.getInt32(data, 0);
- blockCount = BigEndian.getInt32(data, 4);
+ startBlock = BigEndian.getUInt32(data, 0);
+ blockCount = BigEndian.getUInt32(data, 4);
}
/**
@@ -66,15 +66,15 @@
*/
public final byte[] getBytes() {
byte[] data = new byte[EXTENT_DESCRIPTOR_LENGTH];
- BigEndian.setInt32(data, 0, startBlock);
- BigEndian.setInt32(data, 4, blockCount);
+ BigEndian.setInt32(data, 0, (int) startBlock);
+ BigEndian.setInt32(data, 4, (int) blockCount);
return data;
}
public byte[] write(byte[] dest, int destOffSet) {
byte[] data = new byte[EXTENT_DESCRIPTOR_LENGTH];
- BigEndian.setInt32(data, 0, startBlock);
- BigEndian.setInt32(data, 4, blockCount);
+ BigEndian.setInt32(data, 0, (int) startBlock);
+ BigEndian.setInt32(data, 4, (int) blockCount);
System.arraycopy(data, 0, dest, destOffSet, EXTENT_DESCRIPTOR_LENGTH);
return dest;
}
@@ -90,7 +90,7 @@
* @return offset of the extent.
*/
public long getStartOffset(int nodeSize) {
- return (long)startBlock * nodeSize;
+ return startBlock * nodeSize;
}
/**
@@ -98,7 +98,7 @@
*
* @return block number of the next extent.
*/
- public int getNext() {
+ public long getNext() {
return startBlock + blockCount;
}
@@ -109,7 +109,7 @@
* @return size of the extent.
*/
public long getSize(int nodeSize) {
- return (long)blockCount * nodeSize;
+ return blockCount * nodeSize;
}
/**
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|