X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fvfs%2Ffs%2Froot.c;h=56858617d61733c586588730be1b06f98fb37393;hb=a88ba0c5436470438a63241b126f926968ef558f;hp=4416750c954e5b3ff9ac206e07e3415da2f92b7a;hpb=4842e2d6740bcb81da4e94019285bfd2c45425b8;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/vfs/fs/root.c b/KernelLand/Kernel/vfs/fs/root.c index 4416750c..56858617 100644 --- a/KernelLand/Kernel/vfs/fs/root.c +++ b/KernelLand/Kernel/vfs/fs/root.c @@ -13,16 +13,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_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); + 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); size_t Root_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer); 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] = { @@ -71,6 +72,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; @@ -80,7 +82,7 @@ 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; @@ -89,16 +91,18 @@ int Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags) ENTER("pNode sName xFlags", Node, Name, Flags); LOG("Sanity check name length - %i > %i", strlen(Name)+1, sizeof(child->Name)); - if(strlen(Name) + 1 > sizeof(child->Name)) - LEAVE_RET('i', 0); + 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) { LOG("Duplicate"); - LEAVE('i', 0); - return 0; + errno = EEXIST; + LEAVE_RET('n', NULL); } } @@ -137,8 +141,8 @@ int Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags) parent->Node.Size ++; - LEAVE('i', 1); - return 1; + LEAVE('n', &child->Node); + return &child->Node; } /** @@ -170,16 +174,19 @@ 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; } /**