Kernel - VFS API Update - ReadDir caller provided buffer
[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  int    InitRD_ReadDir(tVFS_Node *Node, int ID, char Dest[FILENAME_MAX]);
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         VFS_AddDriver( &gInitRD_FSInfo );
47         
48         return MODULE_ERR_OK;
49 }
50
51 /**
52  * \brief Mount the InitRD
53  */
54 tVFS_Node *InitRD_InitDevice(const char *Device, const char **Arguments)
55 {
56         #if DUMP_ON_MOUNT
57         InitRD_DumpDir( &gInitRD_RootNode, 0 );
58         #endif
59         return &gInitRD_RootNode;
60 }
61
62 /**
63  * \brief Unmount the InitRD
64  */
65 void InitRD_Unmount(tVFS_Node *Node)
66 {
67 }
68
69 /**
70  */
71 tVFS_Node *InitRD_GetNodeFromINode(tVFS_Node *Root, Uint64 Inode)
72 {
73         if( Inode >= giInitRD_NumFiles )        return NULL;
74         return gInitRD_FileList[Inode];
75 }
76
77 /**
78  * \brief Read from a file
79  */
80 size_t InitRD_ReadFile(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer)
81 {
82         if(Offset > Node->Size)
83                 return 0;
84         if(Offset + Length > Node->Size)
85                 Length = Node->Size - Offset;
86         
87         memcpy(Buffer, Node->ImplPtr+Offset, Length);
88         
89         return Length;
90 }
91
92 /**
93  * \brief Read from a directory
94  */
95 int InitRD_ReadDir(tVFS_Node *Node, int ID, char Dest[FILENAME_MAX])
96 {
97         tInitRD_File    *dir = Node->ImplPtr;
98         
99         if(ID >= Node->Size)
100                 return -EINVAL;
101         
102         strncpy(Dest, dir[ID].Name, FILENAME_MAX);
103         return 0;
104 }
105
106 /**
107  * \brief Find an element in a directory
108  */
109 tVFS_Node *InitRD_FindDir(tVFS_Node *Node, const char *Name)
110 {
111          int    i;
112         tInitRD_File    *dir = Node->ImplPtr;
113         
114         LOG("Name = '%s'", Name);
115         
116         for( i = 0; i < Node->Size; i++ )
117         {
118                 if(strcmp(Name, dir[i].Name) == 0)
119                         return dir[i].Node;
120         }
121         
122         return NULL;
123 }
124
125 void InitRD_DumpDir(tVFS_Node *Node, int Indent)
126 {
127          int    i;
128         char    indent[Indent+1];
129         tInitRD_File    *dir = Node->ImplPtr;
130         
131         for( i = 0; i < Indent; i++ )   indent[i] = ' ';
132         indent[i] = '\0';
133         
134         for( i = 0; i < Node->Size; i++ )
135         {
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);
139         }
140 }

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