Bit of debug cleanup, fixing bugs found on GrUB2
[tpg/acess2.git] / Modules / Filesystems / InitRD / main.c
1 /*
2  * Acess OS
3  * InitRD Driver Version 1
4  */
5 #include "initrd.h"
6 #include <modules.h>
7
8 #define DUMP_ON_MOUNT   1
9
10 // === IMPORTS ==
11 extern tVFS_Node        gInitRD_RootNode;
12
13 // === PROTOTYPES ===
14  int    InitRD_Install(char **Arguments);
15 tVFS_Node       *InitRD_InitDevice(char *Device, char **Arguments);
16 void    InitRD_Unmount(tVFS_Node *Node);
17 Uint64  InitRD_ReadFile(tVFS_Node *Node, Uint64 Offset, Uint64 Size, void *Buffer);
18 char    *InitRD_ReadDir(tVFS_Node *Node, int ID);
19 tVFS_Node       *InitRD_FindDir(tVFS_Node *Node, char *Name);
20 void    InitRD_DumpDir(tVFS_Node *Node, int Indent);
21
22 // === GLOBALS ===
23 MODULE_DEFINE(0, 0x0A, FS_InitRD, InitRD_Install, NULL);
24 tVFS_Driver     gInitRD_FSInfo = {
25         "initrd", 0, InitRD_InitDevice, InitRD_Unmount, NULL
26         };
27
28 /**
29  * \brief Register initrd with the kernel
30  */
31 int InitRD_Install(char **Arguments)
32 {
33         VFS_AddDriver( &gInitRD_FSInfo );
34         
35         return MODULE_ERR_OK;
36 }
37
38 /**
39  * \brief Mount the InitRD
40  */
41 tVFS_Node *InitRD_InitDevice(char *Device, char **Arguments)
42 {
43         #if DUMP_ON_MOUNT
44         InitRD_DumpDir( &gInitRD_RootNode, 0 );
45         #endif
46         return &gInitRD_RootNode;
47 }
48
49 /**
50  * \brief Unmount the InitRD
51  */
52 void InitRD_Unmount(tVFS_Node *Node)
53 {
54 }
55
56 /**
57  * \brief Read from a file
58  */
59 Uint64 InitRD_ReadFile(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
60 {
61         if(Offset > Node->Size)
62                 return 0;
63         if(Offset + Length > Node->Size)
64                 Length = Node->Size - Offset;
65         
66         memcpy(Buffer, Node->ImplPtr+Offset, Length);
67         
68         return Length;
69 }
70
71 /**
72  * \brief Read from a directory
73  */
74 char *InitRD_ReadDir(tVFS_Node *Node, int ID)
75 {
76         tInitRD_File    *dir = Node->ImplPtr;
77         
78         if(ID >= Node->Size)
79                 return NULL;
80         
81         return strdup(dir[ID].Name);
82 }
83
84 /**
85  * \brief Find an element in a directory
86  */
87 tVFS_Node *InitRD_FindDir(tVFS_Node *Node, char *Name)
88 {
89          int    i;
90         tInitRD_File    *dir = Node->ImplPtr;
91         
92         //Log("InirRD_FindDir: Name = '%s'", Name);
93         
94         for( i = 0; i < Node->Size; i++ )
95         {
96                 if(strcmp(Name, dir[i].Name) == 0)
97                         return dir[i].Node;
98         }
99         
100         return NULL;
101 }
102
103 void InitRD_DumpDir(tVFS_Node *Node, int Indent)
104 {
105          int    i;
106         char    indent[Indent+1];
107         tInitRD_File    *dir = Node->ImplPtr;
108         
109         for( i = 0; i < Indent; i++ )   indent[i] = ' ';
110         indent[i] = '\0';
111         
112         for( i = 0; i < Node->Size; i++ )
113         {
114                 //Log("%s- %p %s", indent, dir[i].Node, dir[i].Name);
115                 if(dir[i].Node->Flags & VFS_FFLAG_DIRECTORY)
116                         InitRD_DumpDir(dir[i].Node, Indent+1);
117         }
118 }

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