Modules/InitRD - Added inode number lookup support
authorJohn Hodge <[email protected]>
Fri, 14 Oct 2011 07:49:25 +0000 (15:49 +0800)
committerJohn Hodge <[email protected]>
Fri, 14 Oct 2011 07:49:25 +0000 (15:49 +0800)
Modules/Filesystems/InitRD/GenerateInitRD.php
Modules/Filesystems/InitRD/main.c

index a7152cc..03b7d81 100644 (file)
@@ -65,12 +65,15 @@ function hd8($fp)
        return "0x".str_pad( dechex(ord(fgetc($fp))), 2, "0", STR_PAD_LEFT );
 }
 
+$inode = 0;
 function ProcessFolder($prefix, $items)
 {
        global  $gOutput, $gDependencies;
        global  $ACESSDIR, $ARCH;
+       global  $inode;
        foreach($items as $i=>$item)
        {
+               $inode ++;
                if(is_array($item[1]))
                {
                        ProcessFolder("{$prefix}_{$i}", $item[1]);
@@ -90,6 +93,7 @@ tVFS_Node {$prefix}_{$i} = {
        .ACLs = &gVFS_ACL_EveryoneRX,
        .Flags = VFS_FFLAG_DIRECTORY,
        .Size = $size,
+       .Inode = {$inode},
        .ImplPtr = {$prefix}_{$i}_entries,
        .ReadDir = InitRD_ReadDir,
        .FindDir = InitRD_FindDir
@@ -142,6 +146,7 @@ tVFS_Node {$prefix}_{$i} = {
        .ACLs = &gVFS_ACL_EveryoneRX,
        .Flags = 0,
        .Size = $size,
+       .Inode = {$inode},
        .ImplPtr = {$prefix}_{$i}_data,
        .Read = InitRD_ReadFile
 };
@@ -176,6 +181,34 @@ tVFS_Node gInitRD_RootNode = {
 };
 EOF;
 
+$gOutput .= <<<EOF
+
+tVFS_Node * const gInitRD_FileList[] = {
+&gInitRD_RootNode
+EOF;
+
+function PutNodePointers($prefix, $items)
+{
+       global $gOutput;
+       foreach($items as $i=>$item)
+       {
+               $gOutput .= ",&{$prefix}_{$i}";
+               if(is_array($item[1]))
+               {
+                       PutNodePointers("{$prefix}_{$i}", $item[1]);
+               }
+       }
+}
+
+PutNodePointers("gInitRD_Files", $lStack[0][1]);
+
+$gOutput .= <<<EOF
+};
+const int giInitRD_NumFiles = sizeof(gInitRD_FileList)/sizeof(gInitRD_FileList[0]);
+
+EOF;
+
+
 $fp = fopen($gOutputFile, "w");
 fputs($fp, $gOutput);
 fclose($fp);
index 9a78389..fa9ded6 100644 (file)
@@ -9,11 +9,14 @@
 
 // === IMPORTS ==
 extern tVFS_Node       gInitRD_RootNode;
+extern const int       giInitRD_NumFiles;
+extern tVFS_Node * const       gInitRD_FileList[];
 
 // === PROTOTYPES ===
  int   InitRD_Install(char **Arguments);
 tVFS_Node      *InitRD_InitDevice(const char *Device, const char **Arguments);
 void   InitRD_Unmount(tVFS_Node *Node);
+tVFS_Node      *InitRD_GetNodeFromINode(tVFS_Node *Root, Uint64 Inode);
 Uint64 InitRD_ReadFile(tVFS_Node *Node, Uint64 Offset, Uint64 Size, void *Buffer);
 char   *InitRD_ReadDir(tVFS_Node *Node, int ID);
 tVFS_Node      *InitRD_FindDir(tVFS_Node *Node, const char *Name);
@@ -22,7 +25,7 @@ void  InitRD_DumpDir(tVFS_Node *Node, int Indent);
 // === GLOBALS ===
 MODULE_DEFINE(0, 0x0A, FS_InitRD, InitRD_Install, NULL);
 tVFS_Driver    gInitRD_FSInfo = {
-       "initrd", 0, InitRD_InitDevice, InitRD_Unmount, NULL
+       "initrd", 0, InitRD_InitDevice, InitRD_Unmount, InitRD_GetNodeFromINode
        };
 
 /**
@@ -55,6 +58,14 @@ void InitRD_Unmount(tVFS_Node *Node)
 {
 }
 
+/**
+ */
+tVFS_Node *InitRD_GetNodeFromINode(tVFS_Node *Root, Uint64 Inode)
+{
+       if( Inode >= giInitRD_NumFiles )        return NULL;
+       return gInitRD_FileList[Inode];
+}
+
 /**
  * \brief Read from a file
  */

UCC git Repository :: git.ucc.asn.au