Bugfixing initrd and ld-acess
[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 // === IMPORTS ==
9 extern tVFS_Node        gInitRD_RootNode;
10
11 // === PROTOTYPES ===
12  int    InitRD_Install(char **Arguments);
13 tVFS_Node       *InitRD_InitDevice(char *Device, char **Arguments);
14 void    InitRD_Unmount(tVFS_Node *Node);
15 Uint64  InitRD_ReadFile(tVFS_Node *Node, Uint64 Offset, Uint64 Size, void *Buffer);
16 char    *InitRD_ReadDir(tVFS_Node *Node, int ID);
17 tVFS_Node       *InitRD_FindDir(tVFS_Node *Node, char *Name);
18
19 // === GLOBALS ===
20 MODULE_DEFINE(0, 0x0A, FS_InitRD, InitRD_Install, NULL);
21 tVFS_Driver     gInitRD_FSInfo = {
22         "initrd", 0, InitRD_InitDevice, InitRD_Unmount, NULL
23         };
24
25 /**
26  * \brief Register initrd with the kernel
27  */
28 int InitRD_Install(char **Arguments)
29 {
30         VFS_AddDriver( &gInitRD_FSInfo );
31         return MODULE_ERR_OK;
32 }
33
34 /**
35  * \brief Mount the InitRD
36  */
37 tVFS_Node *InitRD_InitDevice(char *Device, char **Arguments)
38 {
39         return &gInitRD_RootNode;
40 }
41
42 /**
43  * \brief Unmount the InitRD
44  */
45 void InitRD_Unmount(tVFS_Node *Node)
46 {
47 }
48
49 /**
50  * \brief Read from a file
51  */
52 Uint64 InitRD_ReadFile(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
53 {
54         if(Offset > Node->Size)
55                 return 0;
56         if(Offset + Length > Node->Size)
57                 Length = Node->Size - Offset;
58         
59         memcpy(Buffer, Node->ImplPtr+Offset, Length);
60         
61         return Length;
62 }
63
64 /**
65  * \brief Read from a directory
66  */
67 char *InitRD_ReadDir(tVFS_Node *Node, int ID)
68 {
69         tInitRD_File    *dir = Node->ImplPtr;
70         
71         if(ID >= Node->Size)
72                 return NULL;
73         
74         return strdup(dir[ID].Name);
75 }
76
77 /**
78  * \brief Find an element in a directory
79  */
80 tVFS_Node *InitRD_FindDir(tVFS_Node *Node, char *Name)
81 {
82          int    i;
83         tInitRD_File    *dir = Node->ImplPtr;
84         
85         Log("InirRD_FindDir: Name = '%s'", Name);
86         
87         for( i = 0; i < Node->Size; i++ )
88         {
89                 if(strcmp(Name, dir[i].Name) == 0)
90                         return dir[i].Node;
91         }
92         
93         return NULL;
94 }

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