diff --git a/NyaFs/Filesystem/Ext2/Ext2FsBase.cs b/NyaFs/Filesystem/Ext2/Ext2FsBase.cs
index 92fa77f..7c08905 100644
--- a/NyaFs/Filesystem/Ext2/Ext2FsBase.cs
+++ b/NyaFs/Filesystem/Ext2/Ext2FsBase.cs
@@ -163,6 +163,5 @@ internal byte[] GetINodeContent(Types.ExtINode Node)
return GetINodeBlockContent(Node);
}
}
-
}
-}
+}
\ No newline at end of file
diff --git a/NyaFs/Filesystem/Ext2/Ext2FsBuilder.cs b/NyaFs/Filesystem/Ext2/Ext2FsBuilder.cs
index 5280272..721e89a 100644
--- a/NyaFs/Filesystem/Ext2/Ext2FsBuilder.cs
+++ b/NyaFs/Filesystem/Ext2/Ext2FsBuilder.cs
@@ -55,7 +55,7 @@ private void MarkBlockBusy(uint Block, bool MarkInBG = true)
{
BlockMap[MapIndex] |= (1u << MapBit);
- if(MarkInBG)
+ if (MarkInBG)
MarkBlockAsUsedInBlockGroup(Block);
}
}
@@ -190,7 +190,7 @@ private void DuplicateSuperblocks()
///
public byte[] GetFilesystemImage()
{
- foreach(var D in Dirs)
+ foreach (var D in Dirs)
{
SetNodeBlockContent(D.Node, D.Content);
D.Node.LinksCount = Convert.ToUInt32(D.Entries.Count(E => GetINode(E.INode).FsNodeType == Universal.Types.FilesystemItemType.Directory));
@@ -205,9 +205,9 @@ private BuilderDirectory GetParentDirectory(string Path)
{
var Parent = Universal.Helper.FsHelper.GetParentDirPath(Path);
- foreach(var D in Dirs)
+ foreach (var D in Dirs)
{
- if(D.Path == Parent)
+ if (D.Path == Parent)
return D;
}
@@ -266,7 +266,7 @@ private void AddNestedNode(string Path, Func NodeGetter)
Parent.Entries.Add(new Types.ExtDirectoryEntry(Convert.ToUInt32(N.Index), Types.ExtINodeType.NONE, Universal.Helper.FsHelper.GetName(Path)));
var BG = GetBlockGroupByNodeId(N.Index);
- if(N.NodeType == Types.ExtINodeType.DIR)
+ if (N.NodeType == Types.ExtINodeType.DIR)
{
BG.UsedDirsCountLo++;
@@ -340,14 +340,14 @@ public void Directory(string Path, uint User, uint Group, uint Mode)
Dirs.Add(D);
var BG = GetBlockGroupByNodeId(N.Index);
- BG.UsedDirsCountLo++;
+ BG.UsedDirsCountLo++;
D.Entries.Add(new Types.ExtDirectoryEntry(Convert.ToUInt32(N.Index), Types.ExtINodeType.NONE, "."));
D.Entries.Add(new Types.ExtDirectoryEntry(Convert.ToUInt32(N.Index), Types.ExtINodeType.NONE, ".."));
INodeIndex += 12; // skip reserved items
}
- else
+ else
throw new ArgumentException("Cannot create new root node");
}
else
@@ -422,7 +422,7 @@ public void SymLink(string Path, string Target, uint User, uint Group, uint Mode
{
var N = CreateNewINode(Types.ExtINodeType.LINK, User, Group, Mode);
- if(Target.Length <= 60)
+ if (Target.Length <= 60)
N.SetText(Target);
else
SetNodeBlockContent(N, UTF8Encoding.UTF8.GetBytes(Target));
@@ -472,11 +472,11 @@ uint GetNewBlock()
void AddBlockToNode(Types.ExtINode Node, uint Block)
{
var Index = Node.BlocksCount;
- if(Index < 12)
+ if (Index < 12)
{
Node.UpdateBlockByIndex(Index, Block);
}
- else if(Index < 12 + (Superblock.BlockSize / 4))
+ else if (Index < 12 + (Superblock.BlockSize / 4))
{
uint Offset = Index - 12;
// One-level indirect table
@@ -609,7 +609,7 @@ public byte[] Content
for (int i = 0; i < Entries.Count; i++)
{
var E = Entries[i];
- if(Temp.Count + E.getLength() > TempBlock.Length)
+ if (Temp.Count + E.getLength() > TempBlock.Length)
{
TempBlock.WriteArray(0, Temp.ToArray(), Temp.Count);
var Last = new Types.ExtDirectoryEntry(TempBlock, PrevSize);
@@ -635,4 +635,4 @@ public byte[] Content
}
}
}
-}
+}
\ No newline at end of file
diff --git a/NyaFs/Filesystem/Ext2/Types/ExtBlockGroup.cs b/NyaFs/Filesystem/Ext2/Types/ExtBlockGroup.cs
index a1f4725..3337d6d 100644
--- a/NyaFs/Filesystem/Ext2/Types/ExtBlockGroup.cs
+++ b/NyaFs/Filesystem/Ext2/Types/ExtBlockGroup.cs
@@ -141,4 +141,4 @@ public uint Checksum
set { WriteUInt16(0x1E, value); }
}
}
-}
+}
\ No newline at end of file
diff --git a/NyaFs/Filesystem/Ext2/Types/ExtINode.cs b/NyaFs/Filesystem/Ext2/Types/ExtINode.cs
index 77a5236..5f67f4f 100644
--- a/NyaFs/Filesystem/Ext2/Types/ExtINode.cs
+++ b/NyaFs/Filesystem/Ext2/Types/ExtINode.cs
@@ -7,8 +7,8 @@ namespace NyaFs.Filesystem.Ext2.Types
{
internal class ExtINode : ArrayWrapper
{
- public readonly uint Index;
public uint BlocksCount = 0;
+ public readonly uint Index;
///
/// Wrapper for INode struct
@@ -77,7 +77,7 @@ public uint Mode
/// 0xA000 S_IFLNK(Symbolic link)
/// 0xC000 S_IFSOCK(Socket)
///
- public ExtINodeType NodeType => (ExtINodeType)(Mode & 0xF000);
+ public ExtINodeType NodeType => (ExtINodeType)(Mode & 0xF000);
///
/// Filesystem node type
diff --git a/NyaFs/Filesystem/Ext2/Types/ExtSuperBlock.cs b/NyaFs/Filesystem/Ext2/Types/ExtSuperBlock.cs
index 2e9cfd5..cea08d3 100644
--- a/NyaFs/Filesystem/Ext2/Types/ExtSuperBlock.cs
+++ b/NyaFs/Filesystem/Ext2/Types/ExtSuperBlock.cs
@@ -162,8 +162,8 @@ public DateTime MountTime
///
public uint WTime
{
- get { return ReadUInt32(0x30); }
- set { WriteUInt32(0x30, value); }
+ get { return ReadUInt32(0x2C); }
+ set { WriteUInt32(0x2C, value); }
}
///
@@ -324,11 +324,11 @@ public uint DefaultReservedGid
set { WriteUInt16(0x52, value); }
}
- // ext2: 0x68 74 CC 73 3B
- // ext2: 0x6c 6C 44 44 AE
- // ext2: 0x70 AE 20 23 9F
- // ext2: 0x74 0F 21 C0 CB
-
+ // These fields are for EXT4_DYNAMIC_REV superblocks only.
+ // Note: the difference between the compatible feature set and the incompatible feature set is that if there is a bit set in the incompatible
+ // feature set that the kernel doesn't know about, it should refuse to mount the filesystem.
+ // e2fsck's requirements are more strict; if it doesn't know about a feature in either the compatible or incompatible feature set,
+ // it must abort and not try to meddle with things it doesn't understand...
///
/// First non-reserved inode.
@@ -467,5 +467,24 @@ public string VolumeName
set { WriteString(0x78, value, 0x10); }
}
+ ///
+ /// Directory where filesystem was last mounted.
+ /// char s_last_mounted[64] (0x88)
+ ///
+ public string LastMountedDir
+ {
+ get { return ReadString(0x88, 0x40); }
+ set { WriteString(0x88, value, 0x40); }
+ }
+
+ ///
+ /// For compression (Not used in e2fsprogs/Linux)
+ /// s_algorithm_usage_bitmap (0xC8)
+ ///
+ public uint AlgorithmUsageBitmap
+ {
+ get { return ReadUInt32(0xC8); }
+ set { WriteUInt32(0xC8, value); }
+ }
}
}
diff --git a/readme.md b/readme.md
index 5eab3f1..00eaa76 100644
--- a/readme.md
+++ b/readme.md
@@ -11,7 +11,7 @@ There is possible to add or update files in ramfs image.
## Supported filesystems
Supported at now:
1. CPIO ASCII (RW)
-2. EXT2 (R)
+2. EXT2 (RW)
3. SquashFs (R)
## Supported compression types
@@ -74,12 +74,12 @@ reset
```
## Commands for image loading
-### Composite images
-Load kernel, fs or/and devtree from image (with autodetection of image type):
+Default load command (type and image format autodetect):
```
load
```
+### Composite images
Load only one image from FIT image, where imagetype is "kernel", "ramfs" or "devtree":
```
load fit
@@ -106,7 +106,7 @@ load ramfs ext2
```
Load fs from squashfs image:
```
-load ramfs squashfs
+load ramfs squashfs
```
### Kernel image
@@ -150,12 +150,17 @@ Store fs as legacy image:
```
store ramfs legacy
```
-Store fs as compressed cpio archive:
+Store fs as compressed cpio/ext2 archive:
```
-store ramfs
+store ramfs
```
(compression) is "gzip", "lz4", "lzma", "bzip2"
+Store fs as ext2 image:
+```
+store ramfs ext2
+```
+
Store fs as cpio file:
```
store ramfs cpio
@@ -190,6 +195,12 @@ export
```
## Commands for modify image parameters:
+Update filesystem type:
+```
+set ramfs filesystem
+```
+(fs) is one of 'ext2' or 'cpio'.
+
Update target OS for image:
```
set os