Bugfixing
[tpg/acess2.git] / Kernel / include / vfs.h
index 7850600..057f7f4 100644 (file)
 /**
  * \file vfs.h
  * \brief Acess VFS Layer
+ * 
+ * The Acess Virtual File System (VFS) provides abstraction of multiple
+ * physical filesystems, network storage and devices (both hardware and
+ * virtual) to the user.
+ * 
+ * The core of the VFS is the concept of a \ref tVFS_Node "VFS Node".
+ * A VFS Node represents a "file" in the VFS tree, this can be any sort
+ * of file (an ordinary file, a directory, a symbolic link or a device)
+ * depending on the bits set in the \ref tVFS_Node.Flags Flags field.
+ * - For more information see "VFS Node Flags"
  */
 #ifndef _VFS_H
 #define _VFS_H
 
-#include <common.h>
+#include <acess.h>
 
-//! \name ACL Permissions
-//! \{
 /**
- * \brief Readable
- */
-#define VFS_PERM_READ  0x00000001
-/**
- * \brief Writeable
- */
-#define VFS_PERM_WRITE 0x00000002
-/**
- * \brief Append allowed
+ * \name tVFS_Node Flags
+ * \brief Flag values for tVFS_Node.Flags
+ * \{
  */
-#define VFS_PERM_APPEND        0x00000004
+//! \todo Is this still needed
+#define VFS_FFLAG_READONLY     0x01    //!< Readonly File
 /**
- * \brief Executable
+ * \brief Directory Flag
+ * 
+ * This flag marks the tVFS_Node as describing a directory, and says
+ * that the tVFS_Node.FindDir, tVFS_Node.ReadDir, tVFS_Node.MkNod and
+ * tVFS_Node.Relink function pointers are valid.
+ * For a directory the tVFS_Node.Size field contains the number of files
+ * within the directory, or -1 for undetermined.
  */
-#define VFS_PERM_EXECUTE       0x00000008
+#define VFS_FFLAG_DIRECTORY    0x02
 /**
- * \brief All permissions granted
+ * \brief Symbolic Link Flag
+ * 
+ * Marks a file as a symbolic link
  */
-#define VFS_PERM_ALL   0x7FFFFFFF      // Mask for permissions
+#define VFS_FFLAG_SYMLINK      0x04
 /**
- * \brief Denies instead of granting permissions
- * \note Denials take precedence
+ * \brief Set User ID Flag
+ * 
+ * Allows an executable file to change it's executing user to the file's
+ * owner.
+ * In the case of a directory, it means that all immediate children will
+ * inherit the UID of the parent.
  */
-#define VFS_PERM_DENY  0x80000000      // Inverts permissions
-//! \}
-
+#define VFS_FFLAG_SETUID       0x08
 /**
- * \name VFS Node Flags
- * \{
+ * \brief Set Group ID Flag
+ * 
+ * Allows an executable file to change it's executing group to the file's
+ * owning group.
+ * In the case of a directory, it means that all immediate children will
+ * inherit the GID of the parent.
  */
-#define VFS_FFLAG_READONLY     0x01    //!< Read-only file
-#define VFS_FFLAG_DIRECTORY    0x02    //!< Directory
-#define VFS_FFLAG_SYMLINK      0x04    //!< Symbolic Link
+#define VFS_FFLAG_SETGID       0x10
 /**
  * \}
  */
 
 /**
- * \brief VFS Node
+ * \brief Represents a node (file or directory) in the VFS tree
+ * 
+ * This structure provides the VFS with the functions required to read/write
+ * the file (or directory) that it represents.
  */
