X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fvfs%2Ffs%2Froot.c;h=a12d1542e7b7021592049830a08aae49b92d0d82;hb=ae3a0bf446529bfb50eb91a0fb90b72140d9f2ed;hp=d9660419f969467799c80b417fae52baba062f34;hpb=6a945643557084578509e149c84cf5dde3c59c3c;p=tpg%2Facess2.git diff --git a/Kernel/vfs/fs/root.c b/Kernel/vfs/fs/root.c index d9660419..a12d1542 100644 --- a/Kernel/vfs/fs/root.c +++ b/Kernel/vfs/fs/root.c @@ -2,15 +2,17 @@ * AcessMicro VFS * - Root Filesystem Driver */ +#define DEBUG 0 #include #include #include // === CONSTANTS === #define MAX_FILES 64 +#define MAX_FILE_SIZE 1024 // === PROTOTYPES === -tVFS_Node *Root_InitDevice(char *Device, char **Options); +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); @@ -36,10 +38,9 @@ tVFS_ACL RootFS_FileACLs[3] = { // === CODE === /** - * \fn tVFS_Node *Root_InitDevice(char *Device, char **Options) * \brief Initialise the root filesystem */ -tVFS_Node *Root_InitDevice(char *Device, char **Options) +tVFS_Node *Root_InitDevice(const char *Device, const char **Options) { tRamFS_File *root; if(strcmp(Device, "root") != 0) { @@ -73,13 +74,17 @@ tVFS_Node *Root_InitDevice(char *Device, char **Options) int Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags) { tRamFS_File *parent = Node->ImplPtr; - tRamFS_File *child = parent->Data.FirstChild; + tRamFS_File *child; tRamFS_File *prev = (tRamFS_File *) &parent->Data.FirstChild; 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); + // Find last child, while we're at it, check for duplication - for( ; child; prev = child, child = child->Next ) + for( child = parent->Data.FirstChild; child; prev = child, child = child->Next ) { if(strcmp(child->Name, Name) == 0) { LEAVE('i', 0); @@ -90,7 +95,6 @@ int Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags) child = Root_int_AllocFile(); memset(child, 0, sizeof(tRamFS_File)); - child->Name = malloc(strlen(Name)+1); strcpy(child->Name, Name); child->Parent = parent; @@ -156,7 +160,7 @@ char *Root_ReadDir(tVFS_Node *Node, int Pos) for( ; child && Pos--; child = child->Next ) ; - if(Pos) return strdup(child->Name); + if(child) return strdup(child->Name); return NULL; } @@ -168,15 +172,21 @@ char *Root_ReadDir(tVFS_Node *Node, int Pos) Uint64 Root_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) { tRamFS_File *file = Node->ImplPtr; + ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer); - if(Offset > Node->Size) return 0; - if(Length > Node->Size) return 0; + if(Offset > Node->Size) { + LEAVE('i', 0); + 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; } @@ -187,6 +197,20 @@ Uint64 Root_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) Uint64 Root_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) { tRamFS_File *file = Node->ImplPtr; + + ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer); + + if(Offset > Node->Size) { + LEAVE('i', -1); + return -1; + } + + if(Offset + Length > MAX_FILE_SIZE) + { + Length = MAX_FILE_SIZE - Offset; + } + + LOG("Buffer = '%.*s'", (int)Length, Buffer); // Check if buffer needs to be expanded if(Offset + Length > Node->Size) @@ -194,15 +218,18 @@ Uint64 Root_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) void *tmp = realloc( file->Data.Bytes, Offset + Length ); if(tmp == NULL) { Warning("Root_Write - Increasing buffer size failed"); + LEAVE('i', -1); return -1; } file->Data.Bytes = tmp; Node->Size = Offset + Length; - //LOG("Expanded buffer to %i bytes", Node->Size); + LOG("Expanded buffer to %i bytes", (int)Node->Size); } memcpy(file->Data.Bytes+Offset, Buffer, Length); + LOG("File - '%.*s'", Node->Size, file->Data.Bytes); + LEAVE('i', Length); return Length; } @@ -215,7 +242,7 @@ tRamFS_File *Root_int_AllocFile(void) int i; for( i = 0; i < MAX_FILES; i ++ ) { - if( RootFS_Files[i].Name == NULL ) + if( RootFS_Files[i].Name[0] == '\0' ) { return &RootFS_Files[i]; }