Modules/InitRD - Added new files, and re-added debug
[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(const char *Device, const 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, const 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         Log_Notice("InitRD", "Installed");
34         VFS_AddDriver( &gInitRD_FSInfo );
35         
36         return MODULE_ERR_OK;
37 }
38
39 /**
40  * \brief Mount the InitRD
41  */
42 tVFS_Node *InitRD_InitDevice(const char *Device, const char **Arguments)
43 {
44         #if DUMP_ON_MOUNT
45         InitRD_DumpDir( &gInitRD_RootNode, 0 );
46         #endif
47         Log_Notice("InitRD", "Mounted");
48         return &gInitRD_RootNode;
49 }
50
51 /**
52  * \brief Unmount the InitRD
53  */
54 void InitRD_Unmount(tVFS_Node *Node)
55 {
56 }
57
58 /**
59  * \brief Read from a file
60  */
61 Uint64 InitRD_ReadFile(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
62 {
63         if(Offset > Node->Size)
64                 return 0;
65         if(Offset + Length > Node->Size)
66                 Length = Node->Size - Offset;
67         
68         memcpy(Buffer, Node->ImplPtr+Offset, Length);
69         
70         return Length;
71 }
72
73 /**
74  * \brief Read from a directory
75  */
76 char *InitRD_ReadDir(tVFS_Node *Node, int ID)
77 {
78         tInitRD_File    *dir = Node->ImplPtr;
79         
80         if(ID >= Node->Size)
81                 return NULL;
82         
83         return strdup(dir[ID].Name);
84 }
85
86 /**
87  * \brief Find an element in a directory
88  */
89 tVFS_Node *InitRD_FindDir(tVFS_Node *Node, const char *Name)
90 {
91          int    i;
92         tInitRD_File    *dir = Node->ImplPtr;
93         
94         LOG("Name = '%s'", Name);
95         
96         for( i = 0; i < Node->Size; i++ )
97         {
98                 if(strcmp(Name, dir[i].Name) == 0)
99                         return dir[i].Node;
100         }
101         
102         return NULL;
103 }
104
105 void InitRD_DumpDir(tVFS_Node *Node, int Indent)
106 {
107          int    i;
108         char    indent[Indent+1];
109         tInitRD_File    *dir = Node->ImplPtr;
110         
111         for( i = 0; i < Indent; i++ )   indent[i] = ' ';
112         indent[i] = '\0';
113         
114         for( i = 0; i < Node->Size; i++ )
115         {
116                 Log_Debug("InitRD", "%s- %p %s", indent, dir[i].Node, dir[i].Name);
117                 if(dir[i].Node->Flags & VFS_FFLAG_DIRECTORY)
118                         InitRD_DumpDir(dir[i].Node, Indent+1);
119         }
120 }

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