-typedef struct sVFS_Node {     
-       Uint64  Inode;  //!< Inode ID
+typedef struct sVFS_Node
+{
+       /**
+        * \name Identifiers
+        * \brief Fields used by the driver to identify what data this node
+        *        corresponds to.
+        * \{
+        */
+       Uint64  Inode;  //!< Inode ID (Essentially another ImplInt)
        Uint    ImplInt;        //!< Implementation Usable Integer
        void    *ImplPtr;       //!< Implementation Usable Pointer
+       /**
+        * \}
+        */
        
+       /**
+        * \name Node State
+        * \brief Stores the misc information about the node
+        * \{
+        */
         int    ReferenceCount; //!< Number of times the node is used
        
        Uint64  Size;   //!< File Size
        
        Uint32  Flags;  //!< File Flags
        
+       /**
+        * \brief Pointer to cached data (FS Specific)
+        * \note The Inode_* functions will free when the node is uncached
+        *       this if needed
+        */
+       void    *Data;
+       /**
+        * \}
+        */
+       
+       /**
+        * \name Times
+        * \{
+        */
        Sint64  ATime;  //!< Last Accessed Time
        Sint64  MTime;  //!< Last Modified Time
        Sint64  CTime;  //!< Creation Time
+       /**
+        * \}
+        */
        
-       Uint    UID;    //!< Owning User
-       Uint    GID;    //!< Owning Group
+       /**
+        * \name Access controll
+        * \{
+        */
+       tUID    UID;    //!< ID of Owning User
+       tGID    GID;    //!< ID of Owning Group
        
         int    NumACLs;        //!< Number of ACL entries
-       tVFS_ACL        *ACLs;  //!< ACL Entries
+       tVFS_ACL        *ACLs;  //!< Access Controll List pointer
+       /**
+        * \}
+        */
        
-       //! Reference the node
+       /**
+        * \name Common Functions
+        * \brief Functions that are used no matter the value of .Flags
+        * \{
+        */
+       /**
+        * \brief Reference the node
+        * \param Node Pointer to this node
+        */
        void    (*Reference)(struct sVFS_Node *Node);
-       //! Close (dereference) the node
+       /**
+        * \brief Close (dereference) the node
+        * \param Node  Pointer to this node
+        * 
+        * Usually .Close is used to write any changes to the node back to
+        * the persistent storage.
+        */
        void    (*Close)(struct sVFS_Node *Node);
-       //! Send an IO Control
+       
+       /**
+        * \brief Send an IO Control
+        * \param Node  Pointer to this node
+        * \param Id    IOCtl call number
+        * \param Data  Pointer to data to pass to the driver
+        * \return Implementation defined
+        */
         int    (*IOCtl)(struct sVFS_Node *Node, int Id, void *Data);
        
-       //! \brief Read from the file
+       /**
+        * \}
+        */
+       
+       /**
+        * \name Buffer Functions
+        * \brief Functions for accessing a buffer-type file (normal file or
+        *        symbolic link)
+        * \{
+        */
+       
+       /**
+        * \brief Read from the file
+        * \param Node  Pointer to this node
+        * \param Offset        Byte offset in the file
+        * \param Length        Number of bytes to read
+        * \param Buffer        Destination for read data
+        * \return Number of bytes read
+        */
        Uint64  (*Read)(struct sVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer);
-       //! \brief Write to the file
+       /**
+        * \brief Write to the file
+        * \param Node  Pointer to this node
+        * \param Offset        Byte offser in the file
+        * \param Length        Number of bytes to write
+        * \param Buffer        Source of written data
+        * \return Number of bytes read
+        */
        Uint64  (*Write)(struct sVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer);
        
-       //! \brief Find an directory entry by name
-       //! \note The node returned must be accessable until ::tVFS_Node.Close is called
+       /**
+        * \}
+        */
+       
+       /**
+        * \name Directory Functions
+        * \{
+        */
+       /**
+        * \brief Find an directory entry by name
+        * \param Node  Pointer to this node
+        * \param Name  Name of the file wanted
+        * \return Pointer to the requested node or NULL if it cannot be found
+        * \note The node returned must be accessable until ::tVFS_Node.Close
+        *       is called and ReferenceCount reaches zero.
+        */
        struct sVFS_Node        *(*FindDir)(struct sVFS_Node *Node, char *Name);
        
-       //! \brief Read from a directory
-       //! \note MUST return a heap address
+       /**
+        * \brief Read from a directory
+        * \param Node  Pointer to this node
+        * \param Pos   Offset in the directory
+        * \return Pointer to the name of the item on the heap (will be freed
+        *         by the caller). If the directory end has been reached, NULL
+        *         will be returned.
+        *         If an item is required to be skipped either &::NULLNode,
+        *         ::VFS_SKIP or ::VFS_SKIPN(0...1023) will be returned.
+        */
        char    *(*ReadDir)(struct sVFS_Node *Node, int Pos);
        
-       //! \brief Create a node in a directory
+       /**
+        * \brief Create a node in a directory
+        * \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 Zero on Success, non-zero on error (see errno.h)
+        */
         int    (*MkNod)(struct sVFS_Node *Node, char *Name, Uint Flags);
        
-       //! \brief Relink (Rename/Remove) a file/directory
+       /**
+        * \brief Relink (Rename/Remove) a file/directory
+        * \param Node  Pointer to this node
+        * \param OldName       Name of the item to move/delete
+        * \param NewName       New name (or NULL if unlinking is wanted)
+        * \return Zero on Success, non-zero on error (see errno.h)
+        */
         int    (*Relink)(struct sVFS_Node *Node, char *OldName, char *NewName);
        
-       //!< \todo Complete
+       /**
+        * \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);
+        
+        /**
+         * \}
+         */
 } tVFS_Node;
 
 /**
@@ -132,7 +280,8 @@ typedef struct sVFS_Driver
 
 extern tVFS_Node       NULLNode;       //!< NULL VFS Node (Ignored/Skipped)
 /**
- * \name Simple ACLs to aid writing drivers
+ * \name Static ACLs
+ * \brief Simple ACLs to aid writing drivers
  * \{
  */
 extern tVFS_ACL        gVFS_ACL_EveryoneRWX;   //!< Everyone Read/Write/Execute
@@ -167,8 +316,15 @@ extern tVFS_Driver *VFS_GetFSByName(char *Name);
 extern tVFS_ACL        *VFS_UnixToAcessACL(Uint Mode, Uint Owner, Uint Group);
 
 // --- Node Cache --
-//! \name Node Cache
-//! \{
+/**
+ * \name Node Cache
+ * \brief Functions to allow a node to be cached in memory by the VFS
+ * 
+ * These functions store a node for the driver, to prevent it from having
+ * to re-generate the node on each call to FindDir. It also allows for
+ * fast cleanup when a filesystem is unmounted.
+ * \{
+ */
 /**
  * \fn int Inode_GetHandle()
  * \brief Gets a unique handle to the Node Cache
@@ -192,7 +348,7 @@ extern tVFS_Node    *Inode_GetCache(int Handle, Uint64 Inode);
  */
 extern tVFS_Node       *Inode_CacheNode(int Handle, tVFS_Node *Node);
 /**
- * \fn void Inode_UncacheNode(int Handle, Uint64 Inode)
+ * \fn int Inode_UncacheNode(int Handle, Uint64 Inode)
  * \brief Dereferences (and removes if needed) a node from the cache
  * \param Handle       A handle returned by Inode_GetHandle()
  * \param Inode        Value of the Inode field of the ::tVFS_Node you want to remove
@@ -205,6 +361,8 @@ extern void Inode_UncacheNode(int Handle, Uint64 Inode);
  */
 extern void    Inode_ClearCache(int Handle);
 
-//! \}
+/**
+ * \}
+ */
 
 #endif

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