From 3c496a30a8c22105fcf21089dce53809e5201205 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Mon, 24 May 2010 13:32:21 +0800 Subject: [PATCH] Update to tVFS_Node to support hard links --- Kernel/include/vfs.h | 11 +++++++++- Modules/Filesystems/Ext2/dir.c | 40 ++++++++++++++++++++++++---------- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/Kernel/include/vfs.h b/Kernel/include/vfs.h index e3a61d43..ab0bd35b 100644 --- a/Kernel/include/vfs.h +++ b/Kernel/include/vfs.h @@ -224,7 +224,7 @@ typedef struct sVFS_Node * \param Node Pointer to this node * \param Name Name of the new child * \param Flags Flags to apply to the new child (directory or symlink) - * \return Boolean success + * \return Zero on Success, non-zero on error (see errno.h) */ int (*MkNod)(struct sVFS_Node *Node, char *Name, Uint Flags); @@ -236,6 +236,15 @@ typedef struct sVFS_Node * \return Zero on Success, non-zero on error (see errno.h) */ int (*Relink)(struct sVFS_Node *Node, char *OldName, char *NewName); + + /** + * \brief Link a node to a name + * \param Node Pointer to this node (directory) + * \param Child Node to create a new link to + * \param NewName Name for the new link + * \return Zeron on success, non-zero on error (see errno.h) + */ + int (*Link)(struct sVFS_Node *Node, struct sVFS_Node *Child, char *NewName); /** * } diff --git a/Modules/Filesystems/Ext2/dir.c b/Modules/Filesystems/Ext2/dir.c index 86092b0f..1832ff97 100644 --- a/Modules/Filesystems/Ext2/dir.c +++ b/Modules/Filesystems/Ext2/dir.c @@ -13,16 +13,17 @@ // === PROTOTYPES === -char *Ext2_ReadDir(tVFS_Node *Node, int Pos); +char *Ext2_ReadDir(tVFS_Node *Node, int Pos); tVFS_Node *Ext2_FindDir(tVFS_Node *Node, char *FileName); - int Ext2_MkNod(tVFS_Node *Node, char *Name, Uint Flags); + int Ext2_MkNod(tVFS_Node *Node, char *Name, Uint Flags); tVFS_Node *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeId, char *Name); // === CODE === /** - \fn char *Ext2_ReadDir(tVFS_Node *Node, int Pos) - \brief Reads a directory entry -*/ + * \brief Reads a directory entry + * \param Node Directory node + * \param Pos Position of desired element + */ char *Ext2_ReadDir(tVFS_Node *Node, int Pos) { tExt2_Inode inode; @@ -47,6 +48,7 @@ char *Ext2_ReadDir(tVFS_Node *Node, int Pos) // Get First Block // - Do this ourselves as it is a simple operation Base = inode.i_block[0] * disk->BlockSize; + // Scan directory while(Pos -- && size > 0) { VFS_ReadAt( disk->FD, Base+ofs, sizeof(tExt2_DirEnt), &dirent); @@ -93,12 +95,11 @@ char *Ext2_ReadDir(tVFS_Node *Node, int Pos) } /** - \fn tVFS_Node *Ext2_FindDir(tVFS_Node *node, char *filename) - \brief Gets information about a file - \param node vfs node - Parent Node - \param filename String - Name of file - \return VFS Node of file -*/ + * \brief Gets information about a file + * \param Node Parent Node + * \param Filename Name of wanted file + * \return VFS Node of file + */ tVFS_Node *Ext2_FindDir(tVFS_Node *Node, char *Filename) { tExt2_Disk *disk = Node->ImplPtr; @@ -152,7 +153,22 @@ tVFS_Node *Ext2_FindDir(tVFS_Node *Node, char *Filename) */ int Ext2_MkNod(tVFS_Node *Parent, char *Name, Uint Flags) { - return 0; + tVFS_Node *child; + + child = Ext2_int_AllocateNode(Parent, Flags); + return Ext2_Link(Parent, child, Name); +} + +/** + * \brief Links an existing node to a new name + * \param Parent Parent (directory) node + * \param Node Node to link + * \param Name New name for the node + * \return Boolean Failure - See ::tVFS_Node.Link for info + */ +int Ext2_Link(tVFS_Node *Parent, tVFS_Node *Node, char *Name) +{ + return 1; } // ---- INTERNAL FUNCTIONS ---- -- 2.20.1