3 * InitRD Driver Version 1
8 #define DUMP_ON_MOUNT 0
11 extern tVFS_Node gInitRD_RootNode;
12 extern const int giInitRD_NumFiles;
13 extern tVFS_Node * const gInitRD_FileList[];
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, Uint Flags);
21 int InitRD_ReadDir(tVFS_Node *Node, int ID, char Dest[FILENAME_MAX]);
22 tVFS_Node *InitRD_FindDir(tVFS_Node *Node, const char *Name, Uint Flags);
23 void InitRD_DumpDir(tVFS_Node *Node, int Indent);
26 MODULE_DEFINE(0, 0x0A, FS_InitRD, InitRD_Install, NULL);
27 tVFS_Driver gInitRD_FSInfo = {
29 .InitDevice = InitRD_InitDevice,
30 .Unmount = InitRD_Unmount,
31 .GetNodeFromINode = InitRD_GetNodeFromINode
33 tVFS_NodeType gInitRD_DirType = {
34 .ReadDir = InitRD_ReadDir,
35 .FindDir = InitRD_FindDir
37 tVFS_NodeType gInitRD_FileType = {
38 .Read = InitRD_ReadFile
42 * \brief Register initrd with the kernel
44 int InitRD_Install(char **Arguments)
46 VFS_AddDriver( &gInitRD_FSInfo );
52 * \brief Mount the InitRD
54 tVFS_Node *InitRD_InitDevice(const char *Device, const char **Arguments)
57 InitRD_DumpDir( &gInitRD_RootNode, 0 );
59 return &gInitRD_RootNode;
63 * \brief Unmount the InitRD
65 void InitRD_Unmount(tVFS_Node *Node)
71 tVFS_Node *InitRD_GetNodeFromINode(tVFS_Node *Root, Uint64 Inode)
73 if( Inode >= giInitRD_NumFiles ) return NULL;
74 return gInitRD_FileList[Inode];
78 * \brief Read from a file
80 size_t InitRD_ReadFile(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags)
82 if(Offset > Node->Size)
84 if(Offset + Length > Node->Size)
85 Length = Node->Size - Offset;
87 memcpy(Buffer, Node->ImplPtr+Offset, Length);
93 * \brief Read from a directory
95 int InitRD_ReadDir(tVFS_Node *Node, int ID, char Dest[FILENAME_MAX])
97 tInitRD_File *dir = Node->ImplPtr;
102 strncpy(Dest, dir[ID].Name, FILENAME_MAX);
107 * \brief Find an element in a directory
109 tVFS_Node *InitRD_FindDir(tVFS_Node *Node, const char *Name, Uint Flags)
112 tInitRD_File *dir = Node->ImplPtr;
114 LOG("Name = '%s'", Name);
116 for( i = 0; i < Node->Size; i++ )
118 if(strcmp(Name, dir[i].Name) == 0)
125 void InitRD_DumpDir(tVFS_Node *Node, int Indent)
128 char indent[Indent+1];
129 tInitRD_File *dir = Node->ImplPtr;
131 for( i = 0; i < Indent; i++ ) indent[i] = ' ';
134 for( i = 0; i < Node->Size; i++ )
136 Log_Debug("InitRD", "%s- %p %s", indent, dir[i].Node, dir[i].Name);
137 if(dir[i].Node->Flags & VFS_FFLAG_DIRECTORY)
138 InitRD_DumpDir(dir[i].Node, Indent+1);