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

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