X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fvfs%2Fmain.c;h=cd04680db8f4aeee53db873fb78909004f7441a9;hb=1529dadb6c2170bf9899fbde46d06a3d9a392b52;hp=bfa1fc1c0a6edf7c37bfd681f1b7c49187bc2fe5;hpb=8bc40333b1401d7616b225945fee53d972c2f418;p=tpg%2Facess2.git diff --git a/Kernel/vfs/main.c b/Kernel/vfs/main.c index bfa1fc1c..cd04680d 100644 --- a/Kernel/vfs/main.c +++ b/Kernel/vfs/main.c @@ -2,7 +2,8 @@ * Acess 2 * Virtual File System */ -#include +#include +#include #include "vfs.h" #include "vfs_int.h" #include "vfs_ext.h" @@ -11,23 +12,47 @@ extern tVFS_Driver gRootFS_Info; extern tVFS_Driver gDevFS_Info; +// === PROTOTYPES === + int VFS_Init(void); +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(void); + +// === 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 === /** - * \fn int VFS_Init() + * \fn int VFS_Init(void) * \brief Initialises the VFS for use by the kernel and user */ -int VFS_Init() +int VFS_Init(void) { // Core Drivers gVFS_Drivers = &gRootFS_Info; gVFS_Drivers->Next = &gDevFS_Info; + VFS_UpdateDriverFile(); - VFS_Mount("root", "/", "rootfs", ""); + // Register with SysFS + giVFS_MountFileID = SysFS_RegisterFile("VFS/Mounts", NULL, 0); + giVFS_DriverFileID = SysFS_RegisterFile("VFS/Drivers", NULL, 0); + + if( VFS_Mount("root", "/", "rootfs", "") != 0 ) { + Panic("Unable to mount root (Where the **** is rootfs?)"); + return -1; + } VFS_MkDir("/Devices"); VFS_MkDir("/Mount"); VFS_Mount("dev", "/Devices", "devfs", ""); @@ -43,9 +68,12 @@ int VFS_Init() char *VFS_GetTruePath(char *Path) { tVFS_Node *node; - char *ret; + char *ret, *tmp; - node = VFS_ParsePath(Path, &ret); + tmp = VFS_GetAbsPath(Path); + if(tmp == NULL) return NULL; + node = VFS_ParsePath(tmp, &ret); + free(tmp); if(!node) return NULL; if(node->Close) node->Close(node); @@ -54,18 +82,16 @@ char *VFS_GetTruePath(char *Path) } /** - * \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' ); - - Log("VFS_GetMemPath: Dest = \"%s\"", Dest); + Dest[BITS/2+2] = '\0'; } /** @@ -78,6 +104,7 @@ tVFS_Driver *VFS_GetFSByName(char *Name) for(;drv;drv=drv->Next) { +// Log("strcmp('%s' (%p), '%s') == 0?", drv->Name, drv->Name, Name); if(strcmp(drv->Name, Name) == 0) return drv; } @@ -96,5 +123,38 @@ int VFS_AddDriver(tVFS_Driver *Info) gVFS_Drivers = Info; RELEASE( &siDriverListLock ); + VFS_UpdateDriverFile(); + return 0; } + +/** + * \fn void VFS_UpdateDriverFile(void) + * \brief Updates the driver list file + */ +void VFS_UpdateDriverFile(void) +{ + tVFS_Driver *drv; + int len = 0; + char *buf; + + // Format: + // \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; +}