General cleanup and bugfixes
[tpg/acess2.git] / KernelLand / 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   0
9
10 // === IMPORTS ==
11 extern tVFS_Node        gInitRD_RootNode;
12 extern const int        giInitRD_NumFiles;
13 extern tVFS_Node * const        gInitRD_FileList[];
14
15 // === PROTOTYPES ===
16  int    InitRD_Install(char **Arguments);
17 tVFS_Node       *InitRD_InitDevice(const char *Device, const char **Arguments);
18 void    InitRD_Unmount(tVFS_Node *Node);
19 tVFS_Node       *InitRD_GetNodeFromINode(tVFS_Node *Root, Uint64 Inode);
20 size_t  InitRD_ReadFile(tVFS_Node *Node, off_t Offset, size_t Size, void *Buffer);
21 char    *InitRD_ReadDir(tVFS_Node *Node, int ID);
22 tVFS_Node       *InitRD_FindDir(tVFS_Node *Node, const char *Name);
23 void    InitRD_DumpDir(tVFS_Node *Node, int Indent);
24
25 // === GLOBALS ===
26 MODULE_DEFINE(0, 0x0A, FS_InitRD, InitRD_Install, NULL);
27 tVFS_Driver     gInitRD_FSInfo = {
28         .Name = "initrd",
29         .InitDevice = InitRD_InitDevice,
30         .Unmount = InitRD_Unmount,
31         .GetNodeFromINode = InitRD_GetNodeFromINode
32         };
33 tVFS_NodeType   gInitRD_DirType = {
34         .ReadDir = InitRD_ReadDir,
35         .FindDir = InitRD_FindDir
36         };
37 tVFS_NodeType   gInitRD_FileType = {
38         .Read = InitRD_ReadFile
39         };
40
41 /**
42  * \brief Register initrd with the kernel
43  */
44 int InitRD_Install(char **Arguments)
45 {
46         Log_Notice("InitRD", "Installed");
47         VFS_AddDriver( &gInitRD_FSInfo );
48         
49         return MODULE_ERR_OK;
50 }
51
52 /**
53  * \brief Mount the InitRD
54  */
55 tVFS_Node *InitRD_InitDevice(const char *Device, const char **Arguments)
56 {
57         #if DUMP_ON_MOUNT
58         InitRD_DumpDir( &gInitRD_RootNode, 0 );
59         #endif
60         Log_Notice("InitRD", "Mounted (%i files)", giInitRD_NumFiles);
61         return &gInitRD_RootNode;
62 }
63
64 /**
65  * \brief Unmount the InitRD
66  */
67 void InitRD_Unmount(tVFS_Node *Node)
68 {
69 }
70
71 /**
72  */
73 tVFS_Node *InitRD_GetNodeFromINode(tVFS_Node *Root, Uint64 Inode)
74 {
75         if( Inode >= giInitRD_NumFiles )        return NULL;
76         return gInitRD_FileList[Inode];
77 }
78
79 /**
80  * \brief Read from a file
81  */
82 size_t InitRD_ReadFile(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer)
83 {
84         if(Offset > Node->Size)
85                 return 0;
86         if(Offset + Length > Node->Size)
87                 Length = Node->Size - Offset;
88         
89         memcpy(Buffer, Node->ImplPtr+Offset, Length);
90         
91         return Length;
92 }
93
94 /**
95  * \brief Read from a directory
96  */
97 char *InitRD_ReadDir(tVFS_Node *Node, int ID)
98 {
99         tInitRD_File    *dir = Node->ImplPtr;
100         
101         if(ID >= Node->Size)
102                 return NULL;
103         
104         return strdup(dir[ID].Name);
105 }
106
107 /**
108  * \brief Find an element in a directory
109  */
110 tVFS_Node *InitRD_FindDir(tVFS_Node *Node, const char *Name)
111 {
112          int    i;
113         tInitRD_File    *dir = Node->ImplPtr;
114         
115         LOG("Name = '%s'", Name);
116         
117         for( i = 0; i < Node->Size; i++ )
118         {
119                 if(strcmp(Name, dir[i].Name) == 0)
120                         return dir[i].Node;
121         }
122         
123         return NULL;
124 }
125
126 void InitRD_DumpDir(tVFS_Node *Node, int Indent)
127 {
128          int    i;
129         char    indent[Indent+1];
130         tInitRD_File    *dir = Node->ImplPtr;
131         
132         for( i = 0; i < Indent; i++ )   indent[i] = ' ';
133         indent[i] = '\0';
134         
135         for( i = 0; i < Node->Size; i++ )
136         {
137                 Log_Debug("InitRD", "%s- %p %s", indent, dir[i].Node, dir[i].Name);
138                 if(dir[i].Node->Flags & VFS_FFLAG_DIRECTORY)
139                         InitRD_DumpDir(dir[i].Node, Indent+1);
140         }
141 }

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