X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fvfs%2Ffs%2Froot.c;h=ee2e72cbf7fc37d60d511c19d4cd30104cefe447;hb=015f48988e0ff398409d71dfc692005ab439490a;hp=9fa1732b9391f054dc84ba20b57fb055590cdb59;hpb=48743e39650eb1ef988380e9d95f27fd40d3a9ce;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/vfs/fs/root.c b/KernelLand/Kernel/vfs/fs/root.c index 9fa1732b..ee2e72cb 100644 --- a/KernelLand/Kernel/vfs/fs/root.c +++ b/KernelLand/Kernel/vfs/fs/root.c @@ -1,6 +1,11 @@ /* - * AcessMicro VFS + * Acess2 Kernel + * - By John Hodge (thePowersGang) + * + * vfs/fs/root.c * - Root Filesystem Driver + * + * TODO: Restrict to directories only */ #define DEBUG 0 #include @@ -13,16 +18,17 @@ // === PROTOTYPES === tVFS_Node *Root_InitDevice(const char *Device, const char **Options); - int Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags); -tVFS_Node *Root_FindDir(tVFS_Node *Node, const char *Name); -char *Root_ReadDir(tVFS_Node *Node, int Pos); -Uint64 Root_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer); -Uint64 Root_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buffer); +tVFS_Node *Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags); +tVFS_Node *Root_FindDir(tVFS_Node *Node, const char *Name, Uint Flags); + int Root_ReadDir(tVFS_Node *Node, int Pos, char Dest[FILENAME_MAX]); +size_t Root_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags); +size_t Root_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer, Uint Flags); tRamFS_File *Root_int_AllocFile(void); // === GLOBALS === tVFS_Driver gRootFS_Info = { - "rootfs", 0, Root_InitDevice, NULL, NULL + .Name = "rootfs", + .InitDevice = Root_InitDevice }; tRamFS_File RootFS_Files[MAX_FILES]; tVFS_ACL RootFS_DirACLs[3] = { @@ -60,7 +66,9 @@ tVFS_Node *Root_InitDevice(const char *Device, const char **Options) // Create Root Node root = &RootFS_Files[0]; - + + root->Name[0] = '/'; + root->Name[1] = '\0'; root->Node.ImplPtr = root; root->Node.CTime @@ -69,6 +77,7 @@ tVFS_Node *Root_InitDevice(const char *Device, const char **Options) root->Node.NumACLs = 3; root->Node.ACLs = RootFS_DirACLs; + root->Node.Flags = VFS_FFLAG_DIRECTORY; root->Node.Type = &gRootFS_DirType; return &root->Node; @@ -78,24 +87,27 @@ tVFS_Node *Root_InitDevice(const char *Device, const char **Options) * \fn int Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags) * \brief Create an entry in the root directory */ -int Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags) +tVFS_Node *Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags) { tRamFS_File *parent = Node->ImplPtr; tRamFS_File *child; - tRamFS_File *prev = (tRamFS_File *) &parent->Data.FirstChild; + tRamFS_File *prev = NULL; ENTER("pNode sName xFlags", Node, Name, Flags); - LOG("%i > %i", strlen(Name)+1, sizeof(child->Name)); - if(strlen(Name) + 1 > sizeof(child->Name)) - LEAVE_RET('i', 0); + LOG("Sanity check name length - %i > %i", strlen(Name)+1, sizeof(child->Name)); + if(strlen(Name) + 1 > sizeof(child->Name)) { + errno = EINVAL; + LEAVE_RET('n', NULL); + } // Find last child, while we're at it, check for duplication for( child = parent->Data.FirstChild; child; prev = child, child = child->Next ) { if(strcmp(child->Name, Name) == 0) { - LEAVE('i', 0); - return 0; + LOG("Duplicate"); + errno = EEXIST; + LEAVE_RET('n', NULL); } } @@ -103,6 +115,7 @@ int Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags) memset(child, 0, sizeof(tRamFS_File)); strcpy(child->Name, Name); + LOG("Name = '%s'", child->Name); child->Parent = parent; child->Next = NULL; @@ -125,31 +138,40 @@ int Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags) child->Node.Type = &gRootFS_FileType; } - prev->Next = child; + // Append! + if( prev ) + prev->Next = child; + else + parent->Data.FirstChild = child; parent->Node.Size ++; - LEAVE('i', 1); - return 1; + LEAVE('n', &child->Node); + return &child->Node; } /** * \fn tVFS_Node *Root_FindDir(tVFS_Node *Node, const char *Name) * \brief Find an entry in the filesystem */ -tVFS_Node *Root_FindDir(tVFS_Node *Node, const char *Name) +tVFS_Node *Root_FindDir(tVFS_Node *Node, const char *Name, Uint Flags) { tRamFS_File *parent = Node->ImplPtr; tRamFS_File *child = parent->Data.FirstChild; - //Log("Root_FindDir: (Node=%p, Name='%s')", Node, Name); + ENTER("pNode sName", Node, Name); - for(;child;child = child->Next) + for( child = parent->Data.FirstChild; child; child = child->Next ) { - //Log(" Root_FindDir: strcmp('%s', '%s')", child->Node.Name, Name); - if(strcmp(child->Name, Name) == 0) return &child->Node; + LOG("child->Name = '%s'", child->Name); + if(strcmp(child->Name, Name) == 0) + { + LEAVE('p', &child->Node); + return &child->Node; + } } + LEAVE('n'); return NULL; } @@ -157,52 +179,48 @@ tVFS_Node *Root_FindDir(tVFS_Node *Node, const char *Name) * \fn char *Root_ReadDir(tVFS_Node *Node, int Pos) * \brief Get an entry from the filesystem */ -char *Root_ReadDir(tVFS_Node *Node, int Pos) +int Root_ReadDir(tVFS_Node *Node, int Pos, char Dest[FILENAME_MAX]) { tRamFS_File *parent = Node->ImplPtr; tRamFS_File *child = parent->Data.FirstChild; for( ; child && Pos--; child = child->Next ) ; - if(child) return strdup(child->Name); + if(child) { + strncpy(Dest, child->Name, FILENAME_MAX); + return 0; + } - return NULL; + return -ENOENT; } /** - * \fn Uint64 Root_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) * \brief Read from a file in the root directory */ -Uint64 Root_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) +size_t Root_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags) { tRamFS_File *file = Node->ImplPtr; - ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer); - - if(Offset > Node->Size) { - LEAVE('i', 0); - return 0; - } - if(Length > Node->Size) Length = Node->Size; + if(Offset > Node->Size) return 0; + + if(Length > Node->Size) + Length = Node->Size; if(Offset+Length > Node->Size) Length = Node->Size - Offset; memcpy(Buffer, file->Data.Bytes+Offset, Length); - LOG("Buffer = '%.*s'", (int)Length, Buffer); - - LEAVE('i', Length); + return Length; } /** - * \fn Uint64 Root_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) * \brief Write to a file in the root directory */ -Uint64 Root_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buffer) +size_t Root_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer, Uint Flags) { tRamFS_File *file = Node->ImplPtr; - ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer); + ENTER("pNode XOffset xLength pBuffer", Node, Offset, Length, Buffer); if(Offset > Node->Size) { LEAVE('i', -1);