* Acess 2
* Virtual File System
*/
-#include <common.h>
+#include <acess.h>
+#include <fs_sysfs.h>
#include "vfs.h"
#include "vfs_int.h"
#include "vfs_ext.h"
extern tVFS_Driver gRootFS_Info;
extern tVFS_Driver gDevFS_Info;
+// === PROTOTYPES ===
+ int VFS_Init();
+char *VFS_GetTruePath(char *Path);
+void VFS_GetMemPath(char *Dest, void *Base, Uint Length);
+tVFS_Driver *VFS_GetFSByName(char *Name);
+ int VFS_AddDriver(tVFS_Driver *Info);
+void VFS_UpdateDriverFile();
+
+// === EXPORTS ===
+EXPORT(VFS_AddDriver);
+
// === GLOBALS ===
tVFS_Node NULLNode = {0};
-static int siDriverListLock = 0;
+tSpinlock siDriverListLock = 0;
tVFS_Driver *gVFS_Drivers = NULL;
+char *gsVFS_DriverFile = NULL;
+ int giVFS_DriverFileID = 0;
+
+char *gsVFS_MountFile = NULL;
+ int giVFS_MountFileID = 0;
// === CODE ===
/**
// Core Drivers
gVFS_Drivers = &gRootFS_Info;
gVFS_Drivers->Next = &gDevFS_Info;
+ VFS_UpdateDriverFile();
+
+ // Register with SysFS
+ giVFS_MountFileID = SysFS_RegisterFile("VFS/Mounts", NULL, 0);
+ giVFS_DriverFileID = SysFS_RegisterFile("VFS/Drivers", NULL, 0);
VFS_Mount("root", "/", "rootfs", "");
VFS_MkDir("/Devices");
}
/**
- * \fn void VFS_GetMemPath(void *Base, Uint Length, char *Dest)
+ * \fn void VFS_GetMemPath(char *Dest, void *Base, Uint Length)
* \brief Create a VFS memory pointer path
*/
-void VFS_GetMemPath(void *Base, Uint Length, char *Dest)
+void VFS_GetMemPath(char *Dest, void *Base, Uint Length)
{
Log("VFS_GetMemPath: (Base=%p, Length=0x%x, Dest=%p)", Base, Length, Dest);
Dest[0] = '$';
itoa( &Dest[1], (Uint)Base, 16, BITS/4, '0' );
Dest[BITS/4+1] = ':';
itoa( &Dest[BITS/4+2], Length, 16, BITS/4, '0' );
+ Dest[BITS/2+2] = '\0';
Log("VFS_GetMemPath: Dest = \"%s\"", Dest);
}
gVFS_Drivers = Info;
RELEASE( &siDriverListLock );
+ VFS_UpdateDriverFile();
+
return 0;
}
+
+/**
+ * \fn void VFS_UpdateDriverFile()
+ * \brief Updates the driver list file
+ */
+void VFS_UpdateDriverFile()
+{
+ tVFS_Driver *drv;
+ int len = 0;
+ char *buf;
+
+ // Format:
+ // <name>\n
+ for( drv = gVFS_Drivers; drv; drv = drv->Next )
+ {
+ len += 1 + strlen(drv->Name);
+ }
+ buf = malloc(len+1);
+ len = 0;
+ for( drv = gVFS_Drivers; drv; drv = drv->Next )
+ {
+ strcpy( &buf[len], drv->Name );
+ len += strlen(drv->Name);
+ buf[len++] = '\n';
+ }
+ buf[len] = '\0';
+
+ SysFS_UpdateFile( giVFS_DriverFileID, buf, len );
+ if(gsVFS_DriverFile) free(gsVFS_DriverFile);
+ gsVFS_DriverFile = buf;
+}