#define _VFS_H
#include <acess.h>
+#include <mutex.h>
/**
* \brief Thread list datatype for VFS_Select
*/
} tVFS_Node;
+/**
+ * \name tVFS_NodeType.FindDir Flags
+ * \brief
+ * \{
+ */
+//\! Attempt non-blocking IO
+#define VFS_IOFLAG_NOBLOCK 0x001
+/**
+ * \}
+ */
+
+/**
+ * \name tVFS_NodeType.FindDir Flags
+ * \brief
+ * \{
+ */
+//\! Call was triggered by VFS_Stat (as opposed to open)
+#define VFS_FDIRFLAG_STAT 0x001
+/**
+ * \}
+ */
+
/**
* \brief Functions for a specific node type
*/
* \param Buffer Destination for read data
* \return Number of bytes read
*/
- size_t (*Read)(struct sVFS_Node *Node, off_t Offset, size_t Length, void *Buffer);
+ size_t (*Read)(struct sVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags);
/**
* \brief Write to the file
* \param Node Pointer to this node
* \param Buffer Source of written data
* \return Number of bytes read
*/
- size_t (*Write)(struct sVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer);
+ size_t (*Write)(struct sVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer, Uint Flags);
/**
* \brief Map a region of a file into memory
* \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
+ * \note The node returned must be accessable until tVFS_NodeType::Close
* is called and ReferenceCount reaches zero.
*/
- struct sVFS_Node *(*FindDir)(struct sVFS_Node *Node, const char *Name);
+ struct sVFS_Node *(*FindDir)(struct sVFS_Node *Node, const char *Name, Uint Flags);
/**
* \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.
+ * \param Dest Destination for filename
+ * \return Zero on success, negative on error or +ve for ignore entry
*/
- char *(*ReadDir)(struct sVFS_Node *Node, int Pos);
+ int (*ReadDir)(struct sVFS_Node *Node, int Pos, char Dest[FILENAME_MAX]);
/**
* \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)
+ * \return Created node or NULL on error
*/
- int (*MkNod)(struct sVFS_Node *Node, const char *Name, Uint Flags);
+ tVFS_Node *(*MkNod)(struct sVFS_Node *Node, const char *Name, Uint Mode);
/**
* \brief Relink (Rename/Remove) a file/directory
* \param Node Pointer to this node (directory)
* \param NewName Name for the new link
* \param Child Node to create a new link to
- * \retur Zeron on success, non-zero on error (see errno.h)
+ * \return Zero on success, non-zero on error (see errno.h)
*/
int (*Link)(struct sVFS_Node *Node, const char *NewName, struct sVFS_Node *Child);
* fast cleanup when a filesystem is unmounted.
* \{
*/
+
+typedef struct sInodeCache tInodeCache;
+
+typedef void (*tInode_CleanUpNode)(tVFS_Node *Node);
+
/**
* \fn int Inode_GetHandle(void)
* \brief Gets a unique handle to the Node Cache
* \return A unique handle for use for the rest of the Inode_* functions
*/
-extern int Inode_GetHandle(void);
+extern tInodeCache *Inode_GetHandle(tInode_CleanUpNode CleanUpNode);
/**
* \fn tVFS_Node *Inode_GetCache(int Handle, Uint64 Inode)
* \brief Gets an inode from the node cache
* \param Inode Value of the Inode field of the ::tVFS_Node you want
* \return A pointer to the cached node
*/
-extern tVFS_Node *Inode_GetCache(int Handle, Uint64 Inode);
+extern tVFS_Node *Inode_GetCache(tInodeCache *Handle, Uint64 Inode);
/**
* \fn tVFS_Node *Inode_CacheNode(int Handle, tVFS_Node *Node)
* \brief Caches a node in the Node Cache
* \param Node A pointer to the node to be cached (a copy is taken)
* \return A pointer to the node in the node cache
*/
-extern tVFS_Node *Inode_CacheNode(int Handle, tVFS_Node *Node);
+extern tVFS_Node *Inode_CacheNode(tInodeCache *Handle, tVFS_Node *Node);
+extern tVFS_Node *Inode_CacheNodeEx(tInodeCache *Handle, tVFS_Node *Node, size_t Size);
/**
* \fn int Inode_UncacheNode(int Handle, Uint64 Inode)
* \brief Dereferences (and removes if needed) a node from the cache
* \param Inode Value of the Inode field of the ::tVFS_Node you want to remove
* \return -1: Error (not present), 0: Not freed, 1: Freed
*/
-extern int Inode_UncacheNode(int Handle, Uint64 Inode);
+extern int Inode_UncacheNode(tInodeCache *Handle, Uint64 Inode);
/**
* \fn void Inode_ClearCache(int Handle)
* \brief Clears the cache for a handle
* \param Handle A handle returned by Inode_GetHandle()
*/
-extern void Inode_ClearCache(int Handle);
+extern void Inode_ClearCache(tInodeCache *Handle);
/**
* \}