Usermode/ld-acess - Added two more ARM relocation types
[tpg/acess2.git] / Kernel / vfs / main.c
1 /* 
2  * Acess 2
3  * Virtual File System
4  */
5 #include <acess.h>
6 #include <fs_sysfs.h>
7 #include "vfs.h"
8 #include "vfs_int.h"
9 #include "vfs_ext.h"
10
11 // === IMPORTS ===
12 extern tVFS_Driver      gRootFS_Info;
13 extern tVFS_Driver      gDevFS_Info;
14
15 // === PROTOTYPES ===
16 #if 0
17  int    VFS_Init(void);
18 char    *VFS_GetTruePath(const char *Path);
19 void    VFS_GetMemPath(char *Dest, void *Base, Uint Length);
20 tVFS_Driver     *VFS_GetFSByName(const char *Name);
21  int    VFS_AddDriver(tVFS_Driver *Info);
22 #endif
23 void    VFS_UpdateDriverFile(void);
24
25 // === EXPORTS ===
26 EXPORT(VFS_AddDriver);
27
28 // === GLOBALS ===
29 tVFS_Node       NULLNode = {0};
30 tShortSpinlock  slDriverListLock;
31 tVFS_Driver     *gVFS_Drivers = NULL;
32 char    *gsVFS_DriverFile = NULL;
33  int    giVFS_DriverFileID = 0;
34
35 char    *gsVFS_MountFile = NULL;
36  int    giVFS_MountFileID = 0;
37
38 // === CODE ===
39 /**
40  * \fn int VFS_Init(void)
41  * \brief Initialises the VFS for use by the kernel and user
42  */
43 int VFS_Init(void)
44 {
45         // Core Drivers
46         gVFS_Drivers = &gRootFS_Info;
47         gVFS_Drivers->Next = &gDevFS_Info;
48         VFS_UpdateDriverFile();
49         
50         // Register with SysFS
51         giVFS_MountFileID = SysFS_RegisterFile("VFS/Mounts", NULL, 0);
52         giVFS_DriverFileID = SysFS_RegisterFile("VFS/Drivers", NULL, 0);
53         
54         if( VFS_Mount("root", "/", "rootfs", "") != 0 ) {
55                 Log_KernelPanic("VFS", "Unable to mount root (Where the **** is rootfs?)");
56                 return -1;
57         }
58         VFS_MkDir("/Devices");
59         VFS_MkDir("/Mount");
60         VFS_Mount("dev", "/Devices", "devfs", "");
61                 
62         Log_Debug("VFS", "Setting max files");
63         CFGINT(CFG_VFS_MAXFILES) = 32;
64         return 0;
65 }
66
67 /**
68  * \fn char *VFS_GetTruePath(const char *Path)
69  * \brief Gets the true path (non-symlink) of a file
70  */
71 char *VFS_GetTruePath(const char *Path)
72 {
73         tVFS_Node       *node;
74         char    *ret, *tmp;
75         
76         tmp = VFS_GetAbsPath(Path);
77         if(tmp == NULL) return NULL;
78         //Log(" VFS_GetTruePath: tmp = '%s'", tmp);
79         node = VFS_ParsePath(tmp, &ret, NULL);
80         free(tmp);
81         //Log(" VFS_GetTruePath: node=%p, ret='%s'", node, ret);
82         
83         if(!node)       return NULL;
84         if(node->Close) node->Close(node);
85         
86         return ret;
87 }
88
89 /**
90  * \fn void VFS_GetMemPath(char *Dest, void *Base, Uint Length)
91  * \brief Create a VFS memory pointer path
92  */
93 void VFS_GetMemPath(char *Dest, void *Base, Uint Length)
94 {
95         Dest[0] = '$';
96         itoa( &Dest[1], (tVAddr)Base, 16, BITS/4, '0' );
97         Dest[BITS/4+1] = ':';
98         itoa( &Dest[BITS/4+2], Length, 16, BITS/4, '0' );
99         Dest[BITS/2+2] = '\0';
100 }
101
102 /**
103  * \fn tVFS_Driver *VFS_GetFSByName(const char *Name)
104  * \brief Gets a filesystem structure given a name
105  */
106 tVFS_Driver *VFS_GetFSByName(const char *Name)
107 {
108         tVFS_Driver     *drv = gVFS_Drivers;
109         
110         for(;drv;drv=drv->Next)
111         {
112 //              Log("strcmp('%s' (%p), '%s') == 0?", drv->Name, drv->Name, Name);
113                 if(strcmp(drv->Name, Name) == 0)
114                         return drv;
115         }
116         return NULL;
117 }
118
119 /**
120  * \fn int VFS_AddDriver(tVFS_Driver *Info)
121  */
122 int VFS_AddDriver(tVFS_Driver *Info)
123 {
124         if(!Info)       return  -1;
125         
126         SHORTLOCK( &slDriverListLock );
127         Info->Next = gVFS_Drivers;
128         gVFS_Drivers = Info;
129         SHORTREL( &slDriverListLock );
130         
131         VFS_UpdateDriverFile();
132         
133         return 0;
134 }
135
136 /**
137  * \fn void VFS_UpdateDriverFile(void)
138  * \brief Updates the driver list file
139  */
140 void VFS_UpdateDriverFile(void)
141 {
142         tVFS_Driver     *drv;
143          int    len = 0;
144         char    *buf;
145         
146         // Format:
147         // <name>\n
148         for( drv = gVFS_Drivers; drv; drv = drv->Next )
149         {
150                 len += 1 + strlen(drv->Name);
151         }
152         buf = malloc(len+1);
153         len = 0;
154         for( drv = gVFS_Drivers; drv; drv = drv->Next )
155         {
156                 strcpy( &buf[len], drv->Name );
157                 len += strlen(drv->Name);
158                 buf[len++] = '\n';
159         }
160         buf[len] = '\0';
161         
162         SysFS_UpdateFile( giVFS_DriverFileID, buf, len );
163         if(gsVFS_DriverFile)    free(gsVFS_DriverFile);
164         gsVFS_DriverFile = buf;
165 }

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