//! Marks a VFS handle as belonging to the kernel
#define VFS_KERNEL_FLAG 0x40000000
+//! Architectual maximum number of file descriptors
+#define MAX_FILE_DESCS 128
+
/**
* \brief VFS_Seek directions
*/
tVFS_ACL acls[]; //!< ACL buffer (size is passed in the \a MaxACLs argument to VFS_FInfo)
} tFInfo;
+/**
+ * \brief fd_set for select()
+ */
+typedef struct
+{
+ Uint16 flags[MAX_FILE_DESCS/16];
+} fd_set;
+
+#define FD_CLR(fd, fdsetp) ((fdsetp)->flags[(fd)/16]&=~(1<<((fd)%16)))
+#define FD_SET(fd, fdsetp) ((fdsetp)->flags[(fd)/16]|=~(1<<((fd)%16)))
+#define FD_ISSET(fd, fdsetp) ((fdsetp)->flags[(fd)/16]&(1<<((fd)%16)))
+
// === FUNCTIONS ===
/**
* \brief Initialise the VFS (called by system.c)
* \return Boolean Success
*/
-extern int VFS_Init();
+extern int VFS_Init(void);
/**
* \brief Open a file
* \param Mode Flags defining how to open the file
* \return VFS Handle (an integer) or -1 if an error occured
*/
-extern int VFS_Open(char *Path, Uint Mode);
+extern int VFS_Open(const char *Path, Uint Mode);
/**
* \brief Close a currently open file
* \param FD Handle returned by ::VFS_Open
* \brief Change the location of the current file pointer
* \param FD File handle returned by ::VFS_Open
* \param Offset Offset within the file to go to
- * \param Direction A direction from ::eVFS_SeekDirs
+ * \param Whence A direction from ::eVFS_SeekDirs
* \return Boolean success
*/
-extern int VFS_Seek(int FD, Sint64 Offset, int Direction);
+extern int VFS_Seek(int FD, Sint64 Offset, int Whence);
/**
* \brief Returns the current file pointer
* \param FD File handle returned by ::VFS_Open
* \param Buffer Source of written data
* \return Number of bytes written
*/
-extern Uint64 VFS_Write(int FD, Uint64 Length, void *Buffer);
+extern Uint64 VFS_Write(int FD, Uint64 Length, const void *Buffer);
/**
* \brief Reads from a specific offset in the file
* \param Buffer Source of written data
* \return Number of bytes written
*/
-extern Uint64 VFS_WriteAt(int FD, Uint64 Offset, Uint64 Length, void *Buffer);
+extern Uint64 VFS_WriteAt(int FD, Uint64 Offset, Uint64 Length, const void *Buffer);
/**
* \brief Sends an IOCtl request to the driver
* \param Path File path (may contain symlinks, relative elements etc.)
* \return Absolute path with no symlinks
*/
-extern char *VFS_GetTruePath(char *Path);
+extern char *VFS_GetTruePath(const char *Path);
/**
* \brief Mounts a filesystem
* \param Options Options string to pass the driver
* \return 1 on succes, -1 on error
*/
-extern int VFS_Mount(char *Device, char *MountPoint, char *Filesystem, char *Options);
+extern int VFS_Mount(const char *Device, const char *MountPoint, const char *Filesystem, const char *Options);
/**
* \brief Create a new directory
* \param Path Path to new directory (absolute or relative)
* \return Boolean success
* \note The parent of the directory must exist
*/
-extern int VFS_MkDir(char *Path);
+extern int VFS_MkDir(const char *Path);
/**
* \brief Create a symbolic link
* \param Name Name of the symbolic link
* \param Link File the symlink points to
* \return Boolean success (\a Link is not tested for existence)
*/
-extern int VFS_Symlink(char *Name, char *Link);
+extern int VFS_Symlink(const char *Name, const char *Link);
/**
* \brief Read from a directory
* \param FD File handle returned by ::VFS_Open
* \param Mode Open mode
* \return File handle (same as returned from VFS_Open)
*/
-extern int VFS_OpenChild(Uint *Errno, int FD, char *Name, Uint Mode);
+extern int VFS_OpenChild(Uint *Errno, int FD, const char *Name, Uint Mode);
+
+/**
+ * \brief Wait for an aciton on a file descriptor
+ * \param MaxHandle Maximum set handle in \a *Handles
+ * \param ReadHandles Handles to wait for data on
+ * \param WriteHandles Handles to wait to write to
+ * \param ErrHandles Handle to wait for errors on
+ * \param Timeout Timeout for select() (if null, there is no timeout), if zero select() is non blocking
+ * \param IsKernel Use kernel handles as opposed to user handles
+ * \return Number of handles that actioned
+ */
+extern int VFS_Select(int MaxHandle, fd_set *ReadHandles, fd_set *WriteHandles, fd_set *ErrHandles, tTime *Timeout, BOOL IsKernel);
#endif