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();
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;
30 char *gsVFS_MountFile = NULL;
31 int giVFS_MountFileID = 0;
36 * \brief Initialises the VFS for use by the kernel and user
41 gVFS_Drivers = &gRootFS_Info;
42 gVFS_Drivers->Next = &gDevFS_Info;
43 VFS_UpdateDriverFile();
45 // Register with SysFS
46 giVFS_MountFileID = SysFS_RegisterFile("VFS/Mounts", NULL, 0);
47 giVFS_DriverFileID = SysFS_RegisterFile("VFS/Drivers", NULL, 0);
49 VFS_Mount("root", "/", "rootfs", "");
50 VFS_MkDir("/Devices");
52 VFS_Mount("dev", "/Devices", "devfs", "");
54 CFGINT(CFG_VFS_MAXFILES) = 32;
59 * \fn char *VFS_GetTruePath(char *Path)
60 * \brief Gets the true path (non-symlink) of a file
62 char *VFS_GetTruePath(char *Path)
67 tmp = VFS_GetAbsPath(Path);
68 if(tmp == NULL) return NULL;
69 node = VFS_ParsePath(tmp, &ret);
72 if(!node) return NULL;
73 if(node->Close) node->Close(node);
79 * \fn void VFS_GetMemPath(char *Dest, void *Base, Uint Length)
80 * \brief Create a VFS memory pointer path
82 void VFS_GetMemPath(char *Dest, void *Base, Uint Length)
84 Log("VFS_GetMemPath: (Base=%p, Length=0x%x, Dest=%p)", Base, Length, Dest);
86 itoa( &Dest[1], (Uint)Base, 16, BITS/4, '0' );
88 itoa( &Dest[BITS/4+2], Length, 16, BITS/4, '0' );
90 Log("VFS_GetMemPath: Dest = \"%s\"", Dest);
94 * \fn tVFS_Driver *VFS_GetFSByName(char *Name)
95 * \brief Gets a filesystem structure given a name
97 tVFS_Driver *VFS_GetFSByName(char *Name)
99 tVFS_Driver *drv = gVFS_Drivers;
101 for(;drv;drv=drv->Next)
103 if(strcmp(drv->Name, Name) == 0)
110 * \fn int VFS_AddDriver(tVFS_Driver *Info)
112 int VFS_AddDriver(tVFS_Driver *Info)
116 LOCK( &siDriverListLock );
117 Info->Next = gVFS_Drivers;
119 RELEASE( &siDriverListLock );
121 VFS_UpdateDriverFile();
127 * \fn void VFS_UpdateDriverFile()
128 * \brief Updates the driver list file
130 void VFS_UpdateDriverFile()
138 for( drv = gVFS_Drivers; drv; drv = drv->Next )
140 len += 1 + strlen(drv->Name);
144 for( drv = gVFS_Drivers; drv; drv = drv->Next )
146 strcpy( &buf[len], drv->Name );
147 len += strlen(drv->Name);
152 SysFS_UpdateFile( giVFS_DriverFileID, buf, len );
153 if(gsVFS_DriverFile) free(gsVFS_DriverFile);
154 gsVFS_DriverFile = buf;