Update to tVFS_Node to support hard links
[tpg/acess2.git] / Modules / Filesystems / Ext2 / dir.c
index 0ab3ed3..1832ff9 100644 (file)
 
 
 // === 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);
@@ -57,7 +59,7 @@ char *Ext2_ReadDir(tVFS_Node *Node, int Pos)
                if(ofs >= disk->BlockSize) {
                        block ++;
                        if( ofs > disk->BlockSize ) {
-                               Warning("[EXT2] Directory Entry %i of inode %i extends over a block boundary, ignoring",
+                               Log_Warning("EXT2", "Directory Entry %i of inode %i extends over a block boundary, ignoring",
                                        entNum-1, Node->Inode);
                        }
                        ofs = 0;
@@ -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;
@@ -135,7 +136,7 @@ tVFS_Node *Ext2_FindDir(tVFS_Node *Node, char *Filename)
                if(ofs >= disk->BlockSize) {
                        block ++;
                        if( ofs > disk->BlockSize ) {
-                               Warning("[EXT2 ] Directory Entry %i of inode %i extends over a block boundary, ignoring",
+                               Log_Warning("EXT2", "Directory Entry %i of inode %i extends over a block boundary, ignoring",
                                        entNum-1, Node->Inode);
                        }
                        ofs = 0;
@@ -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 ----
@@ -220,7 +236,7 @@ tVFS_Node *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeID, char *Name)
        //if(Name[0] == '.')    retNode.Flags |= VFS_FFLAG_HIDDEN;
        
        // Set Timestamps
-       retNode.ATime = now();
+       retNode.ATime = inode.i_atime * 1000;
        retNode.MTime = inode.i_mtime * 1000;
        retNode.CTime = inode.i_ctime * 1000;
        

UCC git Repository :: git.ucc.asn.au