12 extern tVFS_Driver gRootFS_Info;
13 extern tVFS_Driver gDevFS_Info;
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);
24 EXPORT(VFS_AddDriver);
27 tVFS_Node NULLNode = {0};
28 tSpinlock siDriverListLock = 0;
29 tVFS_Driver *gVFS_Drivers = NULL;
30 char *gsVFS_DriverFile = NULL;
31 int giVFS_DriverFileID = 0;
33 char *gsVFS_MountFile = NULL;
34 int giVFS_MountFileID = 0;
38 * \fn int VFS_Init(void)
39 * \brief Initialises the VFS for use by the kernel and user
44 gVFS_Drivers = &gRootFS_Info;
45 gVFS_Drivers->Next = &gDevFS_Info;
46 VFS_UpdateDriverFile();
48 // Register with SysFS
49 giVFS_MountFileID = SysFS_RegisterFile("VFS/Mounts", NULL, 0);
50 giVFS_DriverFileID = SysFS_RegisterFile("VFS/Drivers", NULL, 0);
52 if( VFS_Mount("root", "/", "rootfs", "") != 0 ) {
53 Panic("Unable to mount root (Where the **** is rootfs?)");
56 VFS_MkDir("/Devices");
58 VFS_Mount("dev", "/Devices", "devfs", "");
60 CFGINT(CFG_VFS_MAXFILES) = 32;
65 * \fn char *VFS_GetTruePath(char *Path)
66 * \brief Gets the true path (non-symlink) of a file
68 char *VFS_GetTruePath(char *Path)
73 tmp = VFS_GetAbsPath(Path);
74 if(tmp == NULL) return NULL;
75 node = VFS_ParsePath(tmp, &ret);
78 if(!node) return NULL;
79 if(node->Close) node->Close(node);
85 * \fn void VFS_GetMemPath(char *Dest, void *Base, Uint Length)
86 * \brief Create a VFS memory pointer path
88 void VFS_GetMemPath(char *Dest, void *Base, Uint Length)
91 itoa( &Dest[1], (Uint)Base, 16, BITS/4, '0' );
93 itoa( &Dest[BITS/4+2], Length, 16, BITS/4, '0' );
94 Dest[BITS/2+2] = '\0';
98 * \fn tVFS_Driver *VFS_GetFSByName(char *Name)
99 * \brief Gets a filesystem structure given a name
101 tVFS_Driver *VFS_GetFSByName(char *Name)
103 tVFS_Driver *drv = gVFS_Drivers;
105 for(;drv;drv=drv->Next)
107 Log("strcmp('%s' (%p), '%s') == 0?", drv->Name, drv->Name, Name);
108 if(strcmp(drv->Name, Name) == 0)
115 * \fn int VFS_AddDriver(tVFS_Driver *Info)
117 int VFS_AddDriver(tVFS_Driver *Info)
121 LOCK( &siDriverListLock );
122 Info->Next = gVFS_Drivers;
124 RELEASE( &siDriverListLock );
126 VFS_UpdateDriverFile();
132 * \fn void VFS_UpdateDriverFile(void)
133 * \brief Updates the driver list file
135 void VFS_UpdateDriverFile(void)
143 for( drv = gVFS_Drivers; drv; drv = drv->Next )
145 len += 1 + strlen(drv->Name);
149 for( drv = gVFS_Drivers; drv; drv = drv->Next )
151 strcpy( &buf[len], drv->Name );
152 len += strlen(drv->Name);
157 SysFS_UpdateFile( giVFS_DriverFileID, buf, len );
158 if(gsVFS_DriverFile) free(gsVFS_DriverFile);
159 gsVFS_DriverFile = buf;