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

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