13 extern tVFS_Driver gRootFS_Info;
14 extern tVFS_Driver gDevFS_Info;
19 char *VFS_GetTruePath(const char *Path);
20 void VFS_GetMemPath(char *Dest, void *Base, Uint Length);
21 tVFS_Driver *VFS_GetFSByName(const char *Name);
22 int VFS_AddDriver(tVFS_Driver *Info);
24 void VFS_UpdateDriverFile(void);
27 EXPORT(VFS_AddDriver);
30 tVFS_Node NULLNode = {.Type=NULL};
31 tShortSpinlock slDriverListLock;
32 tVFS_Driver *gVFS_Drivers = NULL;
33 char *gsVFS_DriverFile = NULL;
34 int giVFS_DriverFileID = 0;
36 char *gsVFS_MountFile = NULL;
37 int giVFS_MountFileID = 0;
41 * \fn int VFS_Init(void)
42 * \brief Initialises the VFS for use by the kernel and user
47 gVFS_Drivers = &gRootFS_Info;
48 gVFS_Drivers->Next = &gDevFS_Info;
49 VFS_UpdateDriverFile();
51 // Register with SysFS
52 giVFS_MountFileID = SysFS_RegisterFile("VFS/Mounts", NULL, 0);
53 giVFS_DriverFileID = SysFS_RegisterFile("VFS/Drivers", NULL, 0);
55 if( VFS_Mount("root", "/", "rootfs", "") != 0 ) {
56 Log_KernelPanic("VFS", "Unable to mount root (Where the **** is rootfs?)");
59 VFS_MkDir("/Devices");
61 VFS_Mount("dev", "/Devices", "devfs", "");
63 // Set default max user file count
64 // - Applies to PID0, but propagated to all children
65 *Threads_GetMaxFD(NULL) = 32;
71 SysFS_RemoveFile(giVFS_MountFileID);
72 free(gsVFS_MountFile);
73 SysFS_RemoveFile(giVFS_DriverFileID);
74 free(gsVFS_DriverFile);
78 * \fn char *VFS_GetTruePath(const char *Path)
79 * \brief Gets the true path (non-symlink) of a file
81 char *VFS_GetTruePath(const char *Path)
86 tmp = VFS_GetAbsPath(Path);
87 if(tmp == NULL) return NULL;
88 //Log(" VFS_GetTruePath: tmp = '%s'", tmp);
89 node = VFS_ParsePath(tmp, &ret, NULL);
91 //Log(" VFS_GetTruePath: node=%p, ret='%s'", node, ret);
93 if(!node) return NULL;
94 if(node->Type->Close) node->Type->Close(node);
100 * \fn void VFS_GetMemPath(char *Dest, void *Base, Uint Length)
101 * \brief Create a VFS memory pointer path
103 void VFS_GetMemPath(char *Dest, void *Base, Uint Length)
106 itoa( &Dest[1], (tVAddr)Base, 16, BITS/4, '0' );
107 Dest[BITS/4+1] = ':';
108 itoa( &Dest[BITS/4+2], Length, 16, BITS/4, '0' );
109 Dest[BITS/2+2] = '\0';
113 * \fn tVFS_Driver *VFS_GetFSByName(const char *Name)
114 * \brief Gets a filesystem structure given a name
116 tVFS_Driver *VFS_GetFSByName(const char *Name)
118 tVFS_Driver *drv = gVFS_Drivers;
120 for(;drv;drv=drv->Next)
122 // Log("strcmp('%s' (%p), '%s') == 0?", drv->Name, drv->Name, Name);
123 if(strcmp(drv->Name, Name) == 0)
130 * \fn int VFS_AddDriver(tVFS_Driver *Info)
132 int VFS_AddDriver(tVFS_Driver *Info)
136 SHORTLOCK( &slDriverListLock );
137 Info->Next = gVFS_Drivers;
139 SHORTREL( &slDriverListLock );
141 VFS_UpdateDriverFile();
147 * \fn void VFS_UpdateDriverFile(void)
148 * \brief Updates the driver list file
150 void VFS_UpdateDriverFile(void)
158 for( drv = gVFS_Drivers; drv; drv = drv->Next )
160 len += 1 + strlen(drv->Name);
164 for( drv = gVFS_Drivers; drv; drv = drv->Next )
166 strcpy( &buf[len], drv->Name );
167 len += strlen(drv->Name);
172 SysFS_UpdateFile( giVFS_DriverFileID, buf, len );
173 if(gsVFS_DriverFile) free(gsVFS_DriverFile);
174 gsVFS_DriverFile = buf;
177 void VFS_CleanupNode(tVFS_Node *Node)