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

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